PTFIND.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. #include "PortTool.h"
  2. /* global search string */
  3. char    lpszSearch[MAXSEARCHSTRING+1] = "";
  4. HWND    hDlgSearch;
  5. FINDREPLACE    frSearch;
  6. /* compare two substrings */
  7. BOOL WINAPI RealSlowCompare (WORD, char *, char *);
  8. BOOL WINAPI RealSlowCompare (
  9.     WORD    wCase,
  10.     char    *lpszSubject,
  11.     char    *lpszTarget)
  12. {
  13.     if (wCase)
  14. {
  15. while (*lpszTarget)
  16.     if (*lpszTarget++ != *lpszSubject++)
  17. return FALSE;
  18. }
  19.     else
  20. {
  21. while (*lpszTarget) {
  22.     if (IsDBCSLeadByte(*lpszSubject) ||
  23. IsDBCSLeadByte(*lpszTarget)) {
  24. if (*lpszTarget++ != *lpszSubject++ ||
  25.     *lpszTarget++ != *lpszSubject++) {
  26.     return FALSE;
  27. }
  28.     } else {
  29. if ((CHAR)(DWORD)CharLower ((char *)(DWORD)(BYTE)*lpszTarget++)
  30.  != (CHAR)(DWORD)CharLower ((char *)(DWORD)(BYTE)*lpszSubject++)) {
  31.     return FALSE;
  32. }
  33.     }
  34. }
  35. }
  36.     return TRUE;
  37. }
  38. /* invoke the common search/replace dialog */
  39. BOOL WINAPI FindDialog (
  40.     HWND    hWnd,
  41.     WORD    wCase,
  42.     WORD    wDir,
  43.     char    *lpszInit)
  44. {
  45.     frSearch.lStructSize      = sizeof (FINDREPLACE);
  46.     frSearch.hwndOwner        = hWnd;
  47.     frSearch.hInstance        = (HANDLE)GetWindowLong (hWnd, GWL_HINSTANCE);
  48.     frSearch.Flags            = FR_HIDEWHOLEWORD;
  49.     /* if wCase, case sensitive */
  50.     if (wCase)
  51. frSearch.Flags        |= FR_MATCHCASE;
  52.     /* if wDir, search forward */
  53.     if (wDir)
  54. frSearch.Flags        |= FR_DOWN;
  55.     frSearch.lpstrFindWhat    = lpszInit;
  56.     frSearch.lpstrReplaceWith = NULL;
  57.     frSearch.wFindWhatLen     = MAXSEARCHSTRING+1;
  58.     frSearch.wReplaceWithLen  = 0;
  59.     frSearch.lCustData        = 0;
  60.     frSearch.lpfnHook         = NULL;
  61.     frSearch.lpTemplateName   = NULL;
  62.     /* call common search dialog */
  63.     if (hDlgSearch = FindText (&frSearch))
  64. return TRUE;
  65.     else
  66. return FALSE;
  67. }
  68. /* perform the actual text searching in the edit control data */
  69. BOOL WINAPI LocateText (
  70.     HWND        hWnd,
  71.     WORD        wCase,
  72.     WORD        wDir,
  73.     char        *lpszStr)
  74. {
  75.     UINT    uBegSel, uEndSel, uOrgBegSel, uOrgEndSel;
  76.     HANDLE  hEditData;
  77.     HWND    hWndEdit = (HANDLE)GetWindowLong (hWnd, WL_HWNDEDIT);
  78.     char    *lpEditData;
  79.     char    *lpEditHead;
  80.     UINT    uLen;
  81.     int     nStrLen = strlen (lpszStr);
  82.     int     nChars;
  83.     /* test for valid string */
  84.     if (!*lpszStr)
  85. return FALSE;
  86.     /* locate beginning of selected text */
  87.     SendMessage (hWndEdit, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel);
  88.     uOrgBegSel = uBegSel;
  89.     uOrgEndSel = uEndSel;
  90.     /* get length of the text */
  91.     uLen = (UINT)SendMessage (hWndEdit, WM_GETTEXTLENGTH, 0, 0);
  92.     /* Get handle to edit text data and lock it */
  93. #if !defined (WIN32)
  94.     hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0);
  95.     lpEditData = LocalLock (hEditData);
  96.     lpEditHead = lpEditData;
  97. #else
  98.     hEditData = LocalAlloc (LHND, uLen);
  99.     lpEditData = LocalLock (hEditData);
  100.     lpEditHead = lpEditData;
  101.     GetWindowText (hWndEdit, lpEditData, uLen);
  102. #endif
  103.     /* advance starting point past selection one char */
  104.     if (wDir) {
  105.         if (IsDBCSLeadByte(lpEditData[uBegSel])) {
  106.             uBegSel += 2;
  107.         } else {
  108.             uBegSel += 1;
  109.         }
  110.     } else {
  111.         if (IsDBCSLeadByte(*CharPrev(lpEditData, lpEditData + uBegSel))) {
  112.             uBegSel -= 2;
  113.         } else {
  114.             uBegSel -= 1;
  115.         }
  116.     }
  117.     lpEditData += uBegSel;
  118.     /* count characters to search (either forward to end of file or back to beginning) */
  119.     if (wDir)
  120. nChars = (int)(uLen - uBegSel + 1 - nStrLen);
  121.     else
  122. nChars = (int)uBegSel;
  123.     /* compare character by character for a substring match */
  124.     //DBCS_FIX
  125.     while ((wDir && nChars >= nStrLen) || (!wDir && nChars >= 0))
  126. {
  127. /* compare this substring for a match */
  128. if (RealSlowCompare (wCase, lpEditData, lpszStr))
  129.     {
  130.     /* string found, cleanup and go away */
  131.     LocalUnlock(hEditData);
  132.     /* scroll parent edit control and select offending text */
  133.     SendMessage (hWndEdit, EM_LINESCROLL, 0,
  134. SendMessage (hWndEdit, EM_LINEFROMCHAR, uBegSel, 0) -
  135. SendMessage (hWndEdit, EM_GETFIRSTVISIBLELINE, 0, 0));
  136.     /* Select the located string */
  137.     uEndSel = uBegSel + nStrLen;
  138.     SendMessage(hWndEdit, EM_SETSEL, uBegSel, uEndSel);
  139.     /* return success */
  140.     return TRUE;
  141.     }
  142. if (wDir) {
  143.     if (IsDBCSLeadByte(*lpEditData)) {
  144. nChars -= 2;
  145. lpEditData += 2;
  146. uBegSel += 2;
  147.     } else {
  148. nChars--;
  149. lpEditData++;
  150. uBegSel++;
  151.     }
  152. } else {
  153.     lpEditData = CharPrev(lpEditHead, lpEditData);
  154.     if (IsDBCSLeadByte(*lpEditData)) {
  155. nChars -= 2;
  156. uBegSel -= 2;
  157.     } else {
  158. nChars--;
  159. uBegSel--;
  160.     }
  161. }
  162. }
  163.     LocalUnlock (hEditData);
  164.     SendMessage (hWndEdit, EM_SETSEL, uOrgBegSel, uOrgEndSel);
  165.     /* return failed search  */
  166.     return FALSE;
  167. }