|
|
1.1 ! root 1: ! 2: /******************************************************************************\ ! 3: * This is a part of the Microsoft Source Code Samples. ! 4: * Copyright (C) 1993 Microsoft Corporation. ! 5: * All rights reserved. ! 6: * This source code is only intended as a supplement to ! 7: * Microsoft Development Tools and/or WinHelp documentation. ! 8: * See these sources for detailed information regarding the ! 9: * Microsoft samples programs. ! 10: \******************************************************************************/ ! 11: ! 12: #include "PortTool.h" ! 13: ! 14: /* global search string */ ! 15: char lpszSearch[MAXSEARCHSTRING+1] = ""; ! 16: HWND hDlgSearch; ! 17: ! 18: FINDREPLACE frSearch; ! 19: ! 20: ! 21: /* compare two substrings */ ! 22: BOOL WINAPI RealSlowCompare (WORD, char *, char *); ! 23: BOOL WINAPI RealSlowCompare ( ! 24: WORD wCase, ! 25: char *lpszSubject, ! 26: char *lpszTarget) ! 27: { ! 28: if (wCase) ! 29: { ! 30: while (*lpszTarget) ! 31: if (*lpszTarget++ != *lpszSubject++) ! 32: return FALSE; ! 33: } ! 34: else ! 35: { ! 36: /* convert to lower case before comparing */ ! 37: CharLower ((char *)lpszTarget); ! 38: while (*lpszTarget) ! 39: if (*lpszTarget++ != (CHAR)(DWORD)CharLower ((char *)(DWORD)(BYTE)*lpszSubject++)) ! 40: return FALSE; ! 41: } ! 42: return TRUE; ! 43: } ! 44: ! 45: ! 46: ! 47: ! 48: /* invoke the common search/replace dialog */ ! 49: BOOL WINAPI FindDialog ( ! 50: HWND hWnd, ! 51: WORD wCase, ! 52: WORD wDir, ! 53: char *lpszInit) ! 54: { ! 55: frSearch.lStructSize = sizeof (FINDREPLACE); ! 56: frSearch.hwndOwner = hWnd; ! 57: frSearch.hInstance = (HANDLE)GetWindowLong (hWnd, GWL_HINSTANCE); ! 58: frSearch.Flags = 0; ! 59: ! 60: /* if wCase, case sensitive */ ! 61: if (wCase) ! 62: frSearch.Flags |= FR_MATCHCASE; ! 63: /* if wDir, search forward */ ! 64: if (wDir) ! 65: frSearch.Flags |= FR_DOWN; ! 66: ! 67: frSearch.lpstrFindWhat = lpszInit; ! 68: frSearch.lpstrReplaceWith = NULL; ! 69: frSearch.wFindWhatLen = MAXSEARCHSTRING+1; ! 70: frSearch.wReplaceWithLen = 0; ! 71: frSearch.lCustData = 0; ! 72: frSearch.lpfnHook = NULL; ! 73: frSearch.lpTemplateName = NULL; ! 74: ! 75: /* call common search dialog */ ! 76: if (hDlgSearch = FindText (&frSearch)) ! 77: return TRUE; ! 78: else ! 79: return FALSE; ! 80: } ! 81: ! 82: ! 83: ! 84: /* perform the actual text searching in the edit control data */ ! 85: BOOL WINAPI LocateText ( ! 86: HWND hWnd, ! 87: WORD wCase, ! 88: WORD wDir, ! 89: char *lpszStr) ! 90: { ! 91: UINT uBegSel, uEndSel, uOrgBegSel, uOrgEndSel; ! 92: HANDLE hEditData; ! 93: HWND hWndEdit = (HANDLE)GetWindowLong (hWnd, WL_HWNDEDIT); ! 94: char *lpEditData; ! 95: UINT uLen; ! 96: int nStrLen = strlen (lpszStr); ! 97: int nChars; ! 98: ! 99: /* test for valid string */ ! 100: if (!*lpszStr) ! 101: return FALSE; ! 102: ! 103: /* locate beginning of selected text */ ! 104: SendMessage (hWndEdit, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel); ! 105: uOrgBegSel = uBegSel; ! 106: uOrgEndSel = uEndSel; ! 107: ! 108: /* get length of the text */ ! 109: uLen = (UINT)SendMessage (hWndEdit, WM_GETTEXTLENGTH, 0, 0); ! 110: ! 111: /* Get handle to edit text data and lock it */ ! 112: hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0); ! 113: lpEditData = LocalLock (hEditData); ! 114: ! 115: /* advance starting point past selection one char */ ! 116: lpEditData += (wDir ? ++uBegSel : --uBegSel); ! 117: ! 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: ! 124: /* compare character by character for a substring match */ ! 125: while (nChars >= nStrLen) ! 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: ! 133: /* scroll parent edit control and select offending text */ ! 134: SendMessage (hWndEdit, EM_LINESCROLL, 0, ! 135: SendMessage (hWndEdit, EM_LINEFROMCHAR, uBegSel, 0) - ! 136: SendMessage (hWndEdit, EM_GETFIRSTVISIBLELINE, 0, 0)); ! 137: ! 138: /* Select the located string */ ! 139: uEndSel = uBegSel + nStrLen; ! 140: SendMessage(hWndEdit, EM_SETSEL, uBegSel, uEndSel); ! 141: ! 142: /* return success */ ! 143: return TRUE; ! 144: } ! 145: ! 146: nChars--; ! 147: ! 148: /* increment/decrement start position by 1 */ ! 149: lpEditData += (wDir ? 1 : -1); ! 150: wDir ? uBegSel++ : uBegSel--; ! 151: } ! 152: ! 153: LocalUnlock (hEditData); ! 154: SendMessage (hWndEdit, EM_SETSEL, uOrgBegSel, uOrgEndSel); ! 155: ! 156: /* return failed search */ ! 157: return FALSE; ! 158: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.