我有这样的代码:
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 );
Run Code Online (Sandbox Code Playgroud)
如果选中复选框并不重要,它永远不会返回BST_CHECKED.试着让它在最后2小时工作:(
是否hCheckBox是本地自动变量并不完全明显.如果是这样,我可以向您保证,从CreateWindow发生火灾到收到WM_COMMAND消息的时间,它没有保持其值.请改用:
LRESULT chk = SendDlgItemMessage(hDlg, IDC_CHECKBOX_CTRL_ID, BM_GETCHECK, 0, 0);
Run Code Online (Sandbox Code Playgroud)
hDlg您的对话框或主窗口在哪里处理,并且IDC_CHECKBOX_CTRL_ID是控件ID.为此,您需要将控制ID指定为create-call的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);
Run Code Online (Sandbox Code Playgroud)
如果不明显的话.将IDC_CHECKBOX_CTRL_ID定义为非零整数.
编辑
假设控件设置正确,您应该能够在WndProc中为此复选框处理WM_COMMAND,如下所示
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;
}
Run Code Online (Sandbox Code Playgroud)
我只是把它撞到了一个带有空白窗口的股票通用WIN32应用程序.结果如下图所示:

| 归档时间: |
|
| 查看次数: |
3248 次 |
| 最近记录: |