DialogBox 未正确绘制对话框

DialogBox not drawing the dialog correctly

所以我有以下保存在 .rc 文件中的对话框模板:

DIALOG_TEST DIALOG 0, 0, 186, 95
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "Ms Shell Dlg"
{
    PUSHBUTTON      "Cancel", IDD_CAN, 129, 24, 50, 14, 0, WS_EX_LEFT
    DEFPUSHBUTTON   "OK", IDD_OK, 129, 7, 50, 14, 0, WS_EX_LEFT
}

我按以下方式使用 DialogBox 调用它:

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    HWND button;
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
            button = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON",
                                     "Test",
                                     WS_VISIBLE | WS_CHILD | WS_BORDER,
                                     200, 40, 200, 30,
                                     hwnd, (HMENU) 1, NULL, NULL);
            break;

        case WM_COMMAND:
           switch(LOWORD(wParam))
            {
                case 1:
                    DialogBox(GetModuleHandle(NULL), TEXT("DIALOG_TEST"),
                              hwnd, AboutDlgProc);
                    break;
            }
            break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

除了由于某些原因未正确绘制 window 外,一切正常:

好像对话框被绘制了两次,我做错了什么?

至于对话框的 Window 程序,它唯一做的就是在按下 "Cancel" 时关闭 window。

    BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT message,
    WPARAM wParam, LPARAM lParam)
{

   switch (message)
    {

     case WM_COMMAND:

        switch(HIWORD(wParam))
        {

            case BN_CLICKED:

                switch (LOWORD (wParam))
                {
                    case IDD_CAN:
                    EndDialog(hDlg, TRUE);
                    return TRUE ;
                }

                break;
        }

        break;
    }
}

一个按钮可以在一个WM_COMMAND消息中发送多种通知,所以如果你想只在按钮被点击时创建对话框,你需要检查以确保通知代码(在 HIWORD(wParam) 中)是 BN_CLICKED. See WM_COMMAND documentation.