Ресурсы в традиционном приложении Windows, страница 2

Класс окон (точнее, переменная типа WNDCLASS) должен быть зарегистрирован в Windows еще и потому, что процесс регистрации связывает оконную процедуру (в нашем случае: WndProc) с окном приложения. Главное окно приложения регистрируется в функции WinMain, другие же окна могут быть зарегистрированы в других местах программы. Имя заполненной структуры передается в функцию RegisterClass, которая говорит системе Windows, что от нее ожидается, когда окна подобного класса появляются на экране. Теперь Windows знает кому посылать сообщения о событиях, происходящих в области окна, какой вид курсора использовать при попадании указателя мыши в пределы окна и т. д.

Итак, приложение запущено и ждет сообщений, которые система при необходимости ему посылает. Сообщения обрабатываются в связанной с приложением оконной процедуре, которую мы назвали WndProc. Структура этой функции предельно проста. В зависимости от кода сообщения оператор switch выбирает ветвь его обработки. Пока мы реагируем только на два сообщения: о небходимости перерисовать клиентскую область окна и о необходимости закрыть приложение. Правда система по умолчанию обеспечивает реакции на некоторые другие сообщения. Попробуйте определить какие.

Здесь приведен минимум действий, необходимых для вывода текста в Windows-окно заданного нами класса. Окно выглядит неважно. Главным недостатком является то, что фон окна не перекрашивается. Он остается таким, каким он был до появления окна. Это происходит потому, что в структуре, описывающей класс окна, мы не задали (то есть оставили нулевым) поле, определяющее такой инструмент рисования, как кисть (Brush) для закраски фона клиентской области окна. Отметим, что всего GDI имеет 6 инструментов для рисования: Pen, Brush, Font, Bitmap, Rgn, Palette. Исправить существующее положение можно вставкой следующей строки кода:

w.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);

Другим недостатком, который вы должно быть заметили, является то, что курсор мыши не имеет постоянной формы. Такое странное поведение курсора также объясняется тем, что не задано соответствующее поле в структуре оконного класса. Следующая строка самым простым образом исправит положение:

w.hCursor = LoadCursor(0,IDC_ARROW);

Всего имеется 14 готовых (predefined) курсоров, которые можно выбрать подобным образом. Если вы хотите создать свой собственный курсор, то проще всего обратиться к редактору ресурсов студии разработчика.

Вводим ресурсы

До сих пор приложение обходилось без файла ресурсов (типа .rc). Можно продолжать так и дальше, но все преимущества Visual studio будут оставаться неиспользованными. Для создания какого-либо из 10 типов ресурсов надо дать команду: Insert | Resource. В окне появившегося диалога выбрать тип ресурса (меню, диалог, иконка, курсор, bitmap, акселератор, строка текста, toolbar, HTML, Version). Все редакторы ресурсов встроены в студию и достаточно просты в использовании. Например, создав свой курсор и присвоив ему идентификатор IDC_MYCURSOR , вы вместо строки выше вставляете код:

w.hCursor = LoadCursor(hInst, MAKEINTRESOURCE(IDC_MYCURSOR));

Примечание. Вместо макроса MAKEINTRESOURCE вы можете вствить код (char*)IDC_MYCURSOR. Дело в том, что раньше было принято идентифицировать ресурсы строкой символов, а теперь используется более надежный способ числовой идентификации.

Макрос:

#define MAKEINTRESOURCE(i) (LPTSTR) ((DWORD) ((WORD) (i)))

преобразует тип параметра к адресу начала строки, как этого требуют старые API. Курсор можно задать и более универсальным и современным способом: выудить из файла, если вы знаете, где он расположен. Для этого используется функция LoadImage, которая также может загрузить иконку или bitmap.

w.hCursor = (HCURSOR)LoadImage (0,"C:\\My Project\\mycursor.cur",

IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE | LR_MONOCHROME);