确定控件类型

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) 获得的类原子并从现在开始比较原子.

【讨论】:

以上是关于确定控件类型的主要内容,如果未能解决你的问题,请参考以下文章

VS2010-自定义控件

Unity 自定义编辑器窗口输入控件,用于反射确定的类型

继承的控件不绘制

如何在vs2008 MFC中添加、删除成员变量

Delphi控件继承类

功能类控件