Инициализация приложения

Сущность инициализации, краткая характеристика ее параметров и возвращаемое значение функции. Особенности процесса создания класса окон с заданными характеристиками и регистрация его в Windows. Аспекты создания и отображения главного окна класса.

Рубрика Программирование, компьютеры и кибернетика
Вид реферат
Язык русский
Дата добавления 03.10.2010
Размер файла 49,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

ИНИЦИАЛИЗАЦИЯ ПРИЛОЖЕНИЯ

1. Инициализация

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

int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

Параметры:

hInstance - текущий дескриптор (условный номер - handle) приложения.

hPrevInstance - дескриптор предыдущего экземпляра приложения. В Win3.1 определить дескриптор запущенного ранее приложения не возможно. Сейчас не используется.

lpCmdLine - представляет собой указатель на строку c нулевым символом в конце, которая содержит командную строку.

nCmdShow - команда отображения, которая указывает как должно быть первоначально показано окно приложения.

Возвращаемое значение: код завершения приложения.

Функция возвращает вызвавшей ее системе целое значение и ничего интересного в этот момент собой не представляет. Следующая характеристика - APIENTRY - определяет порядок передачи параметров при вызове процедуры. Наименование характеристики применяется для соглашения о передаче параметров, принятые в системе Windows.

Так как Windows является многозадачной системой, то очевидно, что одна и та же программа может быть запущена несколько раз. Для того чтобы различать экземпляры программ, каждому экземпляру присваивается условный номер - хэндл (handle). Справедливости ради, надо отметить, что в Win32 присваиваются хэндлы чему угодно - окну, меню, курсору, иконке и т. д. Фактически хэндл - это указатель на блок памяти, в котором размещен тот или иной объект. В заголовочных файлах тип HANDLE определен как void*, а тип HINSTANCE как HANDLE. Согласно венгерской нотации, идентификаторы переменных типа HANDLE должны начинаться с буквы h.

Раз уж объект имеет хэндл, который является УКАЗАТЕЛЕМ, то, значит, этот объект сам расположен в памяти! Другими словами, в тех случаях, когда мы должны получить хэндл того или иного объекта, фактически мы должны получить адрес загруженного в память объекта!

Переменные hInstance и hPrevInstance заслуживают более подробного обсуждения.

Когда вызывается WinMain(), Windows через эту переменную сообщает программе хэндл экземпляра программы. В Windows 3.1 hPrevInstance являлся хэндлом предыдущего экземпляра программы. Если запускался первый экземпляр программы, то параметр hPrevInstance был равен нулю. Этот факт можно было использовать для того, чтобы не позволять системе запускать более одного экземпляра программы. В Win32 hPrevInstance оставлен ИСКЛЮЧИТЕЛЬНО для совместимости с предыдущими версиями Windows, on не несет никакой нагрузки и постоянно равен нулю. Так просто, как в более ранних версиях Windows, определить наличие ранее запущенного экземпляра программы не удастся.

Следующий параметр - lpCmdLine - представляет собой указатель на строку, ту командую строку, которая набирается после имени запускаемой программы. При необходимости программа может проанализировать этот аргумент и выполнить те или иные действия.

И последний параметр - nCmdShow - определяет, в каком виде создаваемое окно будет появляться на экране. Окно может появляться в максимизированном виде либо в виде иконки (минимизированном), может иметь произвольный размер, определяемый программой и другие характеристики. В Win32 API определяются десять возможных значений этого параметра. Их идентификаторы начинаются с SW_ (вероятно, от названия функции ShowWindow, которая использует эти значения). Наиболее часто используются значения SW_SHOWNORMAL и SW_SHOWMINNOACTIVE. Возможные значения этого параметра приведены в справочных таблицах.

После задания функции WinMain() переходят к регистрации приложения в операционной системе. Для этого создается класс окна и сообщается о нем в системе.

2. Создание класса окон с заданными характеристиками и регистрация его в Windows

Сразу после входа в WinMain() нам необходимо создать класс окна и сообщить о нем системе. Класс создается и регистрируется функцией RegisterClass().

Функция RegisterClass(). Один и тот же класс может использоваться для создания любого количества окон. Синтаксис функции следующий:

ATOM RegisterClass (CONST WNDCLASS* lpwc)

Параметры:

lpwc - указатель на структуру данных WNDCLASS.

Возвращаемое значение: в случае успешного выполнения - атомарное значение, которое является уникальным идентификатором зарегистрированного нового класса, иначе - 0.

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

Поля структуры WNDCLASS (для переменной wc, которая может меняться произвольно):

- wc.style - стиль окна.

- wc.lpfnWndProc - указатель на функцию обратного вызова окна для обработки сообщений. Определяется идентификаторам с префиксом CS_.

- wc.cbClsExtra - число дополнительных байт, которые должны быть распределены в конце структуры класса окна для хранения информации.

- wc.cbWndExtra - число дополнительных байт, которые должны быть распределены вслед за экземпляром окна.

- wc.hInstance - дескриптор приложения, в котором находится оконная процедура для этого класса.

- wc.hIcon - дескриптор пиктограммы, которая предназначена для этого класса окна. Определяется идентификаторам с префиксом IDI_.

- wc.hCursor - дескриптор курсора, который предназначен для этого класса окна. Определяется идентификаторам с префиксом IDC_.

- wc.hbrBackground - дескриптор кисти, которая предназначена для отображения фона окна. Определяется идентификаторам с суффиксом _BRASH.

- wc.lpszMenuName - указатель на строку с нулевым символом в конце, содержащую имя меню, применяемого по умолчанию для этого класса. Устанавливается в NULL, если класс не имеет меню, применяемого по умолчанию.

- wc.lpszClassName - указатель на строку с нулевым символом в конце, содержащую имя класса окна. Это же имя должно быть в параметре lpszClassName функции CreateWindow().

Рассмотрим поля структуры подробнее.

Первое поле структуры WNDCLASS - стиль окна - определяется оператором wc.style.

В winuser.h описаны тринадцать стилей окна. Наименования их идентификаторов начинаются с CS_, что, вероятно, означает "Class style". Для стиля окна отведено 16 битов и только один из этих битов установлен в единицу. Другими словами, стили, упомянутые в winuser.h, используются как битовые флаги, т. е. с этими стилями можно производить операции логического сложения и логического умножения для получения комбинированных стилей. Перечень флагов приведен в справочной литературе.

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

wc.lpfnWndProc = (WNDPROC) WndProc;

Третье и четвертое поля, как правило, оставлены нулевыми. Дело в том, что для каждого класса Windows создает где-то в недрах своей памяти структуру с характеристиками класса. Другая структура создается для каждого окна. При создании этих структур может быть зарезервировано некоторое количество памяти для нужд программиста. Поля cbClsExtra и cbWndExtra указывают размер резервируемой памяти в структурах класса и окна соответственно. Эти поля и раньше использовались достаточно редко, а с появлением Windows'95 и Windows NT вообще не используются.

Пятое поле - hInstance в объяснении не нуждается - классу окна сообщается хэндл программы.

Шестое поле определяет хэндл иконки, которая будет символом окна данного класса.

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

Действие, производимое функцией LoadIcon(), очевидно из ее названия - загрузить иконку. Заметим, что программист может использовать собственную иконку, которую он сам разработал, а может применить одну из иконок, хранящихся в глубинах системы (они называются предопределенными). В случае использования собственной иконки первый параметр функции LoadIcon() должен быть равным хэндлу программы (hInstance). Если мы используем предопределенную иконку, первый параметр равен нулю

Второй параметр - это идентификатор иконки. Все идентификаторы предопределенных иконок начинаются с букв IDI_ (возможно, "IDentificator of Icon").

Сказанное об иконке можно полностью отнести и к курсору мыши, которым будут пользоваться окна создаваемого класса (не путать с курсором, применяемым при редактировании текстовых файлов). Седьмое поле wc.hCursor определяет хэндл курсора. Все идентификаторы предопределенных курсоров начинаются с IDC_ (возможно, "IDentificator of Cursor").

Восьмое поле wc.hbrBackground определяет хэндл так называемой кисти (brush), которой будет закрашен фон окна. Вместо кисти может использоваться один из системных цветов, которые задаются идентификатором с префиксом COLOR_.

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

Десятое поле - wc.lpszClassName содержит указатель на строку, содержащую Имя создаваемого нами класса окна. Указав это имя, мы тем самым поставили логическую точку в формировании структуры wc.

В Win32 регистрация класса окна производится с помощью функции RegisterClassEx().

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

ATOM RegisterClassEx (CONST WNDCLASSEX* lpwc)

Параметры:

lpwc - указатель на структуру данных WNDCLASSEX.

Возвращаемое значение: в случае успешного выполнения - атомарное значение, которое является уникальным идентификатором зарегистрированного нового класса, иначе - 0.

Как видно из описания функции, единственным ее аргументом является указатель на структуру типа WNDCLASSEX, в которой хранятся характеристики создаваемого класса. Эта структура отличается от рассмотренной выше структуры WNDCLASS наличием еще двух полей:

- wc.cbSize - Размер структуры в байтах. Как правило, задается значением sizeof(WNDCLASSES) перед использованием структуры в функции.

- wc.hIconSm - дескриптор пиктограммы, которая предназначена для использования в строке заголовка окон, созданных с помощью этого класса. Размер пиктограммы должен быть 16*16. Если этот член имеет значение NULL, то система сама ищет ресурс пиктограммы, указанный полем wc.hIcon, чтобы найти пиктограмму подходящего размера для использования в качестве малой пиктограммы.

3. Создание и отображение главного окна класса

Как и экземпляр программы, каждое окно и системе имеет свой уникальный номер - хэндл (handle). Обычно окно создается посредством функции CreateWindow(), которая и возвращает хэндл созданного окна. Если функция CreateWindow() вернула нуль, то по каким-то причинам окно не создано. Причины могут быть как внутри программы, так и в системе. Но, в отличие от регистрации класса, о том, что окно не создано, вы можете узнать, просто взглянуть на экран.

Функция CreateWindow() имеет следующий синтаксис:

HWND CreateWindow(LPCTSTR lpszAppName, LPCTSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, HMENU hmenu, HINSTANCE hInstance, LPVOID lpvParam);

Параметры.

lpszAppName - указатель на строку с нулевым символом в конце, содержащую имя класса окна (имя окна).

lpszWindowName - указатель на строку с нулевым символом в конце, содержащую имя окна (заголовок окна).

dwStyle - стиль созданного окна, определяются идентификаторами, начинающимися с префикса WS_(стиль окна).

x - горизонтальная позиция левого верхнего угла окна (если не важно, то CW_USERDEFAULT).

y - вертикальная позиция левого верхнего угла окна (если не важно, то CW_USERDEFAULT).

nWidth - ширина окна по горизонтали (если не важно, то CW_USERDEFAULT).

nHeight - высота окна по вертикали (если не важно, то CW_USERDEFAULT).

hwndParent - дескриптор родительского по отношению к нашему объекта окна (родитель).

hmenu - дескриптор меню окна. Если применяется меню класса, то значение устанавливается равным NULL (меню).

hInstance - дескриптор приложения, которое создало окно (дескриптор приложения).

lpvParam - указатель на структуру с дополнительной информацией (дополнительные данные).

Возвращаемое значение: в случае успешного выполнения - возвращает хэндл созданного окна, иначе - NULL.

Первый аргумент - указатель на чувствительную к регистру строку с именем класса, к которому будет принадлежать создаваемое нами окно. В большинстве случаев значение этого аргумента совпадает со значением последнего поля структуры типа WNDCLASS, передаваемой RegisterClass(). В качестве классов окон определены также общие классы элементов управления либо предопределенные классы окон. Например, "EDIT", "LISTBOX", "STATIC" и т.д., с которыми познакомимся позже.

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

Третий аргумент определяет стиль окна (не общие характеристики всех окон класса, а индивидуальные характеристики конкретного окна). Стиль определяет, будет ли окно иметь заголовок, иконку системного меню, кнопки минимизации, максимизации, характер границы окна, определяет также взаимоотношения окон типа предок-потомок и т. д. Под это поле отводится 32 бита. В файле winuser.h определены несколько десятков стилей окон. Их идентификаторы начинаются с букв WS_. Как и в случае со стилями класса, эти значения используются как битовые флаги, т. е. комбинируя их с помощью логических операций, можно получить тот стиль окна, который требуется.

Некоторые стили, приведенные в winuser.h, представляют собой комбинации из других стилей. В частности, тот стиль, который используем мы WS_OVERLAPPEDWINDOW, тоже является комбинацией. Выбирая этот стиль, мы определяем наличие у нашего окна заголовка, системного меню, ограничивающей рамки, а также кнопок минимизации и максимизации.

Пятый, шестой, седьмой и восьмой аргументы определяют положение окна на экране. Значение этих полей представляют измеренные в пикселях отступы левого верхнего угла окна от левого края экрана, от верхней границы экрана, ширину и высоту окна соответственно. Особых пояснений эти параметры не требуют. Используемые идентификаторы CW_USEDEFAULT, допустимые, кстати, только для окон со стилем WS_OVERLAPPED, позволяют Win32 API установить размер окна - самостоятельно.

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

Девятый аргумент - это хендл меню нашего окна. Windows присваивает хэндлы чему угодно, в том числе и меню.

Десятый аргумент - hInstance - должен быть понятен из предыдущих объяснений. Да-да, именно тот самый хэндл приложения, который мы запускаем.

Одиннадцатый аргумент - данные, которые используются в некоторых случаях для создания окна. Как правило, в это поле записывается указатель на структуры с дополнительной информацией.

Установление состояния показа окна выполняется функцией ShowWindow(), определяющей как окно должно быть показано на экране (развернуто, свернуто, активно и т.д.), имеющей вид

BOOL ShowWindow (HWND hwnd, int nCmdShow)

Параметры:

hwnd - дескриптор окна;

nCmdShow - определяет способ показа окна и задается одним из идентификаторов с префиксом SW_.

Возвращаемое значение: в случае успешного выполнения - TRUE, иначе - FALSE.

Функция отображает окно на экране (отметьте - отображает окно как набор атрибутов, таких как заголовок, рамка, кнопки и т. д.).

Первый аргумент этой функции - хэндл созданного только что окна.

Второй аргумент определяет, в каком виде окно будет отображено на экране. Как правило, при первом запуске окна функции WinMain() передается значение SW_SHOWDEFAULT, при последующих запусках значение этого параметра может изменяться в соответствии со сложившимися обстоятельствами. Не рекомендуется указывать в качестве второго параметра функции ShowWindow() значение, отличное от передаваемого при вызове WinMain(). Тем самым Win32 API лишается некоторых возможностей по управлению окном.

После показа окна его необходимо перерисовать. ПЕРЕРИСОВКА заставляет обновление не набора атрибутов, за которые отвечает Windows, a изображения в рабочей области окна, за что должна отвечать непосредственно программа. Для этого служит функция UpdateWindow().

Функция UpdateWindow() посылает функции окна сообщение WM_PAINT, которое заставляет окно ПЕРЕРИСОВАТЬСЯ. Сообщение направляется непосредственно оконной процедуре, минуя очередь сообщений. Если область обновления пуста, сообщение не отправляется. Синтаксис функции следующий

BOOL UpdateWindow (HWND hwnd)

Параметры:

hwnd - дескриптор окна;

Возвращаемое значение: в случае успешного выполнения - TRUE, иначе - FALSE.

Windows вырабатывает сообщения в ответ на каждое аппаратное событие, такое как нажатие пользователя клавиши на клавиатуре или перемещение мыши. Система передает эти сообщения в соответствующую системную очередь процессов. Каждый процесс в системе обрабатывает сообщения в своей очереди сообщений. Если сообщение предназначено для конкретного процесса, то оно помещается в очередь сообщений этого процесса. На рис.1 показана упрощенная схема потока сообщений Windows.

Рис. 1


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.