Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
каркас.doc
Скачиваний:
59
Добавлен:
03.06.2015
Размер:
1.6 Mб
Скачать

6.2. Определение малой иконки

Работая с Windows, Вы, вероятно, заметили, что размер иконки приложения, появляющейся на экране, может изменяться. Например, при перемещении или копировании объекта в пределах «рабочего стола» отображается большая иконка, а при минимизации окна приложения – малая (малая иконка отображается также в качестве кнопки системного меню). Как правило, большие иконки имеют размер 32´32, а малые – 16x16 пиксел.

До сих пор Вы определяли только одну иконку (большую), которая ассоцииро­валась с приложением. По умолчанию Windows использует большую иконку и как большую, и как малую (большая иконка просто «сжимается» до размеров малой). В этом разделе описано, как определить малую иконку.

Для определения малой иконки Вы должны зарегистрировать свой класс окна при помощи вызова функции RegisterClassEx():

ATOM RegisterClassEx(CONST LPWNDCLASSEX lpWndClsEx);

Рис. 6.3. Пример использования большой и малой иконок

Параметр lpWndClsEx должен быть указателем на структуру типа WNDCLASSEX. Структура WNDCLASSEX – это практически то же, что и WNDCLASS, за исключением двух дополнительных полей. Одно из них представляет собой целое без знака и называется cbSize. Его значение должно равняться размеру структуры WNDCLASSEX. Другое поле называется hIconSm и должно хранить дескриптор малой иконки. Для загрузки малой иконки используется стандартная функция LoadIcon().

Чтобы продемонстрировать, что получится, если определить и большую, и малую иконки, в предыдущую программу внесены изменения для применения WNDCLASSEX и RegisterClassEx(). В данном случае в качестве малой иконки используется стандартная иконка IDI_APPLICATION. Пример окна этой программы показан на рис. 6.3.

//Демонстрация большой и малой пользовательских иконок

#include <Windows.h>

LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM,

LPARAM);

char szWinName[]="МоеОкно"; // Имя класса окна

int WINAPI WinMain(HINSTANCE hThisInst,

HINSTANCE hPrevInst,

LPSTR lpszArgs,

int nWinMode)

{

HWND hwnd;

MSG msg;

WNDCLASSEX wcl; // WNDCLASSEX для малой иконки

wcl.hInstance=hThisInst; // Дескриптор приложения

wcl.lpszClassName=szWinName; // Имя класса окна

wcl.lpfnWndProc=WindowFunc; // Функция окна

wcl.style=0; // Стиль по умолчанию

wcl.cbSize=sizeof(WNDCLASSEX); // Размер WNDCLASSEX

wcl.hIcon=LoadIcon(hThisInst,"MYICON"); // Иконка

wcl.hIconSm=LoadIcon(NULL,IDI_APPLICATION); //Малая

wcl.hCursor=LoadCursor(hThisInst,"MYCURSOR");//Курс.

wcl.lpszMenuName=NULL; // Без меню

wcl.cbClsExtra=0; // Без дополнительной информации

wcl.cbWndExtra=0;

wcl.hbrBackground=

(HBRUSH)GetStockObject(WHITE_BRUSH); //Белый фон

if(!RegisterClassEx(&wcl)) //Регистрируем класс окна

return 0;

hwnd=CreateWindow(szWinName, // Создать окно

"Каркас программы для Windows",

WS_OVERLAPPEDWINDOW, // Стиль окна

CW_USEDEFAULT, // x-координата

CW_USEDEFAULT, // y-координата

CW_USEDEFAULT, // Ширина

CW_USEDEFAULT, // Высота

HWND_DESKTOP, // Нет родител. окна

NULL, // Нет меню

hThisInst,// Дескриптор приложения

NULL); // Нет дополнит. аргументов

ShowWindow (hwnd, nWinMode); // Показать окно

UpdateWindow (hwnd); // и перерисовать

while(GetMessage(&msg,NULL,0,0)) // Запустить цикл

{ // обработки сообщений

TranslateMessage(&msg); // Разреш. исп. клавиатуры

DispatchMessage (&msg); // Вернуть управл. Windows

}

return msg.wParam;

}

// Следующая функция вызывается операционной

// системой Windows и получает в качестве

// параметров сообщения из очереди сообщений

// данного приложения

LRESULT CALLBACK WindowFunc(HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

switch(message)

{

case WM_DESTROY: // Завершение программы

PostQuitMessage (0);

break;

default:

// Все сообщения, не обрабатываемые в

// данной функции, направляются на обработку

// по умолчанию

return DefWindowProc(hwnd,message,

wParam,lParam);

}

return 0;

}

Поскольку в программах, приведенных в книге, не требуется отдельного определения больших и малых иконок, в большинстве последующих примеров это не предусмотрено. Помните: если малая иконка не определена, Windows автоматически использует иконку, связанную с дескриптором hIcon, и как большую иконку, и как малую. Однако в своих программах Вы можете использовать большую и малую иконки (чтобы Win-прило­жение смотрелось эффектнее, целесообразно определить обе иконки).