我们能否仅使用取消按钮显示消息框?如果是这样,有什么提示吗?是否有内置的api方法仅获取仅带有取消按钮的消息框/

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

最佳答案

您可以通过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()。任务对话框更加灵活,包括允许您指定对话框上的哪些按钮甚至使用自定义按钮的功能。因此,您可以轻松显示“仅取消”对话框,而根本不使用任何钩子(Hook),例如:
TaskDialog(..., TDCBF_CANCEL_BUTTON, ..., &iResult);
TASKDIALOGCONFIG TaskConfig = {0};
TaskConfig.cbSize = sizeof(TaskConfig);
TaskConfig.dwCommonButtons = TDCBF_CANCEL_BUTTON;
...
TaskDialogIndirect(&TaskConfig, &iResult, ...);

关于c++ - 仅带有取消按钮的消息框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12570201/

10-11 23:00
查看更多