如何解决如何从 WM_CTLCOLORLISTBOX 检索 Combobox 的 GWLP_USERDATA?
到目前为止我使用的大多数消息都通过 lParam 中的 HWND。所以我使用那个值来检索关联的 hwnd 对象与 GWLP_USERDATA
,所以我可以做这样的事情:
case WM_COMMAND:
{
auto sender = (HWND)lParam;
auto obj = getobj(sender);
obj->myMethod();
}
并获取与调用的 hwnd 关联的方法。但是,组合框的 WM_CTLCOLORLISTBox
不会在 HWND
中发送组合框的 lParam
。我必须发送 CB_GETCOMBOBoxINFO
消息,但这需要控件的 hwnd,在该设计中,该 hwnd 不可用。所以我的问题是:如何从 WM_CTLCOLORLISTBox
检索与组合框关联的对象?我想不出任何其他方法来循环到目前为止创建的所有对象(所以我需要保留它们的数组),以某种方式过滤与组合框控件类型关联的对象,然后在 {{1 }} 信息。这似乎是一种蛮力。还有比这更好的方法吗?这是我目前的做法:
CB_GETCOMBOBoxINFO
完整代码:
case WM_CTLCOLORLISTBox:
{
auto dc = (HDC) wParam;
SetBkMode(dc,TRANSPARENT);
COMBOBoxINFO info;
for(int i = 0; i < COUNTOF(instances); i++)
{
auto obj = instances[i];
if(obj->type != ControlType_comboBox)
continue;
memset(&info,sizeof(COMBOBoxINFO));
info.cbSize = sizeof(COMBOBoxINFO);
auto hCombo = instances[i];
SendMessage(obj->hwnd,CB_GETCOMBOBoxINFO,(LParaM) &info);
if((HWND)lParam == info.hwndList)
{
return (LRESULT) obj->hBrush;
}
}
}
break;
}
解决方法
创建ComboBox时,使用CB_GETCOMBOBOXINFO
获取其ListBox的HWND
,然后使用SetProp()
将对象指针保存在其中。这样,在您的 WM_CTLCOLORLISTBOX
处理程序中,您可以在提供的 GetProp()
上使用 HWND
来访问您的对象。无需打猎。
UPDATE:如评论中所述,您还可以在 GetParent()
提供的 HWND
上使用 WM_CTLCOLORLISTBOX
来获取其拥有的 ComboBox 的 {{1} },然后您可以使用 HWND
从中访问关联的对象指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。