确定控件类型
Posted
技术标签:
【中文标题】确定控件类型【英文标题】:Determine control type 【发布时间】:2010-11-24 17:09:44 【问题描述】:我正在尝试使 Windows 对话框上的一些静态控件透明,但我在处理一条 Windows 消息时遇到了困难。
在绘制静态控件时,Windows 很乐意向我发送 WM_CTLCOLORSTATIC 消息,但此消息也会发送给只读和禁用的编辑控件。所以 - 只给控件一个 hwnd,我怎么知道它是什么类型的控件?
【问题讨论】:
【参考方案1】:如果您没有很多控件,请使用 GetDlgCtrlID() 获取控件的资源 ID。 使用该信息,您可以过滤掉任何您不想要的控件。
【讨论】:
不幸的是,这个对话框有数百个 :( 我确实想过将所有静态 ID 放在一个范围内并使用它,但我想我会先寻求替代方案。不过可能仍然使用 ID 范围。干杯。 您不需要使用 ID 范围 - 您可以为所有静态控件分配相同的 ID。我(例如)在我的对话框上为静态控件分配了一个自定义 ID:ID_STATIC_RED
- 当我处理 WM_CTLCOLORSTATIC
时,我检查了该控件并将文本颜色设置为红色,让我可以细粒度地控制什么静态得到什么颜色.【参考方案2】:
使用GetClassName 函数。 here 列出了一些预定义的类名称,例如 BUTTON
。另见How To Get a Window's Class Name and Other Window Attributes。
“类名”决定了它是什么“种类”的控件(更具体地说,类定义了窗口过程,它定义了控件的行为......或者如果控件已被子类化,则稍微复杂一些某人)。
【讨论】:
【参考方案3】:您可以致电GetClassName 即
// given controlHwnd passed to me
TCHAR controlClassName[128];
GetClassName(controlHwnd,controlClassName,128);
然后您必须根据字符串(即“Button”)进行一堆字符串比较 - 所以不是很好,但应该可以。
【讨论】:
【参考方案4】:作为一种优化,您可以先尝试使用GetClassName
找到您的第一个Static
控件并进行字符串比较,然后,一旦找到,存储使用GetClassLong(hWnd, GCW_ATOM)
获得的类原子并从现在开始比较原子.
【讨论】:
以上是关于确定控件类型的主要内容,如果未能解决你的问题,请参考以下文章