Программирование >>  Процедурные приложения 

1 ... 93 94 95 [ 96 ] 97 98 99 ... 150


В 32-разрядных версиях Windows параметр hPrelnst всегда равен NULL, поэтому подобная проверка избыточна.

В функцию Register-Class() передается указатель на только что созданную структуру класса окна. Если Windows не может зарегистрировать новый класс (скажем, в случае нехватки памяти), функция возвращает 0, вследствие чего выполнение программы завершается.

Создание окна

Регистрация класса окна еще не свидетельствует о создании самого окна. Окно создается в результате вызова функции CreateWindow(). Этот процесс одинаков во всех версиях Windows. В то время как класс окна определяет общие свойства всех окон данного семейства, параметры функции CreateWindowOзадают описание конкретного экземпляра окна. Если функция CreateWindow() выполняется успешно, она возвращает дескриптор созданного окна, в противном случае - null.

В файле SWP.Cфункция CreateWindow() вызывается следующим образом:

hWnd = CreateWindow(szProgNarae, SimpleWindowsProgram ,

WSJDVERLAPPEDWINDOW, CW USEDEFAOLT, CW USEDEFAULT, CW DSEDEFAULT, CWJJSEDEFAULT, (HWND)NULL, (HMENU)NULL, (HANDLE) hlnst, (LPSTR)NDLL;

Первый параметр, szProgName, содержит название класса окна. За ним в кавычках указывается содержимое строки заголовка окна - SimpleWindowProgram . Третий параметр задает стиль окна - ws overlappedwindow. Это стандартный стиль Windows, определяющий обычное масштабируемое окно со строкой заголовка, системным меню, кнопками свертывания, развертывания и закрытия, а также с рамкой.

Следующие шесть параметров (cw usedefault или null) определяют координаты начальной точки окна, его размеры, а также дескрипторы родительского окна и меню. Всем этим параметрам в нашем примере присвоены значения по умолчанию. Десятый параметр, hinst, содержит дескриптор экземпляра приложения. Окну не передаются никакие дополнительные значения, поэтому последний параметр равен NULL.

Отображение и обновление окна

Для отображения окна на экране предназначена функция ShowWindow(}: ShowWindow(hWnd, nCmdShow);

Дескриптор окна hwnd былсоздан функцией CreateWindow (). Второй параметр, nCmdShow, устанавливает режим начального отображения окна. Так, задание константы sw showminnoactive, определенной в файле WINUSER.H, приведет к отображению окна в виде значка на панели задач:

ShowWindow(hWnd, SW SHOWMINNOACTIVE);

Константа sw showmaximized отвечает за развертывание окна на весь экран. Режим sw showminimized аналогичен режиму sw showminnoactive за исключением того, что окно остается активным, т.е. имеет фокус.

Последний этап выведения окна на экран реализует функция UpdateWindow():

UpdateWindow(hWnd);

Вызов функции ShowWindow() с установленным параметром sw shownormal приводит к заливке фона окна выбранной кистью. А функция UpdateWindow (генерирует сообщение wm paint, указывающее на формирование содержимого рабочей области окна.

Цикл обработки сообщений

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



может содержать сообщения как сгенерированные самой системой, так и поступившие от других приложений.

Как правило, цикл организуется с помощью такой конструкции:

while (GetMessage(&lpMsg, NULL, 0, 0) ) { TranslateMessage(SlpMsg) ; DispatchMessage(slpMsg);}

Функция GetMessage( )

Функция GetMessage() читает очередное сообщение из очереди и записывает его в структуру msg, адресуемую указателем IpMsg.

Установка второго параметра равным NULLсвидетельствует о том, что читаться должны сообщения, адресованные любому окну приложения. Два других параметра формируют фильтр сообщений, который ограничивает получаемые сообщения определенным диапазоном (например, только сообщения мыши). Если эти параметры равны нулю, как в нашем случае, то принимаются любые сообщения, адресованные данному приложению.

После запуска цикла только одно сообщение может остановить его выполнение. Как только в цикл передается сообщение wm quit, функция GetMessage() возвращает значение false, в результате чего цикл завершается, выполняются заключительные операции функции winMain() и работа приложения прекращается.

Функция TranslateMessage( )

Сообщения о нажатии виртуальных клавиш могут быть преобразованы в символьные сообщения с помощью функции TranslateMessage(), которая формирует сообщение wm charиз пары wm keydown/wm keyup. Эта функция необходима только тем приложениям, которые обрабатывают ввод данных с клавиатуры. Важность функции заключается в том, что она позволяет пользователям выбирать команды меню путем нажатия клавиш, а не только щелчками тныши.

Функция DispatchMessage( )

Функция DispatchMessage() направляет полученное сообщение соответствующей оконной процедуре, автоматически определяя окно, которому адресовано сообщение.

Оконная процедура

Оконная процедура регистрируется в системе и вызывается всякий раз, когда Windowsвыполняет какую-либо операцию над окном приложения. В следующем фрагменте показан текст этой процедуры из файла SWP.C(за исключением нескольких специфичных для приложения строк):

LRESULT CALLBACK WndProc(HWND hWnd, UINT messg,

WPARAM wParam, LPARAM IParam) { HOC hdc; PAINTSRUCT ps; switch (messg) { case WM PAINT:

hdc = BeginPaint (hWnd, Sps);

ValidateRect(hWnd, NULL);

EndPaint(hWnd, &ps); break; case WM DESTROY: PostQuitMessage (0); break;

default:

return(DefWindowProc(hWnd, messg, wParam, IParam));

return(0);



Windows предполагает, что имя этой процедуры указанно в поле ipfnWndProcструктуры wcApp, описывающей класс окна. Все окна, созданные на базе данного класса, будут управляться процедурой WndProc().

В Windowsсуществует более двухсот различных сообщений, которые могут посылаться окнам. Все они имеют префикс wm (windowmessage- оконное сообщение), например: wm create, wm size, wm paint.

Первым параметром процедуры WndProc() является дескриптор окна, которому посылается сообщение. Поскольку одна процедура может обрабатывать сообщения сразу нескольких окон, этот дескриптор позволяет определить, какому именно окну адресовано сообщение. .Второй параметр содержит идентификатор сообщения. Два оставшихся параметра, wParamи IParam, несут дополнительную информацию, зависящую от конкретного сообщения.

В нашей процедуре WndProc() определяются две локальные переменные: hdc, содержащая дескриптор контекста устройства (экрана), и ps, задающая структуру paintstruct, которая необходима для хранения информации, отображаемой в рабочей области окна.

Обработка самих сообщений осуществляется с помощью стандартной конструкции switch, которая может быть довольно большой (ее размер зависит от чиcла обрабатываемых сообщений).

Обработка сообщения WM PAINT

Первое сообщение, которое в нашем примере обрабатывает процедура HndProc(), - это WM PAINT. Поскольку Windows является многозадачной системой, то одно приложение может открыть свое окно поверх окна другого приложения. Это создает определенную проблему, так как при закрытии или перемещении верхнего окна нижнее не знает о происходящем, в результате чего Область, которую занимало верхнее окно, становится некорректной. Windows решает данную проблему путем направления сообщения wm paintнижнему окну, информируя о том, что его содержимое требует обновления.

Помимо самого первого сообщения wm paint, которое генерируется функцией UpdateWindow() внутри функции WinMain(), сообщение WM PAINT также посылается в следующих ситуациях:

при вызове функции InvalidateRect() или InvalidateRgn();

при изменении размеров окна;

при вызове функции ScrollWindow();

каждый раз, когда рабочая область окна перекрывается ниспадающим меню или диалоговым окном, после их закрытия.

Любая часть окна, которая была закрыта другим объектом, например диалоговым окном, помечается как недействительная. Наличие недействительной области заставляет Windows послать приложению сообщение wm paint, причем система отслеживает координаты такой области. Если окно оказалась закрыто несколькими объектами, Windowsвычислит координаты суммарной области. Другими словами, Windows не станет посылать несколько сообщений wm paint для каждого отдельно взятого прямоугольного участка, а сгенерирует одно сообщение сразу для всей недействительной области сложной формы.

При обработке сообщения wm paint вначале выполняется функция BeginPaint (), которая подготавливает указанное окно к операции рисования, заполняет структуру paintstruct данными об обновляемой области и возвращает дескриптор контекста устройства, связанного с этим окном.

Вызов функции invalidateRect() заставляет Windowsпометить указанную область окна как недействительную и сгенерировать для нее сообщение wm paint. Приложение может получить координаты этой области, вызвав функцию GetUpdateRect (). Функция ValidateRect () удаляет указанный фрагмент из определения области, требующей перерисовки.

Функция EndPaint() вызывается всякий раз по завершении операций вывода данных в рабочую область окна. Функция ставит Windowsв известность, что приложение закончило обработку сообщений о перерисовке и имеющийся контекст устройства можно удалить.



1 ... 93 94 95 [ 96 ] 97 98 99 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика