Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
43-70_otvety_na_teplogo.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
87.53 Кб
Скачать

51. Введение новой оконной процедуры для управления фокусом дочерних окон управления и изменения функций дочерних окон.

Получить адрес стандартной оконной процедуры можно с помощью вызова функции GetWindowLong, в которой в качестве параметра используется идентификатор GWL_WNDPROC. Более того, вызывая функцию SetWindowLong, вы можете задать новую оконную процедуру. Это очень мощный прием, который называется "введение новой оконной процедуры". Он позволяет вам "влезть" в существующие внутри Windows оконные процедуры, обработать некоторые сообщения внутри вашей собственной программы, а все остальные сообщения оставить прежней оконной процедуре.

fnOldEdit = GetWindowLong (hWnd, GWL_WNDPROC, hEdit, NewProcEdit)

Такая конструкция вернет указатель на стандартную оконную процедуру Edit и перенаправляет сообщение редактора в NewProcEdit. Поскольку NewProcEdit является функцией программы, которая вызывается операционной системой Windows, то она должна определяться как функция обратного вызова (CALLBACK). для установки адреса новой оконной процедуры, а также для получения адреса существующей оконной процедуры полосы прокрутки, используется функция SetWindowLong например:

fnOldScr =(WNDPROC) SetWindowLong(hwndScrol, GWL_WNDPROC,(LONG) ScrollProc));

Для вызова оконных процедур, вы должны использовать функцию CallWindowProc.

52. Класс редактирования(edit). Основные стили класса, назначение и использование окон редактирования.

Стили окна(Из Питзольда) Как уже говорилось, мы создаем управляющее окно редактирования, используя в качестве имени класса окна

"edit" при вызове функции CreateWindow. Стилем окна является WS_CHILD и еще несколько опций. Как и в статических дочерних окнах управления, текст в управляющих окнах редактирования может быть выравнен либо по левому краю, либо по правому, либо по центру. Формат можно задать с помощью стилей окна ES_LEFT, ES_RIGHT и ES_CENTER.

По умолчанию в управляющем окне редактирования имеется одна строка. Вы можете создать многострочное управляющее окно редактирования, используя стиль окна ES_MULTILINE. Для однострочного управляющего окна редактирования обычно можно вводить текст только в конце прямоугольника редактирования. Для создания управляющего окна редактирования с автоматической горизонтальной прокруткой используйте стиль ES_AUTOHSCROOL. Для многострочного управляющего окна редактирования, если не задан стиль ES_AUTOHSCROOL, то текст автоматически переносится на новую строку. При задании этого стиля для перехода на

новую строку нужно нажимать клавишу <Enter>. Используя стиль окна ES_AUTOVSCROOL, в многострочное управляющее окно редактирования можно включить полосу вертикальной прокрутки. Если вы включите эти стили прокрутки в многострочные управляющие окна редактирования, то вы можете добавить полосы прокрутки к управляющему окну редактирования. Это делается путем использования тех же идентификаторов стиля окна, что и для недочерних окон: WS_HSCROLL и WS_VSCROLL. По умолчанию в управляющем окне редактирования отсутствует рамка окна. Добавить ее можно, используя стиль

WS_BORDER. У нас в лаб. Работе создавался такой стиль.

CreateWindow задается равным:

WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE |

ES_AUTOHSCROLL | ES_AUTOVSCROLL

Назначение и использование

По умолчанию создается прямоугольное окно, однострочное. При получении фокуса появляется в окне каретка. В таком применении окно edit используется для ввода текстовой информации. Одним из простейших применений окон редактирования — элементов управления (или управляющих окон редактирования, edit controls) является простое однострочное окно ввода данных. Но окна редактирования не ограничены только одной строкой, могут использоваться так же с целью

использования окон меню, диалога (для открытия и сохранения файлов) и принтеров.

Нам необходимо чтобы окно редактирования при получении сообщения от Еnter послало WM_COMMAND родителю с кодом Enter.

Для решения задачи создается new proc edit. Она будет получать все сообщения от едит, а обрабатывать будет только сообщения от Ентер. Затем все сообщения включая сообщения от едит пересылать на обработку станд. Обработчику edit. Такой подход напоминает перехват под DОS.

Сall Back New Proc Edit(HWND, &Msg, wParam, lParam)

If ( msg== WM_keydown&&VK_RETURN==wParam)

sendmessage(Get Parent(hwnd) ), vm_command

MakeLong(Id_edit, Vk_return, hwnd);

CallWndProc(fnOldEdit, hwnd, Imsg, wParam, lParam)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]