工控编程吧
标题:
47上位机VC MFC实现文件替换功能
[打印本页]
作者:
qq263946146
时间:
2015-11-28 21:43
标题:
47上位机VC MFC实现文件替换功能
(, 下载次数: 1)
上传
点击文件名下载附件
47上位机VC MFC实现文件替换功能
功能展示
一般的软件都有查找/替换功能,可以进行查找和替换操作CFindReplaceDialog类封装了查找替换功能,非常方便的实现我了我们想要的功能,我们当前例程就来用这个类实现查找替换的功能,效果如图
要点提示
要想知道如何使用这个类CFindReplaceDialog,我们就得翻阅MSDN看看使用说明;根据MSDN中的说法当用户点击查找下一个、替换、替换全部或者关闭对话框时,查找替换对话框会向窗体发送FINDMSGSTRING,所以我们需要捕捉这个消息,建立对应的消息响应函数,并用CFindReplaceDialog的方法判断具体进行了什么操作;
新建一个全局的常量WM_FINDREPLACEMESSAGE,并利用RegisterWindowMessage()进行关联,如人们例程static UINT WM_FINDMESSAGE =RegisterWindowMessage(FINDMSGSTRING);这样对查找替换对话框进行操作时,消息队列中便会有了WM_FINDREPLACEMESSAGE消息了,这样我们可以建立对应的消息响应函数,对用户对查找替换对话框的操作进行响应。
下面是从MSDN复制过来常用的函数,顾名思义也行好理解
CString GetReplaceString() const;// get replacementstring
CString GetFindString() const; // get findstring
BOOL SearchDown() const; // TRUE if search down, FALSEis up
BOOL FindNext() const; // TRUE if commandis find next
BOOL MatchCase() const; // TRUE if matching case
BOOL MatchWholeWord() const; //TRUE if matching whole words only
BOOL ReplaceCurrent() const; //TRUE if replacing current string
BOOL ReplaceAll() const; // TRUE if replacing alloccurrences
实现功能
1.新建基于对话框的应用程序
2.添加一些对话框变量:拖拽Cedit编辑框控件和Cbutton按钮控件,实现按钮消息响应,关联编辑框控件变量CEdit m_Edit;添加查找文件对话框CFindReplaceDialog *m_pFindDlg; 以及int m_nIndex; //存储查找字符串的起始位置;
3.在对话框初始化函数OnInitDialog()中,实现一些初始化操作
CString str="";
str += "和文件对话框(CFileDialog)一样\r\n";
str += "这个对话框也是VC自带的对话框\r\n";
str += "但是让我们比较汗颜的是。\r\n";
str += "当你点击查找或者替换按钮时。\r\n";
str += "VC并没有给我们封装这些功能。\r\n";
str += "需要我们自己写代码实现……囧\r\n";
str += "根据MSDN中的说法。\r\n";
str += "当用户点击查找下一个、替换、替换全部或者关闭对话框时。\r\n";
str += "查找替换对话框会向窗体发送FINDMSGSTRING\r\n";
str += "所以我们需要捕捉这个消息\r\n";
str += "建立对应的消息响应函数\r\n";
str += "并用CFindReplaceDialog的方法判断具体进行了什么操作";
m_Edit.SetWindowText(str);
m_nIndex = -1;
复制代码
4.自定义一消息static UINT WM_FINDMESSAGE = RegisterWindowMessage(FINDMSGSTRING); //新定义一个消息,完成系统CFindReplaceDialog类的查找功能实现;并实现这一消息的映射;函数定义,函数映射,函数体,如下
afx_msg long OnFindReplace(WPARAM wParam,LPARAM lParam); ON_REGISTERED_MESSAGE(WM_FINDMESSAGE, OnFindReplace )
long CGkbc8Dlg::OnFindReplace(WPARAM wParam, LPARAM lParam)
{if(m_pFindDlg->IsTerminating())//如果用户退出窗口时
{
m_nIndex = -1;
return 0;
}
BOOL if_whole_word = m_pFindDlg->MatchWholeWord();
BOOL if_case = m_pFindDlg->MatchCase();
BOOL if_down = m_pFindDlg->SearchDown();
bool last_one = false;
do
{
CString find_str, text_str;
int index;
m_Edit.GetWindowText(text_str);
find_str = m_pFindDlg->GetFindString();
int len = find_str.GetLength();
if (if_down)//向下找
{
if (m_nIndex != text_str.GetLength()-1)
m_nIndex++;
else
MessageBox("已经向下查找到文件尾!", "查找替换", MB_OK | MB_ICONINFORMATION);
index = text_str.Find(find_str, m_nIndex);
}
else
{
if (m_nIndex!=0)
m_nIndex--;
else
MessageBox("已经向上查找到文件头!", "查找替换", MB_OK | MB_ICONINFORMATION);
CString str = text_str.GetBuffer(0);
index = str.Find(find_str, m_nIndex);
text_str.ReleaseBuffer();
}
复制代码
if (index != -1)
{
m_Edit.SetSel(index, index + len);
}
else
{
last_one = true;
MessageBox("已经查找到最后一个!", "查找替换", MB_OK | MB_ICONINFORMATION);
}
if (m_pFindDlg->ReplaceCurrent() || m_pFindDlg->ReplaceAll())
{
CString replace_str;
m_Edit.ReplaceSel(m_pFindDlg->GetReplaceString(), TRUE);
}
m_nIndex = index;
}
while (m_pFindDlg->ReplaceAll() && !last_one);
m_Edit.SetFocus();//这句代码一定不能少,否则不能正常运行
return 0;
}
复制代码
5.最后一步就是调用查找对话框,实现查找功能
void CGkbc8Dlg::OnButton1()
{
m_pFindDlg = new CFindReplaceDialog;
m_pFindDlg->Create(FALSE,NULL);
m_pFindDlg->ShowWindow(SW_SHOW);
}
复制代码
我们来演示整个功能实现的过程
[iqiyi]http://player.video.qiyi.com/af0b304f2dacb6d5aa390d3ef27fd668/0/0/w_19rt9wxk49.swf-albumId=4954472309-tvId=4954472309-isPurchase=0-cnId=12[/iqiyi]
源码及视频下载
(仅在电脑可见)
(, 下载次数: 3)
上传
点击文件名下载附件
[note]1[/note]
作者:
qq263946146
时间:
2015-12-1 23:13
~明天的我一定会感激现在拼命的自己--赶快抢沙发~
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4