我们可以只设置一个带取消按钮的消息框吗?如果有,任何提示?是否有内置的api方法只能获取带有取消按钮的消息框/
如何创建自定义模式对话框?任何链接?
答案 0 :(得分:5)
您可以通过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 :(得分:1)
对于仅显示通知的消息框,我认为使用“确定”框是常规的。取消似乎有点多余?
但我想如果你想这样做,可以通过定义自己的消息框对象并使用“取消”作为文本属性自己指定按钮来实现。
C ++或任何其他语言都有内置函数来定义消息框,只需再次“取消”,因为“OK”是惯例。
答案 2 :(得分:0)