CFindReplaceDialog
1. 简单例子
1 void CCFindReplaceDialogView::OnFind()
2 {
3 CFindReplaceDialog* pDlg = new CFindReplaceDialog();
4
5 pDlg->Create( true, NULL, NULL, FR_DOWN, this );
6 /*
7 第一个参数为true显示的是查找对话框,为False时显示的是查找和替换对话框
8 第二个参数指定在查找对话框中显示的字符串
9 第三个参数指定在替换对话框中显示的字符串
10 第四个参数为指定标志位,用来定制对话框,其中FR_DOWM表示对话框中的“向下”单选按钮被选中,否则“向上”单选按钮被选中,具体可取值参考MSDN
11 第五个参数为指向父窗口的指针,如果为NULL,则为主框架窗口,使用时需要让它指向接收查找和替换消息的窗口
12 */
13 pDlg->ShowWindow( SW_SHOW ); // 显示对话框
14 }
效果如下:
1 void CCFindReplaceDialogView::OnFindReplace()
2 {
3 CFindReplaceDialog* pDlg = new CFindReplaceDialog();
4
5 pDlg->Create( false, NULL, NULL, FR_DOWN, this );
6
7 pDlg->ShowWindow( SW_SHOW ); // 显示对话框
8 }
效果如下:
2. Create
查找和替换对话框也是非模态对话框,所以创建过程和MFC下创建非模态对话框的过程有点类似.
先Create出一个窗口,设置好相关参数然后在显示出来使用就OK.
Create原型:
virtual BOOL Create(BOOL bFindDialogOnly,// TRUE for Find, FALSEfor FindReplace
LPCTSTRlpszFindWhat, //默认被查找的字符串
LPCTSTR lpszReplaceWith = NULL, //默认被查找替换的字符串
DWORD dwFlags =FR_DOWN, //设置对话框里面的一些属性啦,下面说明了相关标志
CWnd* pParentWnd = NULL); //对话框的父窗口
dwFlags相关标志说明:
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'sKnowledge 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'sKnowledge Base"),FR_DOWN,this))
{
return;
}
pReplaceDlg->ShowWindow(SW_SHOW);
pReplaceDlg->SetActiveWindow();
3. 显示的出来的对话框添加响应函数
显示的出来的对话框还需要添加一些响应函数吧,我找了一下发现没有现成的消息响应-_-网上google了一下发现要自己添加我汗.
大体步骤是这样子的:
在你添加查找替换对话框的头文件的#pragma once下面加入
constint WM_FINDREPLACE =::RegisterWindowMessage(FINDMSGSTRING);//将FINDMSGSTRING注册为WM_FINDREPLACE消息
并在头文件生成的消息映射函数
afx_msg LONG OnFindReplace(WPARAMwParam, LPARAM lParam);
在源文件里面将消息映射函数与WM_FINDREPLACE消息关联
BEGIN_MESSAGE_MAP(...)
...
ON_REGISTERED_MESSAGE(WM_FINDREPLACE, OnFindReplace)
...
END_MESSAGE_MAP()
接下来编写OnFindReplace函数就OK了
LONG ChypDlg::OnFindReplace( WPARAMwparam, 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'sKnowledge Base", MB_OK);
}
}
delete pDlg; //加上这个点击完毕以后会自动销毁对话框
return 1;
}
具体实现搜索和替换的功能就添加在OnFindReplace函数里面,嗯差不多把整个类都说完了,那就这样子吧,这几天争取把对话框都介绍一篇吧.
4. 重要成员函数
CFindReplaceDialog类:封装了标准查找/替换对话框
CFindReplaceDialog::Create 创建一个Find或Find/Replace对话框对象
BOOL Create(BOOL bFindDialogOnly,LPCTSTRlpszFindWhat,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
函数名 | 用途 |
FindNext | 如果用户点击了Findnext按钮,该函数返回TRUE。 |
GetNotifier | 返回一个指向当前CFindReplaceDialog对话框的指针。 |
GetFindString | 返回一个包含要搜索字符串的CString对象。 |
GetReplaceString | 返回一个包含替换字符串的CString对象。 |
IsTerminating | 如果对话框终止了,则返回TRUE。 |
MatchCase | 如果选择了对话框中的Match case检查框,则返回TRUE。 |
MatchWholeWord | 如果选择了对话框中的Match Whole Word检查框,则返回TRUE。 |
ReplaceAll | 如果用户点击了Replace All按钮,该函数返回TRUE。 |
ReplaceCurrent | 如果用户点击了Replace按钮,该函数返回TRUE。 |
SearchDown | 返回TRUE表明搜索方向向下,返回FALSE则向上。 |
CColorDialog
首先是在堆栈上构建一个CColorDialog对象,然后调用CColorDialog::DoModal()来启动对话框。CColorDialog的构造函数为
CColorDialog( COLORREF clrInit =0, DWORD dwFlags = 0, CWnd* pParentWnd = NULL ); \
参数clrInit用来指定初始的颜色选择,dwFlags用来设置对话框,pParentWnd用于指定对话框的父窗口或拥有者窗口。
根据DoModal返回的是IDOK还是IDCANCEL可知道用户是否确认了对颜色的选择。DoModal返回后,调用CColorDialog::GetColor()可以返回一个COLORREF类型的结果来指示在对话框中选择的颜色。COLORREF是一个32位的值,用来说明一个RGB颜色。GetColor返回的COLORREF的格式是0x00bbggrr,即低位三个字节分别包含了蓝、绿、红三种颜色的强度。
CfontDialog
CFontDialog类的辅助成员函数
函数名 | 用途 |
GetCurrentFont | 用来获得所选字体的属性。该函数有一个参数,该参数是指向LOGFONT结构的指针,函数将所选字体的各种属性写入这个LOGFONT结构中。 |
GetFaceName | 返回一个包含所选字体名字的CString对象。 |
GetStyleName | 返回一个包含所选字体风格名字的CString对象。 |
GetSize | 返回所选字体的尺寸(以10个象素为单位)。 |
GetColor | 返回一个含有所选字体的颜色的COLORREF型值。 |
GetWeight | 返回所选字体的权值。 |
IsStrikeOut | 若用户选择了空心效果则返回TRUE,否则返回FALSE。 |
IsUnderline | 若用户选择了下划线效果则返回TRUE,否则返回FALSE。 |
IsBold | 若用户选择了黑体风格则返回TRUE,否则返回FALSE。 |
IsItalic | 若用户选择了斜体风格则返回TRUE,否则返回FALSE。 |
CprintDialog
CPrintDialog的辅助成员函数
函数名 | 用途 |
GetCopies | 返回要求的拷贝数。 |
GetDefaults | 在不打开对话框的情况下返回缺省打印机的缺省设置,返回的设置放在m_pd数据成员中。 |
GetDeviceName | 返回一个包含有打印机设备名的CString对象。 |
GetDevMode | 返回一个指向DEVMODE结构的指针,用来查询打印机的设备初始化信息和设备环境信息。 |
GetDriverName | 返回一个包含有打印机驱动程序名的CString对象。 |
GetFromPage | 返回打印范围的起始页码。 |
GetToPage | 返回打印范围的结束页码。 |
GetPortName | 返回一个包含有打印机端口名的CString对象。 |
GetPrinterDC | 返回所选打印设备的一个 HDC 句柄。 |
PrintAll | 若要打印文档的所有页则返回TRUE。 |
PrintCollate | 若用户选择了Collate Copies检查框(需要校对打印拷贝)则返回TRUE。 |
PrintRange | 如果用户要打印文档的一部分页,则返回TRUE。 |
PrintSelection | 若用户想打印当前选择的部分文档,则返回TRUE。 |
CFileDialog
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle=_T("选择文件");
fileDlg.m_ofn.lpstrDefExt= _T("exe");
fileDlg.m_ofn.lpstrFilter="执行文件(*.exe)\0*.exe\0所有文件(*.*)\0*.*\0\0";
if(IDOK==fileDlg.DoModal()) //如果用户选择了文件并点击了确定
{
//fileDlg.GetFileName()
//fileDlg.GetPathName()
}
CFile file;
file.Open(fileDlg.GetPathName(),CFile::modeRead);
file.Close(); //关闭
if(nChar== VK_RETURN)
{
CFileDialogfileDlg(FALSE);
fileDlg.m_ofn.lpstrTitle=_T("选择文件");
//fileDlg.m_ofn.lpstrDefExt= _T("exe");
fileDlg.m_ofn.lpstrFilter="所有文件(*.*)\0*.*\0\0";
if(IDOK==fileDlg.DoModal()) //如果用户选择了文件并点击了确定
{
CFilefile;
file.Open(fileDlg.GetPathName(),CFile::modeCreate|CFile::modeReadWrite);
charpMapName[22]={0};
file.Write(pMapName,22);
file.Write(&m_nMapCx,4);
file.Write(&m_nMapCy,4);
file.Write(m_pMap,m_nMapCx*m_nMapCy);
file.Close(); //关闭
MessageBox("保存成功");
return;
}
}
//--------------多文件
CFileDialogfileDlg(TRUE);
charsBuffer[5000];
ZeroMemory(sBuffer,sizeof(sBuffer));
fileDlg.m_ofn.lpstrTitle=_T("选择文件");
fileDlg.m_ofn.lpstrDefExt= _T("exe");
fileDlg.m_ofn.lpstrFilter="执行文件(*.exe)\0*.exe\0所有文件(*.*)\0*.*\0\0";
fileDlg.m_ofn.Flags|= OFN_ALLOWMULTISELECT;
fileDlg.m_ofn.lpstrFile= sBuffer;
fileDlg.m_ofn.nMaxFile= 5000;
CStringstrFileName;
if(IDOK==fileDlg.DoModal()) //如果用户选择了文件并点击了确定
{
//fileDlg.GetFileName()
//fileDlg.GetPathName()
CFilefile;
POSITIONpos = fileDlg.GetStartPosition();
while(pos)
{
strFileName= fileDlg.GetNextPathName(pos);
//MessageBox(str);
strFileName= fileDlg.GetPathName();
//MessageBox(str);
}
}
//-------------------------------- 选择目录
charszPath[MAX_PATH]; //存放选择的目录路径
ZeroMemory(szPath,sizeof(szPath));
BROWSEINFObi;
bi.hwndOwner= m_hWnd;
bi.pidlRoot= NULL;
bi.pszDisplayName= szPath;
bi.lpszTitle= "请选择保存的目录:";
bi.ulFlags= 0;
bi.lpfn= NULL;
bi.lParam= 0;
bi.iImage= 0;
//弹出选择目录对话框
LPITEMIDLISTlp = SHBrowseForFolder(&bi);
if(lp&& SHGetPathFromIDList(lp, szPath))
{
//szPath是目录
}
else
{
//出错返回重选
}