我正在编写Windows LISTBOX
通用控件的超级版本以添加额外功能。
标准控件将WM_CTLCOLORLISTBOX
消息发送到其父级,允许在运行时在适当的消息处理程序中指定其文本和背景颜色。但是WM_CTLCOLORLISTBOX
不会发送到控件本身,因此无法在内部进行封装和处理。
我试图解决的方案是根据控件的启用/禁用状态更改背景和文本颜色。将列表框背景留下相同阴影的标准行为,无论其状态如何,都看起来很丑陋,与我不一致。是否有另一种方法可以在封装中设置这些值,然后将所有其他绘制任务移交给基类窗口过程?
我想知道如何使用SetClassLongPtr()
。但是,这不仅不会解决文本颜色,而且如果我理解正确,它将改变当前存在的该类的所有控件的背景,而不是状态已更改的特定控件。
答案 0 :(得分:0)
答案应该是显而易见的 - 因为WM_CTLCOLORLISTBOX
被发送到父窗口,您必须继承父窗口以便接收消息。没有绕过那个。但是,一些包装器UI框架(如VCL)旨在将此类消息转发到随后生成的控件,因此控件可以处理自己的消息。但是,如果您没有使用包装器框架并且直接使用Win32,则必须自己处理父消息。有关子类化给定HWND的详细信息,请参阅MSDN: