控件中的控件:带图标的编辑框






4.50/5 (11投票s)
将控件添加到 CEdit,带图标的编辑框
引言
虽然将控件添加到其他控件可能是人们普遍期望的任务,但带图标的编辑框可能不是最令人兴奋或有用的类。 然而,它带来了一些有趣的挑战,而实用性当然不是深入研究 MFC 中控件子类的唯一标准。
CIconEdit
是一个小的 CEdit
派生类,带有一个附加的小图标,它利用多行编辑框的编辑矩形,而不是通常处理非客户区的方式。
使用代码
将 cpp 文件和 h 文件包含到项目中。 CIconEdit
既可以通过调用 Create
动态实例化,也可以通过对话框模板实例化。 在后一种情况下,可以使用类向导创建控制变量并将其绑定到控件,或者可以使用 SubclassDlgItem
。 使用 SetIcon
(使用 HICON
或资源 ID) 设置要显示的图标。
CIconEdit
使用多行编辑框的编辑矩形。 基本上,它修改编辑矩形,以添加一个足够宽的左边距以容纳一个小图标。 CIconWnd
(一个 CStatic
派生类)的一个实例用于绘制图标。 可以通过调用 CIconEdit::SetIcon
,使用 HICON
句柄设置所需的图标,或者使用 UINT
资源 ID。 如果使用资源 ID,则图标由 CIconEdit
销毁,否则调用者将不得不销毁它。
该类重写了 PreSubclassWindow
。 此调用检查编辑框样式。 如果未设置 ES_MULTILINE
,SetRect
将无法工作,因此该函数将 ASSERT
。 可悲的是,在创建控件后无法添加此样式 - 而且现在就销毁并重新创建它还为时过早。 然后建立编辑矩形。 通过调用 GetSystemMetrics
检索小图标的宽度,并提取、更新当前编辑矩形,然后将其设置回控件。
一旦通过调用两个 SetIcon
之一设置了图标,就会创建图标窗口。
CIconWnd
是一个非常简单的 CStatic
派生类,处理 WM_PAINT
并在那里通过调用 ::DrawIconEx
绘制图标。 如果需要,图标将缩放到系统小图标大小。
关注点
实例化此控件,对 CEdit
执行一些常见操作,显示了一个可以理解但令人讨厌的怪癖 - 编辑矩形被重置。 由于矩形是 CEdit
的绝对值(RTF 控件可以使用偏移量),因此无论如何都必须处理 WM_SIZE
。 更令人惊讶的是,WM_SETFONT
也杀死了编辑矩形。 因此,CIconEdit
处理 WM_SIZE
和 WM_SETFONT
。 由于 SetFont
不是虚拟的,因此将必须处理消息本身。
在这种情况下,使用单独的控件来显示图标似乎有点复杂,为什么不直接在非客户区绘图处理中绘制它呢? 嗯,如果我需要一个小图标控件(我怀疑),我现在有了一个,并且编辑控件和图标在代码上已完全分离。
但更令人兴奋的含义是可以使用编辑矩形将其他控件和/或视觉效果放入编辑框、好友按钮、行号等。 而且由于编辑矩形不仅被普通的编辑框使用 - RTF 控件也有一个 - 因此有可能以这种方式添加标尺等。
历史
15/6 2004
在活动爆发中,这篇文章终于更新了,这要归功于 David Pritchard 的反馈。 我使用 GetSysColor(COLOR_WINDOW)
获取系统背景色,以在图标后面清除背景,并且使用 HICON
参数的 SetIcon
现在也将创建图标控件... *脸红了*