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.
所以我有以下保存在 .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.