4.35.6 - Поиск текста

Эта статья описывает типовой код, который показывает и управляет диалоговым окном Найти (Find), так что пользователь может устанавливать параметры операции поиска. Диалоговое окно посылает сообщения вашей оконной процедуре, так что Вы можете выполнять операцию поиска.

Код для отображения и управления диалоговым окном Заменить (Replace) сходен с вышеупомянутым диалогом, за исключением того, что он использует функцию ReplaceText, чтобы показать диалоговое окно. Диалоговое окно Заменить (Replace) также посылает сообщения в ответ на щелчок пользователя по кнопке Заменить (Replace) и Заменить все (Replace All).

Чтобы использовать диалоговое окно Найти (Find) или Заменить (Replace), вы должны выполнить три отдельные задачи:

  1. Получить идентификатор зарегистрированного сообщения FINDMSGSTRING.
  2. Показать диалоговое окно.
  3. Обработать сообщения FINDMSGSTRING, когда диалоговое окно открыто

Когда вы инициализируете вашу прикладную программу, вызовите функцию RegisterWindowMessage, чтобы получить идентификатор сообщения для зарегистрированного сообщения FINDMSGSTRING.

UINT uFindReplaceMsg;  		// идентификатор сообщения для FINDMSGSTRING
uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING);

Чтобы показать диалоговое окно Найти (Find), сначала инициализируйте структуру FINDREPLACE, а затем вызовите функцию FindText. Обратите внимание, что структура FINDREPLACE и буфер для строки для поиска должны быть глобальной или статической переменной, так что она не выходила за пределы области действия до того, как диалоговое окно закроется. Вы должны установить элемент hwndOwner, чтобы определить окно, которое примет зарегистрированные сообщения. После того, как вы создадите диалоговое окно, вы можете перемещать или управлять им, используя возвращенный дескриптор.

FINDREPLACE fr;      		// структура стандартного диалогового окна
HWND hwnd;            		// окно владелец
CHAR szFindWhat[80];  		// буфер, принимающий строку
HWND hdlg = NULL;     		// дескриптор диалогового окна Найти (Find)

// инициализация FINDREPLACE
ZeroMemory(&fr, sizeof(FINDREPLACE));
fr.lStructSize = sizeof(FINDREPLACE);
fr.hwndOwner = hwnd;
fr.lpstrFindWhat = szFindWhat;
fr.wFindWhatLen = 80;
fr.Flags = 0;
hdlg = FindText(&fr);

Когда диалоговое окно открыто, ваш основной цикл обработки сообщений должен включать в себя вызов функции IsDialogMessage. Передайте дескриптор диалогового окна как параметр при вызове IsDialogMessage. Это гарантирует то, что диалоговое окно правильно обработает сообщения клавиатуры.

Чтобы контролировать сообщения, посланные из диалогового окна, ваша оконная процедура должна проверять зарегистрированное сообщение FINDMSGSTRING и обрабатывать значения, переданные в структуру FINDREPLACE как в примере ниже:

LPFINDREPLACE lpfr;

if (message == uFindReplaceMsg){
	// Получим из lParam указатель на структуру FINDREPLACE.

	lpfr = (LPFINDREPLACE)lParam;

	// Если флажок установлен FR_DIALOGTERM, значит дескриптор,
	// идентифицирующий диалоговое окно, неверный.

	if (lpfr->Flags & FR_DIALOGTERM)
	{
		hdlg = NULL;
		return 0;
	}

	// Если флажок установлен FR_FINDNEXT, то вызывается определяемая программой
	// подпрограмма поиска, чтобы найти затребованную строку.

	if (lpfr->Flags & FR_FINDNEXT)
		SearchFile(lpfr->lpstrFindWhat,
			(BOOL) (lpfr->Flags & FR_DOWN),
			(BOOL) (lpfr->Flags & FR_MATCHCASE));
	return 0;
}

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Владимир Соковиков - 15.04.2002