MFC CEdit控件扩展:带图标和按钮的编辑框

MFC(Microsoft Foundation Classes)编程中,经常需要自定义控件以满足特定的用户界面需求。本文将介绍如何创建一个继承自CEdit的类,该类可以显示一个图标和一个按钮,类似于iTunes的查找编辑控件。这种控件在需要同时使用编辑控件和按钮的场景中非常有用,例如浏览文件、文件夹或进行查找操作等。

这是在CodeProject上的第一篇文章。多年来,一直在使用CodeProject上的优秀代码。非常感谢所有分享优秀代码的人。希望能在未来写更多的文章。请不要犹豫对代码提出评论。渴望学习和提高。

感谢Johan Rosengren的文章《带有图标的编辑框》。他在这篇文章中揭示了WM_SETFONT消息对编辑控件的影响。

1. 定义类

在对话框中创建一个编辑控件,并添加一个类型为CEditWithButton的变量。如果已经添加了一个类型为CEdit的变量,那么只需要将CEdit重命名为CEditWithButton,并在对话框头文件的顶部包含"EditWithButton.h"。

#include "EditWithButton.h" class CFindEditDlg : public CDialog { protected: CEditWithButton m_editFind; };

2. 使用类

该类接受两个位图。第一个位图在编辑控件为空时作为背景绘制。第二个位图在编辑控件包含一些文本时作为背景绘制。第一个位图是不带按钮的背景。第二个位图是带有按钮的背景。

m_editFind.SetBitmaps(IDB_BITMAP_EDITBACKGROUND_EMPTY, IDB_BITMAP_EDITBACKGROUND_FILLED);

接下来,需要设置编辑区域和按钮区域。这是因为只有编辑控件的一部分是可编辑的。左侧和右侧区域被图标(例子中是放大镜)和按钮(例子中是x按钮)覆盖。

// 编辑区域是矩形,不包括图标和按钮 CRect rcEditArea(20, 4, 125, 17); m_editFind.SetEditArea(rcEditArea); // 按钮区域用于确定鼠标按钮点击 CRect rcButtonArea(128, 3, 143, 18); m_editFind.SetButtonArea(rcButtonArea);

接下来,当用户点击按钮时,这个消息将被发送到所有者,以便它处理按钮点击事件。

// 按钮点击通知将被发送到的所有者窗口 m_editFind.SetOwner(this); // 将被发送到所有者窗口的消息 m_editFind.SetButtonClickedMessageId(WM_USER_EDITWITHBUTTON_CLICKED);

如果按钮始终存在(即使编辑控件没有文本),那么需要使用SetButtonExistsAlways方法将这个标志设置为TRUE。这使得类即使在编辑控件没有文本时也能发送按钮点击事件。

// 在例子中,将其设置为FALSE,因为将其用作查找编辑控件,当编辑控件为空时,按钮是隐藏的 m_editFind.SetButtonExistsAlways(FALSE);

3. 重点阅读(必读)

为了设置编辑控件的编辑区域,内部使用CEdit::SetRect方法。这个方法只有在编辑控件设置了多行样式(ES_MULTILINE)时才能成功。如果在对话框中插入编辑控件,请确保使用资源编辑器将多行属性设置为True。同时确保ES_WANTRETURN设置为False。

如果是动态创建编辑控件,必须显式设置编辑控件的字体,以使其完美工作。以下是一个示例代码:

// 从父控件(通常是对话框)获取字体并设置到 // 编辑控件 m_editFind.SetFont(GetFont());
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485