送分,关于CFindReplaceDialog

misboy 2002-06-11 03:45:25
一个SDI,带CHtmlView,按Ctrl+F时出现"查找/代替"对话框(CFindReplaceDialog),并查找。在一个菜单函数中写
CFindRepalceDialog dlg;

dlg.Create(.....);

虽然能出"查找/代替"对话框,但按“查找下一个”没有用。

请问如何能实现按Ctrl+F的完全功能,并将在网页
(CMyHtmlView)中找到的内容选上(高亮)。

曾想过用模拟键盘的方法,用keybd_event试过,没成功。

请高手指点一下,最好详细一些,给出例子
...全文
108 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
misboy 2002-06-20
  • 打赏
  • 举报
回复
其他人在另外的帖子加分
wistaria 2002-06-13
  • 打赏
  • 举报
回复
不需要函数的.
你可以映射ID_EDIT_FIND的ON_UPDATE_COMMAND_UI消息.
然后再根据一个BOOL变量来显示菜单项.
比如,BOOL bGrayed; 当操作某些函数时,改变bGrayed值.
在OnUpdate....(CCmdUI* pCmdUI)
{
pCmdUI->Enable(bGrayed);
}
misboy 2002-06-13
  • 打赏
  • 举报
回复
towistaria(听风听雨):
没有函数," 查找"是灰的
misboy 2002-06-13
  • 打赏
  • 举报
回复
to wistaria(听风听雨)
没有函数," 查找"是灰的
misboy 2002-06-13
  • 打赏
  • 举报
回复
to vccsdn(johnson)

基本功能已完成,先谢谢你,虽然我还不完全明白你的代码,
但在OnFindDialogMessage调用FindText,能查找和让找到的内容高亮

要弄懂那些,我是不是得学学ATL,COM?
请到http://www.csdn.net/expert/topic/798/798008.xml?temp=.4992029
随便发几句话,那100分归你


to ALL:
多谢各位鼎力相助
准备结帖
vccsdn 2002-06-13
  • 打赏
  • 举报
回复
#include <Mshtml.h>
#include <atlbase.h>

lFlags: 2 //match whole word
lFlags: 4 //Matches case
lFlags: 8 //Matches regular expressions

FindText(CString searchText, long lFlags /* =2 */, BOOL bNNF /* =FALSE (for internal use)*/)
{
static CString sLastSearch;
static BSTR lastBookmark = NULL;

if(sLastSearch != searchText)
lastBookmark = NULL;
sLastSearch = searchText;


IHTMLDocument2 *lpHtmlDocument = NULL;

LPDISPATCH lpDispatch = NULL;
lpDispatch = GetHtmlDocument();
ASSERT(lpDispatch);

lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&lpHtmlDocument);
ASSERT(lpHtmlDocument);

lpDispatch->Release();

IHTMLElement *lpBodyElm;
IHTMLBodyElement *lpBody;
IHTMLTxtRange *lpTxtRange;

lpHtmlDocument->get_body(&lpBodyElm);
ASSERT(lpBodyElm);
lpHtmlDocument->Release();
lpBodyElm->QueryInterface(IID_IHTMLBodyElement,(void**)&lpBody);
ASSERT(lpBody);
lpBodyElm->Release();

lpBody->createTextRange(&lpTxtRange);
ASSERT(lpTxtRange);
lpBody->Release();

CComBSTR search(searchText.GetLength()+1,(LPCTSTR)searchText);
bool bFound,bTest;
long t;

if(lastBookmark!=NULL)
{
lpTxtRange->moveToBookmark(lastBookmark,(VARIANT_BOOL*)&bTest);
if(!bTest)
{
lastBookmark=NULL;
lpTxtRange->moveStart((BSTR)CComBSTR("Textedit"),1,&t);
lpTxtRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
} else
{
lpTxtRange->moveStart((BSTR)CComBSTR("Character"),1,&t);
lpTxtRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
}
} else
{
lpTxtRange->moveStart((BSTR)CComBSTR("Textedit"),0,&t);
lpTxtRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
}
lpTxtRange->findText((BSTR)search,0,lFlags,(VARIANT_BOOL*)&bFound);

if(!bFound)
{
if(lastBookmark==NULL && !bNNF)
{
CString message;
message.Format("Cannot find the string: '%s'",searchText);
AfxMessageBox(message);
} else if(lastBookmark!=NULL)
{
lastBookmark = NULL;
FindText(searchText,lFlags,TRUE);
}
} else
{
if(lpTxtRange->getBookmark(&lastBookmark)!=S_OK)
lastBookmark=NULL;
lpTxtRange->select();
lpTxtRange->scrollIntoView(TRUE);
}

lpTxtRange->Release();

}
蒋晟 2002-06-13
  • 打赏
  • 举报
回复
IHTMLTxtRange::findText Method

--------------------------------------------------------------------------------

Searches for text in the document and positions the start and end points of the range to encompass the search string.

Syntax

HRESULT findText(
BSTR String,
long count,
long Flags,
VARIANT_BOOL *Success
);

carole_zhang 2002-06-13
  • 打赏
  • 举报
回复
在OnFindNotify()中写你要实现的功能的代码。
先把你的代码发到我的信箱里,我给你加加试试
carolezh@eyou.com
carole_zhang 2002-06-13
  • 打赏
  • 举报
回复
在OnFindNotify()中写你要实现的功能的代码。
先把你的代码发到我的信箱里,我给你加加试试
carolezh@eyou.com
alidiedie 2002-06-13
  • 打赏
  • 举报
回复
up
misboy 2002-06-13
  • 打赏
  • 举报
回复
这个我已在 masterz() 给的
http://www.codeproject.com/dialog/cfindreplacedialog.asp
中看到,现在的问题是如何在CHtmlView中查找和然找到的内容高亮

carole_zhang 2002-06-13
  • 打赏
  • 举报
回复
你按”下一步”按钮没有反应是因为你并没有增加此按钮按下时的消息处理函数,应该调用Windows函数Register_WindowMessage()注册一个消息,然后通过宏ON_REGISTERED_MESSAGE进行消息映射并指定消息处理函数。
例如:
1,在BEGIN_MESSAGE_MAP前加上
const UINT WM_REGISTER_FIND=RegisterWindowMessage(FINDMSGSTRING)
2,在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP中间加上
ON_REGISTERED_MESSAGE(WM_REGISTER_FIND,OnFindNotify)
3,在头文件中DECLARE_MESSAGE_MAP前面加上
afx_msg LRESULT OnFindNotify(WPARAM,LPARAM);
masterz 2002-06-12
  • 打赏
  • 举报
回复
http://codeguru.earthweb.com/richedit/RichEditFind.html
http://www.codeproject.com/dialog/cfindreplacedialog.asp
wistaria 2002-06-12
  • 打赏
  • 举报
回复
在菜单中加入一个菜单项
ID设为ID_EDIT_FIND, caption设为 查找(&F)\tCtrl+F
直接编译就行了
misboy 2002-06-12
  • 打赏
  • 举报
回复
IHTMLDocument接口是不是和COM有关,我没学过COM

模拟键盘的思路应该正确吧,至于keybd_event 我也是才在CSDN上搜索
"模拟键盘"时搜到的,粗略的看了MSDN,不太了解

不知用发送消息(SendMessage,PostMessage)的方法行不行,
如果模拟键盘成功,就不用写那一堆代码了(毕竟系统已经实现了)

还有,按Ctrl+F所实现的功能,是OS实现的,还是程序带的?
第一次按Ctrl+F时,反应比较慢

逸少 2002-06-12
  • 打赏
  • 举报
回复
你自己的程序中使用,用 keybd_event 干什么?
查找替换对话框本来就没有实现查找的真正功能,她之提供了一个对话框,你可以得到要查找的字符串,以及是否全局查找,是否区分大小写等信息.查找过程需要你自己实现.你可以使用 IHTMLDocument 接口得到网页的内容,然后查找好了!使用 CString::Find 或 strstr 或 std::string::find 等实现.或者自己写一个吧!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧