C++ BM_GETCHECK不工作
我有这样的代码:C++ BM_GETCHECK不工作,c++,winapi,C++,Winapi,我有这样的代码: In WM_CREATE hCheckBox = CreateWindowEx(0,"Button","Random text", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS| BS_AUTOCHECKBOX | BS_TEXT | WS_GROUP | WS_TABSTOP,150,323,300,20,hwnd,0,hInstance,0) ; In WM_COMMAND if ( SendMessage( hCh
In WM_CREATE
hCheckBox = CreateWindowEx(0,"Button","Random text", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS| BS_AUTOCHECKBOX | BS_TEXT | WS_GROUP | WS_TABSTOP,150,323,300,20,hwnd,0,hInstance,0) ;
In WM_COMMAND
if ( SendMessage( hCheckBox , BM_GETCHECK, (WPARAM) NULL, (LPARAM) NULL ) == BST_CHECKED )
MessageBox( 0, "Working", "Msg", 0 );
无论复选框是否选中,它都不会返回BST_checked。
试图使其在过去2小时内工作:(不完全清楚
hCheckBox
是否为本地自动变量。如果是,我可以向您保证,它不会在CreateWindow
启动时一直保持其值,直到收到WM_命令消息为止。请改用以下方法:
LRESULT chk = SendDlgItemMessage(hDlg, IDC_CHECKBOX_CTRL_ID, BM_GETCHECK, 0, 0);
其中,hDlg
是您的对话框或主窗口句柄,IDC\u CHECKBOX\u CTRL\u ID
是控件ID。为此,您需要将控件ID指定为创建调用的HMENU参数的非零值:
hCheckBox = CreateWindowEx(0,"Button","Random text", WS_CHILD | WS_VISIBLE |
WS_CLIPSIBLINGS| BS_AUTOCHECKBOX | BS_TEXT | WS_GROUP |
WS_TABSTOP,150,323,300,20,hwnd, IDC_CHECKBOX_CTRL_ID, hInstance,0);
如果不明显,请将IDC\u CHECKBOX\u CTRL\u ID定义为非零整数
编辑 假设控件设置正确,您应该能够在WndProc中处理此复选框的WM_命令,如下所示
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch (message)
{
case WM_CREATE:
CreateWindowExA(0,"Button","Random text", WS_CHILD | WS_VISIBLE |
WS_CLIPSIBLINGS| BS_AUTOCHECKBOX | BS_TEXT | WS_GROUP |
WS_TABSTOP,100,100,300,48, hWnd, (HMENU)IDC_CHECKBOX_CTRL_ID, hInst, 0);
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
if (wmId == IDC_CHECKBOX_CTRL_ID)
{
if (wmEvent == BN_CLICKED)
{
LRESULT chkState = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
if (chkState == BST_CHECKED)
MessageBoxA(hWnd, "Checkbox is checked!", "CheckBox", MB_OK);
}
break;
};
// fall-thru intentional
default:
return DefWindowProc(hWnd, message, wParam, lParam);
};
return 0;
}
我刚刚将其猛击到一个带有空白窗口的普通WIN32应用程序中。结果如下图所示:
不完全清楚
hCheckBox
是否为本地自动变量。如果是,我可以向您保证,从CreateWindow
触发到接收到WM_命令消息为止,它不会保持其值。请改用此选项:
LRESULT chk = SendDlgItemMessage(hDlg, IDC_CHECKBOX_CTRL_ID, BM_GETCHECK, 0, 0);
其中,hDlg
是您的对话框或主窗口句柄,IDC\u CHECKBOX\u CTRL\u ID
是控件ID。为此,您需要将控件ID指定为创建调用的HMENU参数的非零值:
hCheckBox = CreateWindowEx(0,"Button","Random text", WS_CHILD | WS_VISIBLE |
WS_CLIPSIBLINGS| BS_AUTOCHECKBOX | BS_TEXT | WS_GROUP |
WS_TABSTOP,150,323,300,20,hwnd, IDC_CHECKBOX_CTRL_ID, hInstance,0);
如果不明显,请将IDC\u CHECKBOX\u CTRL\u ID定义为非零整数
编辑 假设控件设置正确,您应该能够在WndProc中处理此复选框的WM_命令,如下所示
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch (message)
{
case WM_CREATE:
CreateWindowExA(0,"Button","Random text", WS_CHILD | WS_VISIBLE |
WS_CLIPSIBLINGS| BS_AUTOCHECKBOX | BS_TEXT | WS_GROUP |
WS_TABSTOP,100,100,300,48, hWnd, (HMENU)IDC_CHECKBOX_CTRL_ID, hInst, 0);
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
if (wmId == IDC_CHECKBOX_CTRL_ID)
{
if (wmEvent == BN_CLICKED)
{
LRESULT chkState = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
if (chkState == BST_CHECKED)
MessageBoxA(hWnd, "Checkbox is checked!", "CheckBox", MB_OK);
}
break;
};
// fall-thru intentional
default:
return DefWindowProc(hWnd, message, wParam, lParam);
};
return 0;
}
我刚刚将其猛击到一个带有空白窗口的普通WIN32应用程序中。结果如下图所示:
您发布的内容没有明显的问题,但是SendMessage()调用实际返回的是什么?什么是
WM_CREATE{…}WM_COMMAND{…}
应该是什么意思?@Herr the SendMessage()无论复选框的状态如何,都返回未选中的BST_。您发布的内容没有明显问题,但是SendMessage()调用实际返回的是什么?WM_CREATE{…}WM_COMMAND{…}应该是什么意思?@Herr the SendMessage()无论复选框的状态如何,都将返回未选中的BST_。我的代码是有效的,我只是匆忙键入它以显示调用的位置。不,hcheckbox不是本地的,它是在WM_CREATE中创建的,但变量是全局的。我尝试了SenddlGitemMessage,但它也不起作用。@StudentX是否在CreateWindo中设置了子控件idwEx
呼叫?是的,我设置了控制id@StudentX因为我看不到你的真实代码,所以我能做的就是向你展示我所知道的工作原理。在这个答案中,请参阅WndProc,了解在一个通用窗口上的实现,该窗口创建一个复选框,并抛出一个messagebox来响应复选状态。我正是这样做的。但是什么都没有。我在h复选框本身的按钮单击消息显示带有“选中”和“再次选中”的消息框;否则如果((HWND)lParam==hCheckBox){messagebox(0,“选中”,0,0);如果(SendMessage(hCheckBox,BM_GETCHECK,(WPARAM)NULL,(lParam)NULL==BST_checked)//选中复选框{MessageBox(0,“再次选中”,0,0);}我的代码是有效的,我只是匆匆键入它,以显示调用的位置。不,hcheckbox不是本地的,它是在WM_CREATE中创建的,但变量是全局的。我尝试了SenddlGitemMessage,但它也不起作用。@StudentX您在CreateWindowEx
调用中设置了子控件id吗?是的,我设置了控件id@StudentX既然我不能请参阅您的真实代码我能做的最好的事情就是向您展示我所知道的工作原理。请参阅此答案中的WndProc,了解在通用窗口上创建复选框的实现,并根据复选状态抛出messagebox。我正是这样做的。但什么都没有。我使用复选框本身的按钮单击messagebox进行了选中显示“已选中”和“再次选中”;else if((HWND)lParam==hCheckBox){MessageBox(0,“已选中”,0,0);if(SendMessage(hCheckBox,BM_GETCHECK,(WPARAM)NULL,(lParam)NULL)==BST_checked)//选中复选框{MessageBox(0,“再次选中”,0,0);}