2012-09-24 35 views
2

我們可以只有一個帶取消按鈕的消息框嗎?如果是這樣,任何提示?是否有內置的API方法來獲取只有取消按鈕的消息箱/僅限帶取消按鈕的消息框

如何創建自定義模態對話框?任何鏈接?

回答

6

您可以通過SetWindowsHookEx()使用線程局部CBT鉤子來定製MessageBox()對話框不過你想要的。

舉例來說,你可以改變「確定」按鈕上的文字說「取消」,而不是,如:

HHOOK hHook = NULL; 

LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode < 0) 
     return CallNextHookEx(hHook, nCode, wParam, lParam); 

    if (nCode == HCBT_ACTIVATE) 
    { 
     HWND hWnd = reinterpret_cast<HWND>(wParam); 
     SetWindowText(GetDlgItem(hWnd, IDOK), TEXT("Cancel")); 
     return 0; 
    } 

    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

{ 
    ... 
    hHook = SetWindowsHookEx(WH_CBT, reinterpret_cast<HOOKPROC>(&CBTHookProc), NULL, GetCurrentThreadId()); 
    int iResult = MessageBox(..., MB_OK); 
    if (iResult == IDOK) iResult = IDCANCEL; 
    UnhookWindowsHookEx(hHook); 
    ... 
} 

或者你可以隱藏標準「確定」按鈕,讓對話仍在使用其原生 「取消」 按鈕:

HHOOK hHook = NULL; 

LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode < 0) 
     return CallNextHookEx(hHook, nCode, wParam, lParam); 

    if (nCode == HCBT_ACTIVATE) 
    { 
     HWND hWnd = reinterpret_cast<HWND>(wParam); 
     ShowWindow(GetDlgItem(hWnd, IDOK), SW_HIDE); 
     // optionally reposition the IDCANCEL child window as well.... 
     return 0; 
    } 

    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

{ 
    ... 
    hHook = SetWindowsHookEx(WH_CBT, reinterpret_cast<HOOKPROC>(&CBTHookProc), NULL, GetCurrentThreadId()); 
    int iResult = MessageBox(..., MB_OKCANCEL); 
    UnhookWindowsHookEx(hHook); 
    ... 
} 

更新:在Vista和更高版本,可以(也應該)使用TaskDialog()TaskDialogIndirect()代替MessageBox()。任務對話框更加靈活,包括讓您指定對話框上的哪些按鈕的功能,甚至可以使用自定義按鈕。所以,你可以很容易地在不使用任何鉤可言,如顯示取消,只有對話:

TaskDialog(..., TDCBF_CANCEL_BUTTON, ..., &iResult); 

TASKDIALOGCONFIG TaskConfig = {0}; 
TaskConfig.cbSize = sizeof(TaskConfig); 
TaskConfig.dwCommonButtons = TDCBF_CANCEL_BUTTON; 
... 
TaskDialogIndirect(&TaskConfig, &iResult, ...); 
+0

你在你CallNextHookEx方法行的末尾缺少一些分號。所以不會讓我編輯它,因爲它是如此小的變化。 絕不少於:真棒的答案! – Xoorath

+1

我添加了缺少的分號。 –

1

對於只顯示通知的消息框,我認爲使用「確定」框是慣例。取消似乎有點多餘?

但我想如果你想這樣做,你可以通過定義你自己的消息框對象並使用「Cancel」作爲文本屬性來指定按鈕。

C++或任何其他語言都沒有內置函數用於僅用「Cancel」重新定義消息框,因爲「OK」是慣例。

0

我不認爲這是可能的與MessabeBox。您可以簡單地創建自己的對話框並添加一個取消按鈕。

您也可以看看這個鏈接

XMessageBox

它可能會解決你的問題