【问题标题】:When should I return TRUE and when FALSE on DialogProc我什么时候应该在 DialogProc 上返回 TRUE 和 FALSE
【发布时间】:2021-09-04 23:39:54
【问题描述】:

我有另一个 SO 问题,那里的人帮助我解决了一个问题。我不明白 DialogProc 应该在每个 case 上返回什么。 DialogProc 返回 TRUE 是什么意思?它与 FALSE 相比如何?有什么区别?

MSDN 表示没有返回值。

INT_PTR CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_INITDIALOG:
    {
        wchar_t c0_txt[] = L"Title";

        LVCOLUMNW col{};
        col.mask = LVCF_TEXT | LVCF_WIDTH | LVIF_IMAGE;
        col.cx = 60;
        col.pszText = c0_txt;

        ListView_InsertColumn(GetDlgItem(hWnd, IDC_LIST1), 0, &col);

        return TRUE;
    }
    case WM_NCDESTROY:
        PostQuitMessage(0);
        return FALSE;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDOK:
        case IDCANCEL:
            DestroyWindow(hWnd);
            break;
        default:
            break;
        }
        break;
    case WM_SIZE:
    {
        const int width = LOWORD(lParam);
        const int height = HIWORD(lParam);

        // IDC_LIST1 will occupy the entire client area of its parent.
        // Adjust as needed.
        MoveWindow(GetDlgItem(hWnd, IDC_LIST1),
            0, 0, width, height, TRUE);

        return TRUE;
    }
    default:
        return FALSE;
    }

    return TRUE;
}

int WINAPI WinMain(
    _In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPSTR lpCmdLine,
    _In_ int nShowCmd
)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    HWND hWnd = CreateDialogParamW(hInstance, MAKEINTRESOURCEW(IDD_MAIN), nullptr, &DialogProc, 0);

    if (!hWnd)
    {
        MessageBoxW(nullptr, L"Dialog Creation Failed!", L"Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hWnd, nShowCmd);
    UpdateWindow(hWnd);

    MSG msg;
    while (GetMessageW(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }

    return msg.wParam;
}

【问题讨论】:

  • 你链接到的页面状态为Typically, the dialog box procedure should return TRUE if it processed the message, and FALSE if it did not. If the dialog box procedure returns FALSE, the dialog manager performs the default dialog operation in response to the message.你不清楚吗?
  • @AlanBirtles,哦,我因为某种原因错过了那个。但是,我还是不明白。已处理和未处理的消息有什么区别?
  • 如果您返回FALSE,那么在大多数情况下,消息会传递给DefDlgProc 进行处理(然后可能会将其传递给DefWindowProc)。如果您想为某些消息提供自己的行为而不是接受默认行为,请返回 TRUE 以告诉对话管理器您处理了该消息。

标签: c++ user-interface winapi


【解决方案1】:

基本思想是你有一个default: return FALSE;,而每个case: 返回TRUE。但是 Windows 不会读取您的代码。 Windows 甚至不需要你的代码用 C++ 编写,其他语言可能会以其他方式实现相同的想法。这就是文档描述行为的原因,而不是您应该如何实现它的原因。

【讨论】:

  • 啊,所以我的WM_COMMANDWM_NCDESTROY 也应该返回TRUE?
  • @nop:WM_COMMAND 有点奇怪。它有三个breaks,包括breakswitch 之后。最后一个break 突破switch (msg),然后你做return TRUE;。因此,WM_COMMAND 是您到达最终return TRUE 的唯一途径。但您似乎处理大多数WM_COMMANDs,因此在这些情况下应该返回FALSE
  • 哦,知道了,如果我处理所有方法,我会返回 TRUE。如果我不返回 FALSE。
  • @nop:这听起来还是有些不对劲。 “如果我处理所有方式” - 不。唯一的问题是:“我是否处理了这个特定的消息?”。这依赖于msg,但它依赖于wParamlParam。同样,Windows 不会查看您的源代码,它只会给您一个 msg, wParam, lParam 并查看结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2019-03-29
  • 1970-01-01
相关资源
最近更新 更多