Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Разработка приложений Win32. Шаблон приложения win32swp. Особенности поддержки Win32 в win32swp. C. Функция winmain(). Регистрация класса окна. Создание окна.

Читайте также:
  1. D - группировка и разработка статистического материала.
  2. I. Особенности правового статуса акционерного общества.
  3. I/ Л РАЗРАБОТКА ПЛАТЕЖНОГО Ю.1. КАЛЕНДАРЯ
  4. II. Заполнение бланков аттестатов и приложений к ним
  5. II. Регистрация документов.
  6. III. Игра и состязание как культуросозидающая функция .... 60
  7. III. Особенности учебного процесса.

Компоненты приложения Windows

На самом высоком уровне мы можем разделить приложение Windows на две основные составляющие: функция WinMainO и функция окна. Microsoft Windows требует, чтобы главная процедура в программе на С называлась WinMainO. Эта функция выступает в качестве точки входа для приложения. Для обеспечения связи Windows требуется специальная функция, называемая функцией обратного вызова (callback function). Windows регистрирует функцию обратного вызова, а затем, при необходимости произвести над окном какую-либо операцию, вызывает ее.

Функция WinMain()

Каждое приложение Windows должно иметь функцию WinMainO. Функция WinMainO выполняет следующие действия:

· Регистрирует все классы окна для приложения

· Производит необходимую инициализацию

· Создает и запускает цикл обработки сообщений приложения

· Обращается к очереди сообщений приложения

· Завершает приложение по получении сообщения WM_QUIT

 

WinMain() получает от Windows четыре параметра. В приложении 22SWA.C прототип функции WinMain() выглядит так:

 

int PASCAL WinMain(hInst,hPreInst,lpszCmdLine,nCmdShow)

HINSTANCE hInst,hPreInst;

LPSTR lpszCmdLine;

int nCmdShow;

 

Регистрация класса окна

Каждое окно, создаваемое в приложении Windows, должно принадлежать к какому-либо классу. Создаваемые вами окна могут иметь разнообразные стили, цвета, шрифты, расположение, заголовки, значки и так далее. Ресурсом, определяющим эти атрибуты, служит класс окна (window class). Как только приложение зарегистрировало класс окна, он становится доступным для всех программ, работающих под Windows. По этой причине вам надо будет следить, чтобы имена классов окна в различных приложениях не совпадали.

Класс окна — это, в сущности, структура данных.

В Windows существует несколько предопределенных классов окна, но большинство приложений определяет свои классы. Для регистрации класса необходимо объявить переменную типа WNDCLASS:

WNDCLASS wc22SWA;

После этого структура wc22SWA заполняется информацией о классе окна. Элементы структуры WNDCLASS описаны далее. Для некоторых из них можно использовать предопределенные значения (присвоив соответствующему полю ноль), другим, наоборот, должно быть задано конкретное значение.

Поле style задает стиль класса окна. Константы, определяющие стиль, можно комбинировать при помощи поразрядной операции ИЛИ. Стиль можно задавать комбинацией следующих констант:

Поле hIсоn определяет значок, который должен использоваться для представления окна в свернутом состоянии. Это поле может иметь нулевое значение.

Поле hCursor определяет курсор, который должен использоваться при нахождении мыши в рабочей области окна. Это поле также может иметь нулевое значение.

Поле hbrBackground задает кисть для фона окна. Оно может содержать описатель существующей кисти либо определяющую цвет константу, увеличенную на 1

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

Поле IpszClassName содержит указатель на строку, заканчивающуюся нулем. Строка задает имя класса окна.

И др.

Как уже говорилось, приложению необходимо регистрировать класс окна лишь тогда, когда запускается его первый экземпляр. Приложение Windows может проверить, был ли до него запущен предыдущий экземпляр. Для этого надо проверить параметр hPreInst если он равен нулю, значит, данный экземпляр является первым экземпляром приложения. Таким образом, оператор if заполняет структуру WNDCLASS только в первом экземпляре приложения. Последний оператор if выполняет собственно регистрацию класса окна: дальний указатель на структуру окна передается в функцию RegisterClass(). При этом ближний указатель (&ws22SWA) автоматически приводится к дальнему, поскольку функция RegisterClass() требует в качестве аргумента дальний указатель. Если при регистрации класса происходит ошибка, функция RegisterClass() возвращает ноль, и приложение завершается.

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

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

 

111. Разработка приложений Win32. Отображение и перерисовка окна. Цикл обработки

сообщений. Функция GetMessage(). Функция TranslateMessage(). Функция DispatchMessage().

 

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

Чтобы окно появилось на экране, недостаточно лишь зарегистрировать класс и создать окно этого класса. После всего этого необходимо еще обратиться к функции ShowWindowO:

ShowWindow(hWnd,nCmdShow);

Второй параметр, nCmdShow, определяет способ отображения окна. Значение nCmdShow может указать, что окно должно отображаться в обычном виде (SW_SHOWNORMAL), но есть и еще несколько возможностей. Например, задав в качестве nCmdShow константу SW_SHOWMINNOACTTVE, определенную в WINDOWS.H, можно заставить Windows отобразить окно в виде значка:

ShowWindow(hWnd,SW_SHOWMINNOACTIVE);

Остальные варианты включают SW_SHOWMAXIMIZED, что приводит к активизации окна и развертыванию на весь экран, и противоположность этому, SW_SHOWMINIMIZED.

Последним шагом в изображении окна должен быть вызов функции UpdateWmdow():

UpdateWindow(hWnd);

Когда вызывается ShowWindow() с параметром SW_SHOWNORMAL, рабочая область окна очищается при помощи фоновой кисти. (Вспомним, что в данном приложении для этого используется кисть WHITE_BRUSH.) Вызов UpdateWindow() заставляет перерисовать рабочую область, посылая сообщение WM_PAINT.

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

Когда окно приложения создано и отображено на экране, программа готова приступить к своей главной задаче — обработке сообщений. Напомним. что Windows не направляет сигналы от клавиатуры или мыши прямо в приложение. Вместо этого Windows помещает сообщения в очередь приложения. В эту очередь могут попасть сообщения, посланные Windows или другими приложениями. Как только функция WinMain() создала окно и вывела его на экран, необходимо создать цикл обработки сообщений (message loop). Этот цикл обычно организуется при помощи ключевого слова while:

while (GetMessage(&msg,0,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

 

Функция GetMessage()

Эта функция предназначена для получения следующего сообщения из очереди приложения, копирования его в структуру msg и передачи в основную программу. Три нулевых аргумента указывают, что следует принимать любые сообщения.

Windows З.х является системой с невытесняющей многозадачностью (nonpreemptive multitasking system), то есть она не может отобрать управление у приложения. Приложение должно само вернуть управление системе, и только тогда Windows сможет передать управление другой программе. В этой системе функция GetMessage() может автоматически передать управление другим, если у данного приложения нет сообщений в очереди. Когда в очередь вновь поступит сообщение, приложение возобновит работу в точке, непосредственно следующей за обращением к GetMessage().

ПРИМЕЧАНИЕ. И Windows 95, и Windows NT являются системами с вытесняющей многозадачностью (preemptive multitasking systems). Они могут полностью распоряжаться приложениями, запущенными под их управлением.

Приложение вполне может вернуть управление Windows и до входа в цикл обработки сообщений.

Функция TranslateMessage()

Функция TranslateMessage() необходима только в тех программах, которые обрабатывают ввод с клавиатуры. Возможность обрабатывать нажатия клавиш очень полезна, поскольку дает возможность пользователю делать выбор из меню без помощи мыши. При поступлении сообщений WM_KEYDOWN и WM_KEYUP функция TranslateMessage() создает сообщение WM_CHAR, содержащее информацию об ASCII коде нажатой клавиши. Если в цикле обработки сообщений есть обращение к этой функции, программа может пользоваться интерфейсом клавиатуры.

 

Функция DispatchMossage()

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

 

 

112 Разработка приложений Win32. Функция окна. Обработка сообщений WM_PAINT. Обработка сообщения WM_DESTROY. Функция DefWIndowProc().

 

Как уже говорилось, в каждом приложении должна быть функция WinMain() и функция окна (window function). Вспомним, что приложение Windows никогда не обращается к функциям окна непосредственно. Вместо этого программа посылает Windows запрос на выполнение данной операции. При этом используется функция обратного вызова. Windows регистрирует функцию обратного вызова, а затем при необходимости произвести над окном какую-либо операцию, вызывает ее. Сама функция окна может оказаться очень простой, обрабатывающей одно-два сообщения, а может быть и чрезвычайно сложной. Нетривиальные функции окна не только обрабатывают много типов сообщений, но и управляют различными окнами приложения.

Windows может посылать функции окна сообщения сотен различных типов. Тип сообщения задается константами, определенными в WINDOWS.H с префиксом WM_. Windows обращается к функции окна по различным поводам: при создании, перемещении, свертывании окна, изменении его размеров, при выборе пункта меню, при движении бегунка по полосе прокрутки, при необходимости перерисовать рабочую область, и наконец, при уничтожении окна.

Сообщение WM_PAINT

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

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

За исключением самого первого сообщения WM_PAINT, посылаемого окну при вызове UpdateWindow() из WmMain(), эти сообщения будут посланы в следующих случаях:

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

· если часть рабочей области была скрыта меню или окном диалога, которое в данный момент закрывается

· при использовании функции ScrollWindow()

· при принудительной генерации сообщения WM_PAINT вызовом функций InvalidateRect() или InvaUdateRgn()

 

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

Вызов функции InvalidateRect() заставляет Windows пометить некоторую область как недействительную, вызывая таким образом сообщение WM_PAINT. Приложение может узнать координаты недействительной области, обратившись к функции GetUpdateRect(). Вызвав функцию ValidateRect(), можно отменить пометку заданной области как недействительной и удалить сообщения WM_PAINT, ожидающие обработки.

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

Можно завершить приложение, выбрав Close из оконного меню. При этом окну будет послано сообщение WM_DESTROY. Обрабатывая WM_DESTROY, функция окна вызывает PostQuitMessage(), которая помещает в очередь сообщение WM_QUIT. После получения этого сообщения приложение заканчивает работу.

Все сообщения, не обрабатываемые данной функцией окна, передаются для обработки в функцию DefWindowProc(), стандартную функцию окна.


Дата добавления: 2015-12-08; просмотров: 63 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.016 сек.)