作者:宗小胖 | 来源:互联网 | 2024-10-29 21:08
在原生的Win32C++应用程序中,我需要替换现有的复选框控件,以实现一个具有两个状态(开/关)的自定义绘制切换按钮。为此,我已经为复选框添加了`BS_OWNERDRAW`样式,并着手进行自定义绘制处理,以实现所需的视觉效果和交互功能。
我有一个原生的win32 c应用程序,其中有一个复选框.我想替换复选框并创建具有2个状态的ON / OFF切换按钮(就像复选框一样).我已将BS_OWNERDRAW样式添加到复选框并将其绘制到WM_DRAWITEM中的窗口.问题是,当我点击复选框时,我得到一条WM_COMMAND消息(就像没有BS_OWNERDRAW一样),但CHECKED状态不会自动改变.我是否必须实现此功能,或者我错过了什么?
处理单击复选框的代码:
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDC_CHECKBOX:
if(wmEvent == BN_CLICKED)
{
dwPos = SendMessage(checkBox, BM_GETCHECK, 0, 0);
if(dwPos == BST_CHECKED )
{
// do some stuff
} else if(dwPos == BST_UNCHECKED) {
// do some stuff
}
}
问题是每次我点击复选框BM_GETCHECK都会返回BST_UNCHECKED.如果我删除BS_OWNERDRAW它工作正常.
创建按钮/复选框的代码:
checkBox = CreateWindowEx(
0,
WC_BUTTON,
szBuffer,
WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_OWNERDRAW,
BUTTON_ON_OFF_X, BUTTON_ON_OFF_Y,
BUTTON_ON_OFF_WIDTH, BUTTON_ON_OFF_HEIGHT,
hWnd,
(HMENU)IDC_CHECKBOX,
hInst,
NULL
);
解决方法:
是.您需要从WM_COMMAND翻译并使用类似CheckDlgButton的内容切换内部检查状态.