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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (3投票s)

2001年1月7日

GPL3
viewsIcon

108476

downloadIcon

1673

本文解释了如何在 RichEdit 视图中自定义标准的查找/替换对话框。

Sample Image - CustomFind.gif

引言

本文解释了如何在 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 应用程序中自定义标准的查找/替换对话框以及如何处理查找/替换对话框消息。本文还附带了一个带有源文件的示例应用程序。

© . All rights reserved.