接着我们继续,这次重点给大家讲讲查找功能,尽量语言明快简洁,少废话,少弄一些绕来绕去没意义的话
点那个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取得窗口的句柄