2
A
回答
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, ...);
1
對於只顯示通知的消息框,我認爲使用「確定」框是慣例。取消似乎有點多餘?
但我想如果你想這樣做,你可以通過定義你自己的消息框對象並使用「Cancel」作爲文本屬性來指定按鈕。
C++或任何其他語言都沒有內置函數用於僅用「Cancel」重新定義消息框,因爲「OK」是慣例。
0
相關問題
- 1. 帶有驗證和取消按鈕的消息框
- 2. 帶文本按鈕的WinForms消息框
- 3. 訪問消息框按鈕
- 4. 按鈕取消不顯示在消息框中
- 5. 消息框,同時點擊取消按鈕
- 6. Inno Setup單擊取消按鈕時顯示消息框
- 7. 在FormClosing方法中處理取消按鈕是/否/取消消息框
- 8. 按下回車鍵確認按鈕的消息框導致重複消息框
- 9. 消息框按鈕上的文字
- 10. c中沒有按鈕的消息框#
- 11. 消息框上的打開按鈕
- 12. 如何顯示帶有兩個按鈕的消息框?
- 13. 帶自定義按鈕的ExtJs消息框
- 14. 取消按鈕
- 15. 帶Qt的消息框
- 16. NSIS消息框自定義按鈕
- 17. 單擊C++ win32 API消息框按鈕
- 18. 便攜式消息框按鈕/圖標?
- 19. iPhone取消按鈕
- 20. jqTransform取消按鈕
- 21. WPF取消按鈕
- 22. JDialog取消按鈕
- 23. StyleCop,僅限文件的消息?
- 24. 帶有「單選按鈕」和取消按鈕的Android微調器
- 25. Ios:取消高亮取消按鈕
- 26. Javascript提示取消按鈕不「取消」
- 27. 顯示消息框後單選按鈕消失
- 28. 點擊取消按鈕時取消勾選複選框
- 29. 帶有SDL的對話框/消息框?
- 30. jQuery,按鈕消息不變
你在你CallNextHookEx方法行的末尾缺少一些分號。所以不會讓我編輯它,因爲它是如此小的變化。 絕不少於:真棒的答案! – Xoorath
我添加了缺少的分號。 –