在MFC(Microsoft Foundation Classes)编程中,经常需要自定义控件以满足特定的用户界面需求。本文将介绍如何创建一个继承自CEdit的类,该类可以显示一个图标和一个按钮,类似于iTunes的查找编辑控件。这种控件在需要同时使用编辑控件和按钮的场景中非常有用,例如浏览文件、文件夹或进行查找操作等。
这是在CodeProject上的第一篇文章。多年来,一直在使用CodeProject上的优秀代码。非常感谢所有分享优秀代码的人。希望能在未来写更多的文章。请不要犹豫对代码提出评论。渴望学习和提高。
感谢Johan Rosengren的文章《带有图标的编辑框》。他在这篇文章中揭示了WM_SETFONT消息对编辑控件的影响。
在对话框中创建一个编辑控件,并添加一个类型为CEditWithButton的变量。如果已经添加了一个类型为CEdit的变量,那么只需要将CEdit重命名为CEditWithButton,并在对话框头文件的顶部包含"EditWithButton.h"。
#include "EditWithButton.h"
class CFindEditDlg : public CDialog
{
protected:
CEditWithButton m_editFind;
};
该类接受两个位图。第一个位图在编辑控件为空时作为背景绘制。第二个位图在编辑控件包含一些文本时作为背景绘制。第一个位图是不带按钮的背景。第二个位图是带有按钮的背景。
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);
为了设置编辑控件的编辑区域,内部使用CEdit::SetRect方法。这个方法只有在编辑控件设置了多行样式(ES_MULTILINE)时才能成功。如果在对话框中插入编辑控件,请确保使用资源编辑器将多行属性设置为True。同时确保ES_WANTRETURN设置为False。
如果是动态创建编辑控件,必须显式设置编辑控件的字体,以使其完美工作。以下是一个示例代码:
// 从父控件(通常是对话框)获取字体并设置到
// 编辑控件
m_editFind.SetFont(GetFont());