2

我们可以有一个只有取消按钮的消息框吗?如果有,有什么提示吗?是否有内置的 api 方法仅获取带有取消按钮的消息框/

如何创建自定义模式对话框?任何链接?

4

3 回答 3

6

您可以根据需要使用线程本地 CBT 挂钩SetWindowsHookEx()来自定义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()orTaskDialogIndirect()代替MessageBox(). 任务对话框更加灵活,包括让您指定对话框上的按钮,甚至使用自定义按钮的能力。因此,您可以轻松地显示仅取消对话框,而无需使用任何挂钩,例如:

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

TASKDIALOGCONFIG TaskConfig = {0};
TaskConfig.cbSize = sizeof(TaskConfig);
TaskConfig.dwCommonButtons = TDCBF_CANCEL_BUTTON;
...
TaskDialogIndirect(&TaskConfig, &iResult, ...);
于 2012-09-24T18:36:32.593 回答
1

对于只显示通知的消息框,我相信使用“确定”框是惯例。取消似乎有点多余?

但我想如果你想这样做,你可以通过定义自己的消息框对象并使用“取消”作为文本属性自己指定按钮来做到这一点。

C++ 或任何其他语言都具有用于定义消息框的内置函数,只需再次“取消”即可,因为“OK”是惯例。

于 2012-09-24T17:56:48.850 回答
0

我认为 MessabeBox 不可能。您可以简单地创建自己的对话框并添加一个取消按钮。

你也可以看看这个链接

消息框

它可能会解决您的问题

于 2012-09-24T18:03:09.800 回答