- •2.3. Цикл сообщений 15
- •2.4. Функция окна 16
- •1. Концепция программирования под Windows. Основные понятия
- •1.1. Программная среда Windows
- •1.2. Интерфейс вызовов функций в Windows
- •1.3. Библиотеки динамической загрузки
- •1.5. Интерфейс gdi
- •1.6. Многозадачность в Windows
- •1.7. Взаимодействие программ и Windows
- •1.8. Основы программирования под Windows
- •1.8.1.Функция WinMain()
- •1.8.2. Функция окна
- •1.8.3. Цикл сообщений
- •1.8.4. Класс окна
- •1.8.5. Специфика программ для Windows
- •1.8.6. Типы данных в Windows
- •1.8.7. Соглашение об использовании имен
- •1 Вертикальная полоса прокрутки .9. Элементы окна
- •2. Каркас программы под Windows. Создание окна
- •2.1. Каркас программы для Windows 95
- •2.1. Определение класса окна
- •2.2. Создание окна
- •2.3. Цикл сообщений
- •2.4. Функция окна
- •3. Порядок выполнения работы
2.1. Определение класса окна
Первые два действия, которые выполняет функция WinMain(), — это определение класса окна и его регистрация. Класс окна определяется путем заполнения полей структуры типа WNDCLASSEX. Эти поля заданы следующим образом:
UINT cbSize; /* размер структуры WNDCLASSEX */.
UINT style; /* тип окна */
WNDPROC IpfnWndProc; /* адрес функции окна */
int cbClsExtra; /* дополнительная информация о классе */
int cbWndExtra; /* дополнительная информация об окне */
HINSTANCE hlnstance; /* дескриптор данного экземпляра программы */
HICON hlcon; /* дескриптор большой пиктограммы */
HICON hlconSm; /* дескриптор малой пиктограммы */
HCURSOR hCursor; /* дескриптор курсора мыши */
HBRUSH hbrBackground; /* цвет фона */
LPCSTR IpszMenuName; /* имя главного меню */
LPCSTR IpszClassName; /* имя класса окна */
Из текста программы видно, что в поле cbSize записывается размер структуры WNDCLASSEX. В поле hlnstance записывается дескриптор текущего экземпляра приложения, содержащийся в параметре hThisInst. Поле lpszClassName содержит Указатель на имя класса окна, которым в данном случае является строка"MyWin". Адрес функции окна записывается в поле lpfnWndProc.
Все приложения Windows должны определять стандартный вид курсора мыши, также пиктограммы приложения. В программе могут использоваться собственна ресурсы курсоров и пиктограмм, но могут задаваться и встроенные стили, как сделано в данном примере. В любом случае дескрипторы указанных ресурсов должны быть записаны в соответствующие поля структуры WNDCIASSEX. Эти действия стоит рассмотреть подробнее.
В Windows 95 с приложением связаны две пиктограммы: малая и большая. Малая пиктограмма отображается в системном меню, а также когда окно приложи минимизировано. Большая пиктограмма отображается при перемещении или копировании приложения (точнее ссылки на него) на рабочий стол. Обычно большие пиктограммы имеют размер 32x32 пикселя, а малые пиктограммы — 16x16 пикселей. Каждая пиктограмма загружается с помощью API-функции Loadlcon(), которая имеет такой прототип:
HICON LoadIcon(HINSTANCE hlnst, LPCSTR IpszName);
Эта функция возвращает дескриптор пиктограммы. Здесь параметр hInst является дескриптором модуля, который содержит пиктограмму, а ее имя задается параметром lpszName. При использовании встроенных пиктограмм первый параметр должен равняться NULL, а второй параметр должен содержать одну из следующих констант.
Таблица 2.1. Пиктограммы
Константа |
Вид пиктограммы |
IDI_APPLICATION |
Стандартная системная пиктограмма |
IDI_ASTERISK |
Информационная пиктограмма c буквой "I" |
IDI_EXCLAMATION |
Пиктограмма с восклицательным знаком |
IDI_HAND |
Пиктограмма с надписью "Stop" |
IDI_QUESTION |
Пиктограмма с вопросительным знаком |
IDI_WINLOGO |
Программа с логотипом Windows 95 |
В данном примере в качестве большой пиктограммы используется пиктограмма IDI_APPLICATION, а в качестве малой пиктограммы — пиктограмма IDI_WINLOGO. Можно также определять собственные пиктограммы.
Для загрузки курсора мыши используется API-функция LoadCursor(), имеющая такой прототип:
HCURSOR LoadCursor(HINSTANCE hlnst, LPCSTR IpszName);
Эта функция возвращает дескриптор курсора. Здесь параметр hlnst является дескриптором модуля, который содержит данный курсор, а имя курсора параметром lpszName. При использовании встроенных курсоров первый параметр должен равняться NULL, а второй параметр должен содержать одну из констант встроенных курсоров. Ниже приведены некоторые из наиболее часто используемых констант:
Таблица 2.2. Некоторые из встроенных курсоров Windows 95
Константа |
Форма курсора |
IDC_ARROW |
Стандартный указатель типа стрелка |
IDC_CROSS |
Перекрестие |
IDC_IBEAM |
Текстовый курсор |
IDC_WAIT |
Песочные часы |
Цвет фона окна, создаваемого в программе, определяется белым, а дескриптор кисти фона получается с помощью API-функции GetStockObject(). Кистью называется ресурс, предназначенный для рисования на экране различных графических объектов с использованием готовой маски определенного размера, цвета и имеющей некоторый шаблон заполнения. Функция GetStockObject() используется для получения дескрипторов различных стандартных графических объектов, включая кисти, перья (предназначенные для рисования линий) и шрифты. Она имеет следующий прототип:
HGDIOBJ GetStockObject(int object);
Эта функция возвращает дескриптор объекта, задаваемого параметром object. (Тип HGDIOBJ задает дескриптор GDI-объекта.) Вот названия некоторых стандартных кистей (табл. 2.З):
Таблица 2.3. Стандартные кисти
-
Константа
Тип фона
BLACK_BRUSH
Черный
DKGRAY_BRUSH
Темно-серый
HOLLOW_BRUSH
"Прозрачный"
LTGRAY_BRUSH
Светло-серый
WHITE_BRUSH
Белый
Эти константы можно использовать в качестве параметров функции GetStockObject().
Когда класс окна полностью определен, его необходимо зарегистрировать в Windows 95 с помощью API-функции RegisterClassEx(), имеющей такой прототип:
ATOM RegisterClassEx (CONST WNDCLASSEX *lptfClass);
Эта функция возвращает значение, идентифицирующее класс окна. Тип АТОМ определен с помощью typedef-декларации и соответствует типу WORD. Каждому Классу окна соответствует уникальное числовое значение. Параметр lptfClass должен содержать адрес структуры типа WNDCIASSEX.