查找和替换 对话框也是非模态对话框,所以创建过程和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下面加入
const
int 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函数里面