MFC使用CFindReplaceDialog 查找与替换

原创 2012年03月21日 18:47:08
 

查找和替换 对话框也是非模态对话框,所以创建过程和MFC下创建非模态对话框的过程有点类似.

先Create出一个窗口,设置好相关参数然后在显示出来使用就OK.

Create原型:
virtual BOOL Create(BOOL bFindDialogOnly,// TRUE for Find, FALSE for FindReplace
LPCTSTR lpszFindWhat,                         //默认被查找的字符串
LPCTSTR lpszReplaceWith = NULL,         //默认被查找替换的字符串
DWORD dwFlags = FR_DOWN,                //设置对话框里面的一些属性啦,下面说明了相关标志
CWnd* pParentWnd = NULL);               //对话框的父窗口

dwFlags相关标志说明(网上COPY来的):

        FR_DOWN 如果设置,对话框中的“向下查找”单选按钮被选中,如果没有设置,“向上查找”单选按钮被选中;

   FR_HIDEUPDOWN 不显示查找方向单选按钮;

   FR_HIDEMATCHCASE 不显示区分大小写复选按钮;

   FR_HIDEWHOLEWORD 不显示全字匹配复选按钮;
  
   FR_MATCHCASE 使区分大小写复选按钮处于选中状态;

   FR_WHOLEWORD 使全字匹配复选按钮处于选中状态;

   FR_NOMATCHCASE 使区分大小写复选按钮处于禁止(变灰)状态;

   FR_NOUPDOWN 使查找方向单选按钮处于禁止(变灰)状态;

   FR_NOWHOLEWORD 使全字匹配复选按钮处于禁止(变灰)状态;

   FR_SHOWHELP 在对话框中显示一个帮助按钮。

 

如下是创建一个查找窗口的实例:

CFindReplaceDialog *pFindDlg =new CFindReplaceDialog;   //由于是非模态对话框这里用new命令分配内存
if (!pFindDlg->Create(TRUE,_T("hyp's Knowledge Base"),NULL,FR_DOWN|FR_MATCHCASE|FR_WHOLEWORD ,this))//上面说明了
{
    return;
}
pFindDlg->ShowWindow(SW_SHOW);   //窗口创建完毕要显示出来
pFindDlg->SetActiveWindow();    //设置为活动窗口

如下是创建一个查找替换窗口的实例:

CFindReplaceDialog *pReplaceDlg=new CFindReplaceDialog;
if(!pReplaceDlg->Create(FALSE,_T("hyp"),_T("hyp's Knowledge Base"),FR_DOWN,this))
{
    return;
}
pReplaceDlg->ShowWindow(SW_SHOW);
pReplaceDlg->SetActiveWindow();

显示的出来的对话框还需要添加一些响应函数吧,我找了一下发现没有现成的消息响应-_-网上google了一下发现要自己添加我汗.

大体步骤是这样子的:

在你添加查找替换对话框的头文件的#pragma once下面加入

constint WM_FINDREPLACE = ::RegisterWindowMessage(FINDMSGSTRING);//将FINDMSGSTRING注册为WM_FINDREPLACE消息

并在头文件生成的消息映射函数

afx_msg LONG OnFindReplace(WPARAM wParam, LPARAM lParam);

在源文件里面将消息映射函数与WM_FINDREPLACE消息关联

BEGIN_MESSAGE_MAP(...)

...

ON_REGISTERED_MESSAGE(WM_FINDREPLACE, OnFindReplace)

...

END_MESSAGE_MAP()

接下来编写OnFindReplace函数就OK了

LONG ChypDlg::OnFindReplace( WPARAM wparam, LPARAM lparam )
{
    // TODO: 在此添加控件通知处理程序代码
    CFindReplaceDialog* pDlg = CFindReplaceDialog::GetNotifier(lparam);
    //具体查找替换代码就自己编写
    // pDlg->GetFindString();   该函数可以返回查找字符串
    // pDlg->GetReplaceString(); 该函数可以返回查找替换串
    //pDlg->SearchDown();   该函数可以判断是向上还是向下搜索,TRUE是向下,反之OOXX
    //pDlg->MatchCase();   该函数可以判断是否区分大小写
    //pDlg->MatchWholeWord(); 该函数可以判断是否全字匹配
    if( pDlg != NULL )
    {

        if( pDlg->FindNext() )
        {
            MessageBox("FindNext!", "hyp's Knowledge Base" ,MB_OK);
        }
        else
            if( pDlg->ReplaceAll() )
            {
                MessageBox("ReplaceAll!", "hyp's Knowledge Base", MB_OK);
            }
            else
                if( pDlg->ReplaceCurrent() ){
                    MessageBox("ReplaceCurrent!","hyp's Knowledge Base", MB_OK);
                }
    }
    delete pDlg; //加上这个点击完毕以后会自动销毁对话框
    return 1;
}

具体实现搜索和替换的功能就添加在OnFindReplace函数里面,嗯 差不多把整个类都说完了,那就这样子吧,这几天争取把对话框都介绍一篇吧.

 

 

另一篇:

Find/Replace Dialog是Windows Common Dialog的一种,一般用于在文档中提供查询或替换的人机界面。

MFC提供了CFindReplaceDialog类,可以用来建立标准的Find/Replace Dialog。不过,它的使用方法与其它的Common Dialog如CFileDialog等有所不同,它是一个无模式(Modeless)的Dialog。 

典型应用

 1. 建立CFindReplaceDialog对象

因为是Modeless的Dialog,所以需要使用new来在heap中分配,而不能在stack中。 

CFindReplaceDialog  *dlg;

dlg = new CFindReplaceDialog();

 

2. 使用其成员函数Create建立和显示Dialog

virtual BOOL Create ( BOOL bFindDialogOnly, 
                                           LPCTSTR lpszFindWhat,
                                           LPCTSTR lpszReplaceWith = NULL,
                                           DWORD dwFlags = FR_DOWN, 
                                           CWnd* pParentWnd = NULL );

lpszFindWhat, lpszReplaceWith是初始字符串,将显示在Dialog的Find和Replace输入框中

dwFlags可以控制CFindReplaceDialog的一些属性。 

      dlg->Create( TRUE, TEXT(""), NULL, FR_HIDEUPDOWN|FR_MATCHCASE, this );

 

这段代码每运行一次会出现一个Dialog,为了避免出现这种情况,可以进行下面的判断

if( dlg!=NULL && !dlg->IsTerminating() )

        return;

 

//m_dlg为全局变量. 如下写法不能关闭m_dlg,否则报错

if (m_dlg != NULL)
 {
  m_dlg->SetActiveWindow(); //激活对话框
  m_dlg->CenterWindow();
 }
 else
 {
  m_dlg=new CFindReplaceDialog();
  m_dlg->Create( FALSE, TEXT(""), NULL, FR_DOWN, this );
 }

 

 3. 响应CFindReplaceDialog的消息

首先注册消息的ID: 

static UINT WM_FINDREPLACE = ::RegisterWindowMessage(FINDMSGSTRING);

 

再在MESSAGE MAP中增加到函数的映设

BEGIN_MESSAGE_MAP(...)

ON_REGISTERED_MESSAGE(WM_FINDREPLACE, OnFindReplace)

END_MESSAGE_MAP()

 

在类的声明中添加函数OnFindReplace的声明: 

afx_msg LONG OnFindReplace(WPARAM wParam, LPARAM lParam);

 

函数的实现: 

LONG ClanspiderDlg::OnFindReplace(WPARAM wParam,LPARAM lParam)

{

        // 可以用下面这些成员函数取得用户输入

        BOOL    bDown  = m_dlgFind->SearchDown();  //#add m_dlgFind为程序的主对话框

        BOOL    bCase  = m_dlgFind->MatchCase();

        BOOL    bMarch = m_dlgFind->MatchWholeWord();

 

        m_strFind = m_dlgFind->GetFindString();

 

        if( m_dlgFind->FindNext() )

        {

               ... // 在这里写与应用程序相关的搜索过程

        }

 

        return 0;

}

 

重要成员函数:

CFindReplaceDialog类:封装了标准查找/替换对话框

  CFindReplaceDialog::Create 创建一个Find或Find/Replace对话框对象

  BOOL Create(BOOL bFindDialogOnly,LPCTSTR lpszFindWhat,LPCTSTR lpszReplaceWhat=NULL,DWORD dwFlag=FR_DOWN,CWnd* pParentWnd=NULL);

  参数:bFindDialogOnly 为TRUE时,显示查找对话框,为FALSE时,显示查找/替换对话框;

  lpszFindWhat 指定要查找的串的缺省值;

  lpszReplaceWhat 指定替换串的缺省值;

  dwFlag为标志位,用来定制对话框,它可以是一个或多个标志的组合,主要取值如下:

  FR_DOWN 如果设置,对话框中的“向下查找”单选按钮被选中,如果没有设置,“向上查找”单选按钮被选中;

  FR_HIDEUPDOWN 不显示查找方向单选按钮;

  FR_HIDEMATCHCASE 不显示区分大小写复选按钮;

  FR_HIDEWHOLEWORD 不显示全字匹配复选按钮;

  FR_MATCHCASE 使区分大小写复选按钮处于选中状态;

  FR_WHOLEWORD 使全字匹配复选按钮处于选中状态;

  FR_NOMATCHCASE 使区分大小写复选按钮处于禁止(变灰)状态;

  FR_NOUPDOWN 使查找方向单选按钮处于禁止(变灰)状态;

  FR_NOWHOLEWORD 使全字匹配复选按钮处于禁止(变灰)状态;

  FR_SHOWHELP 在对话框中显示一个帮助按钮。

  pParentWnd 指向父窗口或属主窗口的指针。

  返回值:若创建成功,返回非0值,否则返回0。

 

  CFindReplaceDialog::FindNext 确定用户是否要查找串的下一个出现处

  BOOL FindNext()const;

  返回值:若用户单击查找“下一个”按钮,则返回非0值,否则返回0。

 

  CFindReplaceDialog::GetFindString 检取对话框中的查找字符串

  CString GetFindString()const;

  返回值:对话框中的查找字符串

 

  CFindReplaceDialog::GetNotifier 检取当前查找/替换对话框的指针

  static CFindReplaceDialog* PASCAL GetNotifier(LPARAM lParam);

  参数:lParam 传递给回调函数OnFindReplace()的lParam值

  返回值:指向当前查找/替换对话框的指针

 

  CFindReplaceDialog::GetReplaceString 检取对话框中的替换字符串

  CString GetReplaceString()const;

  返回值:对话框中的替换字符串

 

  CFindReplaceDialog::IsTerminating 检取对话框是否终止

  BOOL IsTerminating()const;

  返回值:若用户终止对话框,返回非0值,否则返回0

 

  CFindReplaceDialog::MatchCase 检取区分大小写复选按钮状态

  BOOL MatchCase()const;

  返回值:如果区分大小写复选按钮被选择,返回非0值,否则返回0

 

  CFindReplaceDialog::MatchWholeWord 检取全字匹配复选按钮状态

  BOOL MatchWholeWord()const;

  返回值:如果全字匹配复选按钮被选择,返回非0值,否则返回0

 

  CFindReplaceDialog::ReplaceAll 确定用户是否要求全部替换

  BOOL ReplaceAll()const;

  返回值:如果用户要求全部替换,返回非0值,否则返回0

 

  CFindReplaceDialog::ReplaceCurrent 确定用户是否要求替换当前选择串

  BOOL ReplaceCurrent()const;

  返回值:如果用户要求替换当前选择串,返回非0值,否则返回0

 

  CFindReplaceDialog::SearchDown 检取查找方向

  BOOL SearchDown()const;

  返回值:如果为向下查找,返回非0值;若为向上查找,返回0

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

查找/替换对话框CFindReplaceDialog的使用

在Windows通用对话框中,查找/替换对话框是比较特殊的一个,它是一个非模态对话框,所以它的使用与其它通用对话框有所不同。一、注册注册的目的有两个,一是说明在程序中要使用查找/替换对话框,二是让窗口...

MFC:RichEdit and CFindReplaceDialog

CFindReplaceDialog 类: 所谓的CFindReplaceDialog 指的就是下面的东西 对于这个类,你是不用去添加就有的,即直接可用: afxdlgs.h 中 ...

用MFC实现“查找/替换”对话框

“查找/替换”对话框都属于“非模态”对话框,

MFC 批量查找替换文件内容

今天工作的时候遇到一个问题,需要将一系列文件中的某个字符串替换成另一字符串,手动替换太麻烦了,于是就想写个小程序来完成这一任务。

MFC查找与替换

  • 2012-12-21 20:20
  • 1.88MB
  • 下载

mfc实现查找与替换

  • 2013-12-22 13:17
  • 1.88MB
  • 下载

MFC下文本查找功能的实现

①新建一个MFC AppWizard(exe)工程,选择单文档,

MFC - 通过spy++查找应用程序菜单对应函数的方法

当一个应用程序比较大时,菜单比较多时,特别是初次接触这个程序的源码时,就会很难找到这个程序的入口点。下面通过SPY++可以很快速的获取到这个入口(程序要有源代码) 1、运行这个应用程序,例如a.ex...

转载:MFC文件/文件夹操作查找、复制、删除

转载自:http://blog.csdn.net/limingshandian/article/details/7823264   VC:文件操作大全,打开,保存,复制,删除,查找等 各种关于文件...

MFC基本控件使用——静态文本框(Static)

众所周知,在MFC应用chen静态文本框
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)