PTFIND.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:
Windows编程
开发平台:
Visual C++
- #include "PortTool.h"
- /* global search string */
- char lpszSearch[MAXSEARCHSTRING+1] = "";
- HWND hDlgSearch;
- FINDREPLACE frSearch;
- /* compare two substrings */
- BOOL WINAPI RealSlowCompare (WORD, char *, char *);
- BOOL WINAPI RealSlowCompare (
- WORD wCase,
- char *lpszSubject,
- char *lpszTarget)
- {
- if (wCase)
- {
- while (*lpszTarget)
- if (*lpszTarget++ != *lpszSubject++)
- return FALSE;
- }
- else
- {
- while (*lpszTarget) {
- if (IsDBCSLeadByte(*lpszSubject) ||
- IsDBCSLeadByte(*lpszTarget)) {
- if (*lpszTarget++ != *lpszSubject++ ||
- *lpszTarget++ != *lpszSubject++) {
- return FALSE;
- }
- } else {
- if ((CHAR)(DWORD)CharLower ((char *)(DWORD)(BYTE)*lpszTarget++)
- != (CHAR)(DWORD)CharLower ((char *)(DWORD)(BYTE)*lpszSubject++)) {
- return FALSE;
- }
- }
- }
- }
- return TRUE;
- }
- /* invoke the common search/replace dialog */
- BOOL WINAPI FindDialog (
- HWND hWnd,
- WORD wCase,
- WORD wDir,
- char *lpszInit)
- {
- frSearch.lStructSize = sizeof (FINDREPLACE);
- frSearch.hwndOwner = hWnd;
- frSearch.hInstance = (HANDLE)GetWindowLong (hWnd, GWL_HINSTANCE);
- frSearch.Flags = FR_HIDEWHOLEWORD;
- /* if wCase, case sensitive */
- if (wCase)
- frSearch.Flags |= FR_MATCHCASE;
- /* if wDir, search forward */
- if (wDir)
- frSearch.Flags |= FR_DOWN;
- frSearch.lpstrFindWhat = lpszInit;
- frSearch.lpstrReplaceWith = NULL;
- frSearch.wFindWhatLen = MAXSEARCHSTRING+1;
- frSearch.wReplaceWithLen = 0;
- frSearch.lCustData = 0;
- frSearch.lpfnHook = NULL;
- frSearch.lpTemplateName = NULL;
- /* call common search dialog */
- if (hDlgSearch = FindText (&frSearch))
- return TRUE;
- else
- return FALSE;
- }
- /* perform the actual text searching in the edit control data */
- BOOL WINAPI LocateText (
- HWND hWnd,
- WORD wCase,
- WORD wDir,
- char *lpszStr)
- {
- UINT uBegSel, uEndSel, uOrgBegSel, uOrgEndSel;
- HANDLE hEditData;
- HWND hWndEdit = (HANDLE)GetWindowLong (hWnd, WL_HWNDEDIT);
- char *lpEditData;
- char *lpEditHead;
- UINT uLen;
- int nStrLen = strlen (lpszStr);
- int nChars;
- /* test for valid string */
- if (!*lpszStr)
- return FALSE;
- /* locate beginning of selected text */
- SendMessage (hWndEdit, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel);
- uOrgBegSel = uBegSel;
- uOrgEndSel = uEndSel;
- /* get length of the text */
- uLen = (UINT)SendMessage (hWndEdit, WM_GETTEXTLENGTH, 0, 0);
- /* Get handle to edit text data and lock it */
- #if !defined (WIN32)
- hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0);
- lpEditData = LocalLock (hEditData);
- lpEditHead = lpEditData;
- #else
- hEditData = LocalAlloc (LHND, uLen);
- lpEditData = LocalLock (hEditData);
- lpEditHead = lpEditData;
- GetWindowText (hWndEdit, lpEditData, uLen);
- #endif
- /* advance starting point past selection one char */
- if (wDir) {
- if (IsDBCSLeadByte(lpEditData[uBegSel])) {
- uBegSel += 2;
- } else {
- uBegSel += 1;
- }
- } else {
- if (IsDBCSLeadByte(*CharPrev(lpEditData, lpEditData + uBegSel))) {
- uBegSel -= 2;
- } else {
- uBegSel -= 1;
- }
- }
- lpEditData += uBegSel;
- /* count characters to search (either forward to end of file or back to beginning) */
- if (wDir)
- nChars = (int)(uLen - uBegSel + 1 - nStrLen);
- else
- nChars = (int)uBegSel;
- /* compare character by character for a substring match */
- //DBCS_FIX
- while ((wDir && nChars >= nStrLen) || (!wDir && nChars >= 0))
- {
- /* compare this substring for a match */
- if (RealSlowCompare (wCase, lpEditData, lpszStr))
- {
- /* string found, cleanup and go away */
- LocalUnlock(hEditData);
- /* scroll parent edit control and select offending text */
- SendMessage (hWndEdit, EM_LINESCROLL, 0,
- SendMessage (hWndEdit, EM_LINEFROMCHAR, uBegSel, 0) -
- SendMessage (hWndEdit, EM_GETFIRSTVISIBLELINE, 0, 0));
- /* Select the located string */
- uEndSel = uBegSel + nStrLen;
- SendMessage(hWndEdit, EM_SETSEL, uBegSel, uEndSel);
- /* return success */
- return TRUE;
- }
- if (wDir) {
- if (IsDBCSLeadByte(*lpEditData)) {
- nChars -= 2;
- lpEditData += 2;
- uBegSel += 2;
- } else {
- nChars--;
- lpEditData++;
- uBegSel++;
- }
- } else {
- lpEditData = CharPrev(lpEditHead, lpEditData);
- if (IsDBCSLeadByte(*lpEditData)) {
- nChars -= 2;
- uBegSel -= 2;
- } else {
- nChars--;
- uBegSel--;
- }
- }
- }
- LocalUnlock (hEditData);
- SendMessage (hWndEdit, EM_SETSEL, uOrgBegSel, uOrgEndSel);
- /* return failed search */
- return FALSE;
- }