再开一贴,解决CFindReplaceDialog类创建的查找对话框的使用问题,(连同另一贴共200分)!?

zhdleo 2002-12-05 08:21:54
源贴:http://expert.csdn.net/Expert/topic/1227/1227683.xml?temp=.1629602

现在在:
菜单点击后,正常的查找对话框弹出,说明,其创建已经完成。主要是那个void CMainFrame::OnFind() 函数。

现在有了查找对话框,但是点击后没有效果。

察看其他文章,还有很多代码没有。所以:
加入:
static UINT FindDialogMessage = ::RegisterWindowMessage(FINDMSGSTRING);
//加入上面那句。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_FINDDLG, OnFind)
//}}AFX_MSG_MAP
ON_REGISTERED_MESSAGE(FindDialogMessage, OnFindDialogMessage) 加入这个。
END_MESSAGE_MAP()

还有函数OnFindDialogMessage()
LRESULT CMainFrame::OnFindDialogMessage(WPARAM wParam, LPARAM lParam)
{
CFindReplaceDialog *pDlg = CFindReplaceDialog::GetNotifier(lParam);

if( NULL != pDlg )
{
// Use pDlg as a pointer to the existing FindReplace dlg to
// call CFindReplaceDialog member functions
是不是要在此处 加入相应的代码,才可以实现真正的查找功能??
//我只加入下面2句,没作用呀!!!
pDlg->GetFindString();
pDlg->FindNext();

}
return 0;
}

--------------
现在就是怎么让弹出的通用查找对话框 实现真正的查找功能!

2个贴子是差不多,先谢了。
...全文
236 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhdleo 2002-12-09
  • 打赏
  • 举报
回复
你帮我看看我的理解对不:

先定义一个
BOOL bFirstSearchTime;
用来表示,此次是否是第一次查找。

并在UserView的构造函数中初始化这个变量:
bFirstSearchTime = TRUE;

定义函数:
BOOL FindText(LPCTSTR lpszFind, BOOL bNext ,BOOL bCase);

实现函数:
BOOL CleftView::FindText(LPCTSTR lpszFind, BOOL bNext ,BOOL bCase)
{ //当第一次时,执行IF里的内容,执行完设置查询位置后,按照原FindText()进行查找。
//不是第一次,就直接按照原FindText()进行查找。
if(bFirstSearchTime)
{
CEdit &editCtrl=this->GetEditCtrl();
editCtrl.SetSel(0,0);//将搜寻起点设置在cedit 得开始部分
this->bFirstSearchTime=false;
//this->GetEditCtrl()返回的是CEdit object.得到了这个对象,
//就可以用SetSel()函数了,
//最后再把bFirstSearchTime修改,让下一次进不了这个IF内!
}
return CEditView::FindText(lpszFind,bNext,bCase);
//执行原CEditView::FindText()函数!
}

这样理解行不?
--------------------
看来还是经验的问题,
我在看到了SetSel()函数的时候,发现它是CEdit::SetSel()
我就失望!(没法this.SetSel(0,0) )
完全没有你那种转换的概念!
------------------------------

还有:关于SetSel()的一个小问题。
针对SetSel()是2个参数的时候,它的第一个参数DWORD dwSelection,
在MSDN上是这样写的:
dwSelection
Specifies the starting position in the low-order word and the ending
position in the high-order word. If the low-order word is 0 and
the high-order word is –1, all the text in the edit control
is selected. If the low-order word is –1, any current
selection is removed.
里面的the low-order word 和the high-order word,你是怎么理解的?
我想你一定可以把它翻译的很好。
GoogleGeek 2002-12-09
  • 打赏
  • 举报
回复
你的findtext()理解是对的
GoogleGeek 2002-12-09
  • 打赏
  • 举报
回复
好像说的有点不对!,改为:
--------------
意思是:DWORD dwSelection (为双字节)的低字节表示的是选择的起始位置,高字节表示的是选择的结束位置,如果低字节为0,高字节为-1,表示选中所有的字符。如果低字节为-1则祛除当前的选择
----------------------
这是我的理解,你可以DWORD dwSelection看成:
int nStartChar, int nEndChar
的组合不就明白了,低字节相当于nStartChar,高字节相当于nEndChar
GoogleGeek 2002-12-09
  • 打赏
  • 举报
回复
靠!意思很简单呀!
------------------------------
CEdit::SetSel
void SetSel( DWORD dwSelection, BOOL bNoScroll = FALSE );
void SetSel( int nStartChar, int nEndChar, BOOL bNoScroll = FALSE );

----------------
意思是:DWORD dwSelection (为双字节)的低字节表示的是当前位置的x坐标,高字节表示的是当前位置的y坐标,如果低字节为0,高字节为-1,表示选中所有的字符。如果低字节为-1则祛除当前的选择
----------------------
这是我的理解,你可以DWORD dwSelection看成:
int nStartChar, int nEndChar
的组合不就明白了,低字节相当于nStartChar,高字节相当于nEndChar

zhdleo 2002-12-09
  • 打赏
  • 举报
回复
好的,我研究一下你的这个!,先大概看了看
其它还行,
CEdit &editCtrl=this->GetEditCtrl();这个是?怎么和GetEditCtrl有关系?

GoogleGeek 2002-12-08
  • 打赏
  • 举报
回复
在findtext()函数中设置自己的查找位置不就行了
否则默认的位置是当前位置!
GoogleGeek 2002-12-08
  • 打赏
  • 举报
回复
关键是你要改写ceditview的findtext()函数,
are you ok?
GoogleGeek 2002-12-08
  • 打赏
  • 举报
回复
我已经解决了这个问题!

TNND,我第一次时,竟然将消息处理代码写在CMainFrame 中去了,搞得我得不到自己注册的消息!
---------一度怀疑自己的能力,想不到竟然翻了个如此低级的错误!
实践是检验真理的唯一标准!
itanynj@msn.com
------------------------------------------------
class CUseReplaceDialogView : public CEditView
{
protected: // create from serialization only
CUseReplaceDialogView();
DECLARE_DYNCREATE(CUseReplaceDialogView)

// Attributes
public:
CUseReplaceDialogDoc* GetDocument();
BOOL FindText( LPCTSTR lpszFind, BOOL bNext = TRUE, BOOL bCase = TRUE );
CFindReplaceDialog *m_pFRDlg;
bool bFirstSearchTime;

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CUseReplaceDialogView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CUseReplaceDialogView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
//{{AFX_MSG(CUseReplaceDialogView)
afx_msg void OnFind();
//}}AFX_MSG
afx_msg LRESULT OnFindReplace(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
};

#ifndef _DEBUG // debug version in UseReplaceDialogView.cpp
inline CUseReplaceDialogDoc* CUseReplaceDialogView::GetDocument()
{ return (CUseReplaceDialogDoc*)m_pDocument; }
#endif

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_USEREPLACEDIALOGVIEW_H__B3EC2E7A_1258_4579_BC73_4A27411D28DE__INCLUDED_)

---------------------------------------------------------------------------------------------
static UINT FindReplaceDialogMessage =
::RegisterWindowMessage(FINDMSGSTRING);

/////////////////////////////////////////////////////////////////////////////
// CUseReplaceDialogView

IMPLEMENT_DYNCREATE(CUseReplaceDialogView, CEditView)

BEGIN_MESSAGE_MAP(CUseReplaceDialogView, CEditView)
//{{AFX_MSG_MAP(CUseReplaceDialogView)
ON_COMMAND(ID_SEARCH_REPLACE, OnFind)
//}}AFX_MSG_MAP
ON_REGISTERED_MESSAGE(FindReplaceDialogMessage, OnFindReplace )
END_MESSAGE_MAP()

CUseReplaceDialogView::CUseReplaceDialogView()
{
// TODO: add construction code here
m_pFRDlg=NULL;
bFirstSearchTime=true;
}
BOOL CUseReplaceDialogView:: FindText( LPCTSTR lpszFind, BOOL bNext ,BOOL bCase )
{
if(bFirstSearchTime)
{
CString str;
CEdit &editCtrl=this->GetEditCtrl();
editCtrl.SetSel(0,0);//将搜寻起点设置在cedit 得开始部分
this->bFirstSearchTime=false;
}
return CEditView::FindText(lpszFind,
bNext,
bCase);
}
void CUseReplaceDialogView::OnFind()
{
// TODO: Add your command handler code here
if(m_pFRDlg==NULL)
{
m_pFRDlg = new CFindReplaceDialog(); // Must be created on the heap
m_pFRDlg->m_fr.lStructSize = sizeof(FINDREPLACE);
m_pFRDlg->m_fr.hwndOwner = this->m_hWnd;

m_pFRDlg->Create( false, "", "", FR_DOWN | FR_WHOLEWORD, this );
}

}
LRESULT CUseReplaceDialogView::OnFindReplace(WPARAM wParam,LPARAM lParam)
{
// TODO: Add your command handler code here
CFindReplaceDialog* pFindReplace =
CFindReplaceDialog::GetNotifier(lParam);

ASSERT(pFindReplace != NULL);

if (pFindReplace->IsTerminating())
{
m_pFRDlg = NULL;
this->bFirstSearchTime=true;
}
else if (pFindReplace->FindNext())
{
if(FindText(pFindReplace->GetFindString(),
true,
FALSE))
;
//AdjustDialogPosition(pFindReplace);
else
{
this->bFirstSearchTime=true;
OnTextNotFound(pFindReplace->GetFindString());
MessageBox("Have reached the end of line,Cannt find!");
}
}
return 0;
}


GoogleGeek 2002-12-08
  • 打赏
  • 举报
回复
BOOL CUseReplaceDialogView:: FindText( LPCTSTR lpszFind, BOOL bNext ,BOOL bCase )
{
if(bFirstSearchTime)
{
CString str;
CEdit &editCtrl=this->GetEditCtrl();
editCtrl.SetSel(0,0);//将搜寻起点设置在cedit 得开始部分
this->bFirstSearchTime=false;
}
return CEditView::FindText(lpszFind,
bNext,
bCase);
}
GoogleGeek 2002-12-08
  • 打赏
  • 举报
回复
找不到没有关系呀!
我上面的例子不是给出答案了吗?
就是将原来的editview得
BOOL FindText( LPCTSTR lpszFind, BOOL bNext = TRUE, BOOL bCase = TRUE );
重新声明一下,然后重新实现,在实现中添加自己的改变当前位置的代码后在调用基类的得相同的函数不就行了!
zhdleo 2002-12-08
  • 打赏
  • 举报
回复
是的,
你看,点击菜单“查找”,就会弹出你自己的Find对话框,
是因为你Create,,就在响应创建查找对话框的函数OnFind()里的最后,设置一下,

把鼠标的默认位置改回到内容的一开始

那样的话,点击查找对话框中的查找按钮,就会从内容的最开始往后查找。
(省得自己还得把鼠标放回到内容的最开始。)

我说明白了吧?
zhdleo 2002-12-08
  • 打赏
  • 举报
回复
你的意思是要在我的view里重载基类editview里的函数
BOOL FindText( LPCTSTR lpszFind, BOOL bNext = TRUE, BOOL bCase = TRUE );
吗?

我恐怕自己做不到。
我怎么找不到editview里的FindText()的实现,
只能看到定义呀。
第二个参数表示针对buf的方向。


而且我必须说明一点,这个设置位置最好应该放到创建查找对话框的
那个函数View::OnMyfind()的里面,放在最后,

这样,一弹出查找对话框,就设置到开始位置。
你说呢?如果放到相应查找的查找按钮的函数OnFindReplaceMessage(WPARAM wParam, LPARAM lParam),我觉得不太好。
GZCompiler 2002-12-07
  • 打赏
  • 举报
回复
我没具体实现“查找功能的代码”,我只是觉得应该写在这里。
而且这个查找功能应该有一定的查找对象啊,比如如果你使用的是CEditView或CRichEditView,他就是在编辑器的buffer中查找,但是你用的是CView吧?那你是在什么中查找呢?

我可能没看全你的内容,所述不知重复与否。
GZCompiler 2002-12-07
  • 打赏
  • 举报
回复
AdjustDialogPosition好象只是调整窗口位置,不至于挡住被选择的字符串。

请查看CFindReplaceDialog::SearchDown()函数的功能,可能对查找方向有作用。
zhdleo 2002-12-07
  • 打赏
  • 举报
回复
那个资料我可能看了,和你理解的一样,你看到
我说的实现查找后的一些新问题了码?0---------所以我说的代码可能有误,
你试了,你的那个关于//实现查找功能的代码是怎么写的?

GZCompiler 2002-12-07
  • 打赏
  • 举报
回复
现在你是要知道如何设置光标位置吗?
riverboat 2002-12-07
  • 打赏
  • 举报
回复
CEditView和CRichEditView比较特殊,因为数据是封装在控件里面的。所以查找消息由View响应。
riverboat 2002-12-07
  • 打赏
  • 举报
回复
查找功能应该是在View类或者对应的Doc类里面自己实现的。不可能调用一个系统地查找框不管有没有内容都乱找啊!一般在Doc类里面更合理,毕竟对数据的管理就是Doc类的分内之事呢。
zhdleo 2002-12-07
  • 打赏
  • 举报
回复
现在先不管循环了!
因为我可以用
。。
else if (pDlg->FindNext() )
{ if(!FindText(pDlg->GetFindString(),TRUE,FALSE))
{ CString INFO_FIND= "Not Found " + pDlg->GetFindString() ;
MessageBox(INFO_FIND);
}
}
在没有符合,或是已经到了内容的最后,弹出提示:“找不到”。所以也就不需要循环了。

现在只要知道怎么让鼠标回到View内容的最开始就行。要不我查找的时候总要把鼠标移到内容的最开始!
zhdleo 2002-12-07
  • 打赏
  • 举报
回复
好像不行!

不过我有所发现:
就是函数 FindText (),你看它的两个参数
CEditView::FindText
BOOL FindText( LPCTSTR lpszFind, BOOL bNext = TRUE, BOOL bCase = TRUE );
Parameters
lpszFind
The text to be found.
bNext
Specifies the direction of the search. If TRUE, the search direction is toward the end of the buffer. If FALSE, the search direction is toward the beginning of the buffer.
bCase
Specifies whether the search is case sensitive. If TRUE, the search is case sensitive. If FALSE, the search is not case sensitive.

特别是第二个参数,TREU---缓冲得结束
FALSE---缓冲的开始。
这个缓冲得结束开始是???比较迷惑。
不过我把第二个参数设置为TRUE,再把鼠标的位置指到最开始的地方,
就可以实现从Text的开始查找了,不过循环还是不行。。

你有什么办法,打开查找对话框后,鼠标的默认点被放至到 text的最开始!
那样的话最起码可以 按照从头得顺序向后查找了!



加载更多回复(8)

16,548

社区成员

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

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

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