Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lutsik_Yu_A_Obektno_orientir_programmir_na_yaz.pdf
Скачиваний:
63
Добавлен:
11.05.2015
Размер:
4.33 Mб
Скачать

 

Таблица 6

 

Префикс

Категория

 

CS

Опция стиля класса

 

IDI

Идентификационный номер иконки

 

IDC

Идентификационный номер курсора

 

WS

Стиль окна

 

CW

Опция создания окна

 

WM

Сообщение окна

Р

SND

Опция звука

 

DT

Опция рисования текста

 

11.7. Некоторые новые типы данных

 

 

У

Некоторые идентификаторы в hellowin.cpp являются новыми типами дан-

ных. Они определены в заголовочных файлах. Например, тип данных UINT, ис-

пользованный в качестве второго параметра WndProc, − это 32-разрядноеИбез-

знаковое целое. Тип данных PSTR, использованный в качестве третьего пара-

метра WinMain, является указателем на строку символов.

 

Другие имена менее очевидны. Например, третий иГчетвертый параметры

 

ба

 

WndProc определяются как WPARAM и LPARAM соответственно. WPARAM

определяется как UINT, а LPARAM как LONG, о

Бп раметра оконной проце-

к

 

 

дуры являются 32-разрядными. Функция WndProc возвращает значение типа

яе

 

 

 

LRESULT. Оно определено просто как LONG. Функция WinMain получает тип

WINAPI, а функция WndProc получа т тип CALLBACK. Оба эти идентификато-

 

 

 

 

меет

 

 

ра определяются как stdcall, что явл

тся ссылкой на особую последователь-

ность вызовов функций, которая и

 

место между самой операционной сис-

 

 

 

о

 

 

 

темой Windows и ее прил жением.

 

 

 

 

В hellowin.cpp также сп льз ваны четыре структуры данных, опреде-

ляемых в заголовочных файлах Windows (табл. 7).

 

Структура и

 

 

Таблица 7

 

 

 

Значение

 

 

MSG

б

 

 

Структура сообщения

 

 

 

 

 

 

 

и

 

 

 

 

 

 

WNDCLASSEXл

 

 

Структура класса окна

 

 

PAINTSTRUCT

 

 

Структура рисования

 

 

Б

 

 

 

Структура прямоугольника

 

 

RECT

 

 

 

 

Имеется еще три идентификатора, которые пишутся прописными буквами и предназначены для разных типов описателей (табл. 8).

 

Таблица 8

Идентификатор

Значение

HINSTANCE

Описатель экземпляра (instance) самой программы

HWND

Описатель окна

HDC

Описатель контекста устройства

Описатель − это число (обычно длиной в 32 разряда), которое ссылается на объект. Описатели в Windows напоминают описатели файлов при програм-

250

мировании на традиционном С.

11.8. Венгерская нотация

Некоторые переменные в hellowin.cpp имеют своеобразные имена. На- пример, имя szCmdLine − параметр WinMain.

В Windows часто используются соглашения по именованию переменных, названные условно венгерской нотацией. Имя переменной начинается со строч- ной буквы или букв, которые отмечают тип данных переменной. Например, префикс sz в szCmdLine означает, что строка завершается нулем. Префикс h в

hInstance и hPrevInstance означает описатель (handle); префикс i в iCmdShow оз-

следовало бы назвать uiParam (беззнаковое целое − unsignedИРinteger). Но по- скольку эти два параметра определяются через типы данных WPARAM и LPARAM, было решено сохранить их прежние именаУ.

начает целое (integer). В двух последних параметрах WndProc также использует-

ся венгерская нотация, хотя, как уже говорилось раньше, wParam правильнее

При обозначении переменных структурыГудобно пользоваться именем самой структуры и строчными буквами, используя их либо в качестве префикса имени переменной, либо как имя переменнойБв целом. Например, в функции WinMain в hellowin.срр переменная msg относится к структуре типа MSG; wndclass − к структуре типа WNDCLASSEX. В функции WndProc переменная ps относится к структуре PAINTSTRUCT, rect − к RECT.

Венгерская нотация помогает изб ть ошибок в программе еще до ее

компоновки. Поскольку имя п р нной описывает и саму переменную и тип ее

 

 

 

 

 

 

 

ега

 

 

 

 

 

 

 

 

к

 

 

 

 

 

 

 

еме

 

 

 

 

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

занных с несовпадением ипа данных у переменных.

 

 

 

В табл. 9 предс авлены некоторые префиксы переменных.

Таблица 9

 

 

 

 

 

 

 

 

 

 

Префикс

т

 

 

Тип данных

 

 

 

C

 

с мв л

 

 

 

 

 

 

by

 

BYTE (беззнаковый символ)

 

 

 

 

 

 

о

 

 

 

 

 

 

 

N

 

короткое целое

 

 

 

 

 

 

 

 

и

 

 

 

 

 

 

 

I

 

це ое

 

 

 

 

 

 

 

x, y

 

це ое (используется в качестве координат x и y)

 

 

 

 

л

 

 

 

 

 

 

 

 

cx, cy

 

целое (используется в качестве длины x и y), с означает count

 

 

б

 

 

 

 

b f

BOOL (булево целое); f означает «флаг» (flag)

 

 

 

w

 

WORD (беззнаковое короткое целое)

 

 

 

ли

 

 

 

 

 

l

 

LONG (длинное целое)

 

 

 

 

dw

 

DWORD (беззнаковое длинное целое)

 

 

Б

 

 

 

 

 

 

 

 

 

fn

 

функция

 

 

 

 

 

 

 

S

 

строка

 

 

 

 

 

 

 

Sz

 

строка, завершаемая нулем

 

 

 

H

 

описатель (handle)

 

 

 

 

 

P

 

указатель (pointer)

 

 

 

 

251

11.9. Точка входа программы

Текст программы начинается с инструкции: #include <windows.h>

Файл windows.h включает в себя много других заголовочных файлов, содержа- щих объявления функций Windows, структур Windows, новые типы данных и числовые константы.

Далее следует объявление оконной процедуры WndProc и описание функ-

ции WinMain:

 

Р

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

 

PSTR szCmdLine, int iCmdShow)

И

 

 

Функция WinMain использует последовательность вызовов WINAPI и, по своему завершению, возвращает операционной системе Windows целое значе-

ние. WinMain имеет четыре параметра.

Г

Параметр hInstance называется описателем экземпляра. Это уникальное

 

Б

число, идентифицирующее программу, когда она работает подУWindows. При

запуске под Windows несколько копий одной и той же программы, каждая ко-

пия называется «экземпляром» и у каждой свое зн чение hInstance.

 

а

Параметр hPrevInstance − предыдущий экземпляр, в настоящее время ус-

к

тарел. Если в данный момент времени не было з гружено никаких копий про-

е

 

граммы, то hPrevInstance = 0 или NULL. Под Windows 98 этот параметр всегда равен NULL.

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

Параметр szCmdLine − это указат ль на строку, содержащую любые па-

раметры, передаваемые в программу из командной строки.

значения соответствуют

дент фикаторам SW_SHOWNORMAL (равен 1) или

 

 

о

SW_SHOWMINNOACTIVE (равен 7). Параметр показывает, необходимо ли за-

 

и

 

олжно

 

пущенную пользовате ем программу выводить на экран в виде окна нормально-

го размера окно д

 

быть изначально свернутым.

или

 

 

 

Б

 

класса окна

11.10. Регистрацияб

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

Перед созданием окна необходимо зарегистрировать класс окна путем вызова функции RegisterClassEx. Функция RegisterClassEx имеет один параметр − указатель на структуру типа WNDCLASSEX. Структура WNDCLASSEX оп- ределяется в заголовочных файлах Windows следующим образом:

252

typedef struct tagWNDCLASSEX

 

 

 

 

 

 

{ UINT

cbSize;

 

 

 

 

 

 

 

UINT

style;

 

 

 

 

 

 

 

WNDPROC

lpfnWndProc;

 

 

 

 

 

 

int

cbClsExtra;

 

 

 

 

 

 

int

cbWndExtra;

 

 

 

 

 

 

HINSTANCE

hInstance;

 

 

 

 

 

Р

HICON

hIcon;

 

 

 

 

 

 

 

 

 

 

 

 

 

HCURSOR

hCursor;

 

 

 

 

И

HBRUSH

hbrBackground;

 

 

 

 

 

 

 

 

LPCSTR

lpszMenuName;

 

 

 

 

 

LPCSTR

lpszClassName;

 

Г

 

 

HICON

hIconSm;

 

 

 

 

 

 

 

Б

У

 

} WNDCLASSEX;

 

 

 

 

Префикс lpfn означает «длинный указатель на функцию», cb означает

«счетчик байтов», hbr − это «описатель кисти».

 

 

 

 

 

 

 

а

 

 

 

 

В WinMain необходимо определить структуру типа WNDCLASSEX:

WNDCLASSEX wndclass;

к

 

 

 

 

 

 

 

 

 

 

 

 

 

е

 

 

 

 

 

 

Затем инициализируются 12 полей структуры и вызывается функция

RegisterClassEx:

 

 

 

 

 

 

 

 

RegisterClassEx (&wndclass);

Наиболее важными являются поля: lpfnWndProc − адрес оконной проце- дуры, используем для всех окон, созданных на основе этого класса, и

lpszClassName − имя класса окна. Другие поля описывают характеристики всех

окон, создаваемых на тснове этого класса окна. Поле cbSize равно длине струк-

 

л

туры. Инструкц яой

wndclass.style = CS_HREDRAW | CS_VREDRAW;

б

осуществ яет объединение двух идентификаторов «стиля класса». В заголовочных

и

 

файлах Windows идентификаторы, начинающиеся с префикса CS, задаются в виде

32-разрядной константы, только один из разрядов которой установлен в 1. Эти Бдент ф каторы стиля показывают, что все окна, созданные на основе данного

класса, должны целиком перерисовываться при изменении горизонтального (CS_HREDRAW) или вертикального (CS_VREDRAW) размеров окна. При измене- нии размера окна строка текста переместится в новый центр окна.

Третье поле структуры WNDCLASSEX инициализируется с помощью ин-

струкции

wndclass.lpfnWndProc = WndProc;

Эта инструкция устанавливает WndProc как оконную процедуру данного окна. Оконная процедура будет обрабатывать все сообщения всем окнам, созданным на основе данного класса окна.

253

Следующие две инструкции wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0;

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

В следующем поле находится описатель экземпляра программы:

Р

wndclass.hInstance = hInstance;

 

Инструкции

 

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

У

wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

 

Г

 

устанавливают значок для всех окон, созданных на основе данногоИкласса окна. Значок появляется на панели задач Windows и слева в заголовке окна. Для по-

этот параметр должен быть установлен равнымаописателюБ экземпляра про- граммы.) Второй идентификатор, начинающийся с префикса IDI, определяется в заголовочных файлах Windows. ЗначоккIDI APPLICATION − это просто ма-

лучения описателя стандартного значка вызывается LoadIcon, установив первый параметр в NULL. (При загрузке вашего собственного пользовательского значка

используется для установки значений ноепол й wndclass.hIcon и wndclass.hIconSm.

ленькое изображение окна. Функция LoadIcon возвращает описатель этого

значка. Фактически не важно конкр т знач ние этого описателя. Оно просто

Инструкция

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);

очень похожа на две предыдущие инс рукции. Функция LoadCursor загружает

 

и

стандартный курсор IDC ARROWти возвращает описатель курсора. Этот опи-

полю

сатель присваивается

оhCursor структуры WNDCLASSEX. Когда курсор

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

основе данного класса. Вызов функции GetStockObject возвращает описатель белойБкис , спользуемой для закраски фона:

ПолетиhbrBackground задает цвет фона рабочей области окон, созданных на

wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);

Это означает, что фон рабочей области окна будет плотного белого цвета, что является стандартным выбором.

Следующее поле задает меню класса окна. В приложении hellowin меню отсутствует, поэтому поле установлено в NULL:

wndclass.lpszMenuName = NULL;

Далее классу должно быть присвоено имя. Для простой программы оно может быть просто именем программы, которым в нашем случае является стро- ка «HelloWin», хранящаяся в переменной szAppName:

254

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