windows程序设计POPPAD3的关键难点详解(五)

本文详细介绍了Windows应用程序中查找功能的具体实现方式,包括通过发送消息获取选中文本位置、使用FINDREPLACE结构体及FindText函数创建对话框进行文本搜索的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接着我们继续,这次重点给大家讲讲查找功能,尽量语言明快简洁,少废话,少弄一些绕来绕去没意义的话


点那个Find选项,发生

case   IDM_SEARCH_FIND:
        
                          SendMessage (hwndEdit, EM_GETSEL, 0, (LPARAM) &iOffset) ;
        
                          hDlgModeless = PopFindFindDlg (hwnd) ;
        

                          return 0 ;

SendMessage (hwndEdit, EM_GETSEL, 0, (LPARAM) &iOffset) ;获得选中的文字后的第一个字的位置,存入iOffset,如下图的钱字

选中的被用蓝框包着,蓝框后的第一个字是钱,所以iOffset保存的是钱的位置

hDlgModeless = PopFindFindDlg (hwnd) ;

其中PopFindFindDlg 为:

HWND PopFindFindDlg (HWND hwnd)
        
{
        
           static FINDREPLACE fr ;       // must be static for modeless dialog!!!
        
   
        
           fr.lStructSize                = sizeof (FINDREPLACE) ;
        
           fr.hwndOwner                  = hwnd ;
        
           fr.hInstance                  = NULL ;
        
           fr.Flags                      = FR_HIDEUPDOWN | FR_HIDEMATCHCASE | FR_HIDEWHOLEWORD ;
        
           fr.lpstrFindWhat              = szFindText ;
        
           fr.lpstrReplaceWith           = NULL ;
        
           fr.wFindWhatLen               = MAX_STRING_LEN ;
        
          fr.wReplaceWithLen            = 0 ;
        
           fr.lCustData                  = 0 ;
        
           fr.lpfnHook                   = NULL ;
        
           fr.lpTemplateName             = NULL ;
        
   
        

           return FindText (&fr) ;

}

先定义一个名为fr的FINDREPLACE结构,然后初始化,然后调用FindText,FindText的作用是产生对话框,如下图,在框里输入要查找的内容,然后点查找下一个,或点取消,或点击那个叉号,对话框的窗口过程将输入框里要搜索的内容存入fr.lpstrFindWhat 中




在将fr放入messageFindReplace的IParam参数中,然后将messageFindReplace发送到应用程序的消息对列中

于是就有了下面:

        
           default:
        
                                         // Process "Find-Replace" messages
        
                  if (message == messageFindReplace)
        
                  {
        
                                 pfr = (LPFINDREPLACE) lParam ;
        
                                  if     (pfr->Flags & FR_DIALOGTERM)
        
                                                 hDlgModeless = NULL ;
        
             
        
                                  if     (pfr->Flags & FR_FINDNEXT)
        
                          if (!PopFindFindText (hwndEdit, &iOffset, pfr))
        
                          OkMessage (hwnd,      TEXT ("Text not found!"),
        
                      TEXT ("\0")) ;
        
                  
        
                                  if (pfr->Flags & FR_REPLACE || pfr->Flags & FR_REPLACEALL)
        
                                         if (!PopFindReplaceText (hwndEdit, &iOffset, pfr))
        
                                         OkMessage (hwnd,     TEXT ("Text not found!"),
        
                      TEXT ("\0")) ;
        
                       
        
                                  if (pfr->Flags & FR_REPLACEALL)
        
                                                 while (PopFindReplaceText (hwndEdit, &iOffset, pfr)) ;
        
                            
        

                                  return 0 ;

这一段下一章讲

最后讲个前提,要必须调用RegisterWindowMessage函数以得到FINDMSGSTRING信息的标识符,就是程序中的这个messageFindReplace = RegisterWindowMessage (FINDMSGSTRING) ;因为对话框函数在用户点击FindNext按钮或对话框被关闭时利用此标识符传送信息,写上messageFindReplace = RegisterWindowMessage (FINDMSGSTRING);这一句就定义了FINDMSGSTRING信息的标识符,然后点击按钮或对话框被关闭时,就可以利用此标识符传送信息,就是将这个标识符的IParam参数中放入定义的FINDMSGSTRING结构,然后传给应用程序,当然messageFindReplace这个变量可以另取别的名字

FindText如果调用成功返回值是对话框的窗口句柄,hDlgModeless取得窗口的句柄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值