我有一个资源文件 (.rc),其中包含以下内容
#include <windows.h>
#include "resource.h"
IDD_ABOUT DIALOG DISCARDABLE 0, 0, 500, 106
BEGIN
DEFPUSHBUTTON "&OK", IDOK, 174, 18, 50, 14
RADIOBUTTON "Radio 1", ID_RADIOBUTTON1, 226, 18, 55, 14
END
我的 C 文件包含以下内容
#include <windows.h>
#include "resource.h"
BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_RADIOBUTTON1:
{
MessageBox(hwnd, "RadioButton 1", "111", MB_OK);
SendMessage((HWND)lParam, (UINT) BM_SETCHECK, (WPARAM) BST_CHECKED,(LPARAM)NULL);
}
return TRUE;
break;
}
break;
default:
return FALSE;
}
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_ABOUT), NULL, AboutDlgProc);
}
在对话框打开后单击单选按钮一次,回调函数会重复接收相同的消息,该消息是一 strip 有 LOWORD(wParam) == ID_RADIOBUTTON1 的 WM_COMMAND。但如果在 MessageBox 之前调用 SendMessage,则不会发生错误。这有什么具体原因吗?
编辑
<小时/>但是,如果我用 printf 替换对 MessageBox 的调用,则不会发生错误,并且行为符合预期,并且仅生成单个输出实例。
我使用 gcc 和 Windres 来制作程序。
我的操作系统是 Windows Vista(tm) Home Premium 32 位 Service Pack 2
最佳答案
使用AUTORADIOBUTTON
(而不是RADIOBUTTON
)这将自动设置选择标记。例如:
IDD_ABOUT DIALOGEX 0, 0, 222, 257
STYLE DS_ABSALIGN | DS_SETFONT | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 9, "Segoe UI", 400, 0, 0x0
BEGIN
DEFPUSHBUTTON "&OK", IDOK, 174, 18, 50, 14
AUTORADIOBUTTON "Radio 1", ID_RADIOBUTTON1, 226, 18, 55, 14
END
您可以使用MessageBox
或其他模态窗口:
...
case ID_RADIOBUTTON1:
{
MessageBox...
}
对于RADIOBUTTON
,您必须自己设置选择标记。尽快执行此操作并立即返回 TRUE
。不要在以下位置之前或之后调用 MessageBox
:
case ID_RADIOBUTTON1:
SendMessage((HWND)lParam, BM_SETCHECK, !IsDlgButtonChecked(hwnd, ID_RADIOBUTTON1), 0);
return TRUE;
关于c - win32api函数的顺序导致回调函数接收相同的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36252504/