65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (11投票s)

2004年3月10日

公共领域

3分钟阅读

viewsIcon

143054

downloadIcon

2930

将控件添加到 CEdit,带图标的编辑框

Sample Image - editwithicon.gif

引言

虽然将控件添加到其他控件可能是人们普遍期望的任务,但带图标的编辑框可能不是最令人兴奋或有用的类。 然而,它带来了一些有趣的挑战,而实用性当然不是深入研究 MFC 中控件子类的唯一标准。

CIconEdit 是一个小的 CEdit 派生类,带有一个附加的小图标,它利用多行编辑框的编辑矩形,而不是通常处理非客户区的方式。

使用代码

将 cpp 文件和 h 文件包含到项目中。 CIconEdit 既可以通过调用 Create 动态实例化,也可以通过对话框模板实例化。 在后一种情况下,可以使用类向导创建控制变量并将其绑定到控件,或者可以使用 SubclassDlgItem。 使用 SetIcon (使用 HICON 或资源 ID) 设置要显示的图标。

CIconEdit 使用多行编辑框的编辑矩形。 基本上,它修改编辑矩形,以添加一个足够宽的左边距以容纳一个小图标。 CIconWnd(一个 CStatic 派生类)的一个实例用于绘制图标。 可以通过调用 CIconEdit::SetIcon,使用 HICON 句柄设置所需的图标,或者使用 UINT 资源 ID。 如果使用资源 ID,则图标由 CIconEdit 销毁,否则调用者将不得不销毁它。

该类重写了 PreSubclassWindow。 此调用检查编辑框样式。 如果未设置 ES_MULTILINESetRect 将无法工作,因此该函数将 ASSERT。 可悲的是,在创建控件后无法添加此样式 - 而且现在就销毁并重新创建它还为时过早。 然后建立编辑矩形。 通过调用 GetSystemMetrics 检索小图标的宽度,并提取、更新当前编辑矩形,然后将其设置回控件。

一旦通过调用两个 SetIcon 之一设置了图标,就会创建图标窗口。

CIconWnd 是一个非常简单的 CStatic 派生类,处理 WM_PAINT 并在那里通过调用 ::DrawIconEx 绘制图标。 如果需要,图标将缩放到系统小图标大小。

关注点

实例化此控件,对 CEdit 执行一些常见操作,显示了一个可以理解但令人讨厌的怪癖 - 编辑矩形被重置。 由于矩形是 CEdit 的绝对值(RTF 控件可以使用偏移量),因此无论如何都必须处理 WM_SIZE。 更令人惊讶的是,WM_SETFONT 也杀死了编辑矩形。 因此,CIconEdit 处理 WM_SIZEWM_SETFONT。 由于 SetFont 不是虚拟的,因此将必须处理消息本身。

在这种情况下,使用单独的控件来显示图标似乎有点复杂,为什么不直接在非客户区绘图处理中绘制它呢? 嗯,如果我需要一个小图标控件(我怀疑),我现在有了一个,并且编辑控件和图标在代码上已完全分离。

但更令人兴奋的含义是可以使用编辑矩形将其他控件和/或视觉效果放入编辑框、好友按钮、行号等。 而且由于编辑矩形不仅被普通的编辑框使用 - RTF 控件也有一个 - 因此有可能以这种方式添加标尺等。

历史

15/6 2004

在活动爆发中,这篇文章终于更新了,这要归功于 David Pritchard 的反馈。 我使用 GetSysColor(COLOR_WINDOW) 获取系统背景色,以在图标后面清除背景,并且使用 HICON 参数的 SetIcon 现在也将创建图标控件... *脸红了*

© . All rights reserved.