在 RichEdit 视图中自定义通用查找/替换对话框






4.50/5 (3投票s)
本文解释了如何在 RichEdit 视图中自定义标准的查找/替换对话框。
引言
本文解释了如何在 RichEdit 视图中自定义标准的查找/替换对话框。对于编辑视图或任何其他具有细微变化的通用视图,其逻辑是相同的。自定义查找/替换对话框涉及修改 Windows 通用查找/替换对话框模板,该模板允许您添加任何新控件或删除现有控件。请注意,不应删除原始查找/替换对话框模板中的任何控件,而是可以禁用或隐藏那些不需要的控件!
查找/替换通用对话框自定义
自定义查找/替换通用对话框涉及以下步骤
步骤 1
将查找/替换对话框模板从通用对话框的 .RC 复制到应用程序的 .RC 文件。该对话框模板位于文件 include\findtext.dlg 中
第二步
对复制的对话框模板进行任何必要的更改,并再次注意,不应删除原始查找/替换对话框模板中的任何控件,而是可以禁用或隐藏那些不需要的控件。
本文随附的演示应用程序演示了以下内容
如何隐藏控件?
方向(向上/向下)控件被隐藏
如何添加新控件?
添加了新控件 "[ ] 循环查找"
如何更改其属性?
对话框的默认字体已更改
步骤 3
使用 Classwizard 为我们的新查找/替换模板添加一个 C++ 类(例如,CMyFindDlg
)。从基类 CDialog
派生这个新类。然后将新建类的头文件和实现文件中所有对 CDialog
的引用更改为 CFindReplaceDialog
。
/////////////////////////////////////////////////////////////////// // CMyFindDlg dialog class CMyFindDlg : public CFindReplaceDialog { // Construction public: CMyFindDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CMyFindDlg) enum { IDD = IDD_MYFINDDLG }; // NOTE: the ClassWizard will add data members here //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyFindDlg) protected: // DDX/DDV support virtual void DoDataExchange(CDataExchange* pDX); //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(CMyFindDlg) afx_msg void OnCheck1(); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
步骤 4
更改 CFindReplaceDialog
的构造函数,它与 CDialog
的构造函数不同。
//////////////////////////////////////////////////////////////////// // CMyFindDlg dialog CMyFindDlg::CMyFindDlg(CWnd* pParent /*=NULL*/) : CFindReplaceDialog() { //{{AFX_DATA_INIT(CMyFindDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT }
步骤 5
为我们的查找创建一个新的菜单项和一个工具栏按钮,并为命令消息添加一个处理函数(例如,OnMyFind
)。创建查找对话框时,我们可以隐藏不需要的控件。
//////////////////////////////////////////////////////////////////// // CMyFindView message handlers void CMyFindView::OnMyFind() { m_pMyFindDialog= new CMyFindDlg(); m_pMyFindDialog->m_fr.lpTemplateName=MAKEINTRESOURCE(IDD_MYFINDDLG); m_pMyFindDialog->Create(TRUE,NULL,NULL, FR_ENABLETEMPLATE|FR_HIDEUPDOWN,this); m_pMyFindDialog->SetActiveWindow(); m_pMyFindDialog->ShowWindow(TRUE); // TODO: Add your command handler code here }
其中 m_pMyFindDialog
定义在 MyFindView.h 中
CMyFindDlg* m_pMyFindDialog;
步骤 6
当查找/替换对话框打开时,用户可以编辑或键入搜索字符串,更改控件的复选标记或按下任何按钮。因此,我们应该处理这些请求并采取必要的措施。实际上,CFindReplaceDialog
将消息发送给其父窗口,并且您必须在调用 RegisterWindowMessage
函数时指定 FINDMSGSTRING
控件,以获取由 FindReplace 对话框发送的消息的标识符。还要为消息处理程序添加一个 ON_REGISTER_MESSAGE
条目。
static UINT FindReplaceDialogMessage =
::RegisterWindowMessage(FINDMSGSTRING);
ON_REGISTERED_MESSAGE(FindReplaceDialogMessage, OnFindReplaceMessage)
这是查找/替换对话框消息处理程序函数
LRESULT CMyFindView::OnFindReplaceMessage(WPARAM wParam, LPARAM lParam) { CFindReplaceDialog* pFindReplace = CFindReplaceDialog::GetNotifier(lParam); ASSERT(pFindReplace != NULL); if (pFindReplace->IsTerminating()) { pFindReplace = NULL; } else if (pFindReplace->FindNext()) { if(FindText(pFindReplace->GetFindString(),FALSE,FALSE)) AdjustDialogPosition(pFindReplace); else TextNotFound(pFindReplace->GetFindString()); } return 0; }
结论
本文的目的是演示如何在 MFC 应用程序中自定义标准的查找/替换对话框以及如何处理查找/替换对话框消息。本文还附带了一个带有源文件的示例应用程序。