- •Московская финансово-промышленная академия
- •Содержание
- •Глава 1. Модель программирования приложений
- •1.1. Потребительские свойства Windows
- •1.2. Процессы в Windows и потоковая многозадачность
- •1.3. Динамические библиотеки
- •1.4. Программное обеспечение для создания Win-приложений
- •Спецификация префиксов венгерской нотации
- •Глава 2. Обзор возможностей программирования
- •2.1. Общий взгляд на программирование в Windows
- •2.2. Взаимодействие Windows с программой
- •2.3. Win32 api: прикладной интерфейс для Windows
- •2.4. Компоненты окна
- •2.5. Основы приложений Windows
- •2.6. Каркас приложения Windows
- •2.7. Определение класса окна
- •Значения параметра lpszName
- •Наиболее употребляемые макросы для встроенных курсоров
- •Типы системных кистей
- •2.8. Создание окна
- •Наиболее распространенные стили
- •Параметры способа отображения nHow
- •2.9. Цикл обработки сообщений
- •2.10. Оконная функция
- •Типы префиксов
- •Глава 3. Обработка сообщений Windows
- •3.1. Что такое сообщения?
- •3.2. Обработка нажатая клавиш
- •Битовая карта lParam
- •3.3. Обработка сообщений wm_paint
- •3.4. Обработка сообщений «мыши»
- •3.5. Генерация сообщения wm_paint
- •3.6. Генерация сообщений таймера
- •Глава 4. Ресурсы и меню
- •4.1. Окна сообщений MessageBox
- •Значения функции MessageBox
- •Значения wMbType
- •4.2. Представляем меню
- •4.3. Использование ресурсов
- •Параметры menu
- •Параметры элементов меню
- •4.4. Включение меню в программу. Обработка команд
- •4.5. Включение акселераторов сменю
- •4.6. Загрузка таблицы акселераторов
- •Глава 5. Создание диалогов
- •5.1. Взаимодействие Win-диалогов с пользователем
- •5.2. Модальные диалоги: обработка сообщений
- •5.3. Активизация и создание простейшего диалога
- •5.4. Определение ресурсов диалога
- •Стили диалога
- •5.5. Оконная функция диалога
- •5.6. Основы работы со списками
- •Типы сообщений
- •5.7. Инициализация списка и выбор элементов
- •5.8. Окно ввода
- •5.9. Использование немодального диалога
- •Глава 6. Графические образы, иконки и курсоры
- •6.1. Иконка и курсор
- •6.2. Определение малой иконки
- •6.3. Работа с растровыми изображениями
- •Значения параметра dwRaster
- •6.4. Работа с несколькими растровыми изображениями
- •Глава 7. Более подробно об элементах управления
- •7.1. Работа с контрольными переключателями
- •7.2. Статические элементы
- •7.3. Работа с селекторными кнопками
- •7.4. Линейки прокрутки
Значения параметра dwRaster
№ |
Макрос |
Способ вывода |
1 |
SRCCOPY |
Копирование «как есть» с затиранием предыдущего изображения |
2 |
SRCAND |
Выполняется побитовое AND с предыдущим изображением |
3 |
SRCPAINT |
Выполняется побитовое OR с предыдущим изображением |
4 |
SRCINVERT |
Выполняется побитовое XOR с предыдущим изображением |
Приведенные макросы должны быть определены в файле Windows.h. Функция возвращает ненулевое значение в случае успешного завершения и нуль – при возникновении ошибки.
В нашем примере при нажатии левой кнопки мыши вызывается BitBlt() и растровое изображение выводится на экран целиком, начиная с позиции курсора.
После вывода растрового изображения оба контекста устройств освобождаются. Однако функция ReleaseDC() вызывается только для контекста устройства, получаемого при помощи GetDC(). Для контекста, получаемого при помощи CreateCompatibleDC(), нужно использовать функцию DeleteDC(), которая получает в качестве параметра указанный контекст устройства.
Растровое изображение является ресурсом, который должен быть освобожден перед завершением программы. Для этого следует использовать функцию DeleteObject(), когда растровое изображение больше не нужно или получено сообщение WM_DESTROY в главном окне. Функция DeleteObject() имеет следующий прототип:
BOOL DeleteObject( HGDIOBJ hObj);
Здесь hObj является дескриптором удаляемого объекта. Функция возвращает ненулевое значение в случае успешного завершения и нуль – в противном случае.
Пример 6-3. Ниже приводится полный текст программы вывода растрового изображения на экран. Программа выводит его каждый раз при нажатии левой кнопки мыши, начиная с текущей позиции курсора. Рисунок 6.4 иллюстрирует работу этой программы.
Рис. 6.4. Пример вывода растрового изображения
// Вывод растра
#include <Windows.h>
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM,
LPARAM);
char szWinName[]="МоеОкно"; // Имя класса окна
HBITMAP hBit1; // Дескриптор растра
int WINAPI WinMain(HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
{
HWND hwnd;
MSG msg;
WNDCLASS wcl; // Определить класс окна
wcl.hInstance=hThisInst; // Дескриптор приложения
wcl.lpszClassName=szWinName;// Имя класса окна
wcl.lpfnWndProc=WindowFunc; // Функция окна
wcl.style=0; // Стиль по умолчанию
wcl.hIcon=LoadIcon(hThisInst,"MYICON"); // Иконка
wcl.hCursor=LoadCursor(hThisInst,"MYCURSOR");//Курс.
wcl.lpszMenuName=NULL; // Без меню
wcl.cbClsExtra=0; // Без дополнительной информации
wcl.cbWndExtra=0;
wcl.hbrBackground=
(HBRUSH)GetStockObject(WHITE_BRUSH); //Белый фон
if(!RegisterClass(&wcl)) // Регистрируем класс окна
return 0;
hwnd=CreateWindow(szWinName, // Создать окно
"Вывод растра",
WS_OVERLAPPEDWINDOW, // Стиль окна
CW_USEDEFAULT, // x-координата
CW_USEDEFAULT, // y-координата
CW_USEDEFAULT, // Ширина
CW_USEDEFAULT, // Высота
HWND_DESKTOP, // Нет родител. окна
NULL, // Нет меню
hThisInst,// Дескриптор приложения
NULL); // Нет дополнит. аргументов
ShowWindow (hwnd, nWinMode); // Показать окно
UpdateWindow (hwnd); // и перерисовать
hBit1=LoadBitmap(hThisInst,"MYBP1"); // Загр. растр
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)
{
HDC DC;
HDC memDC;
switch(message)
{
case WM_LBUTTONDOWN:
DC=GetDC(hwnd); // Получить DC
memDC=CreateCompatibleDC(DC); // Совместимый DC
SelectObject(memDC,hBit1);
BitBlt(DC,LOWORD(lParam),HIWORD(lParam),77,77,
memDC,0,0,SRCCOPY); // Вывод растра
ReleaseDC(hwnd,DC); // Освободить DC
DeleteDC(memDC); // Освободить DC памяти
break;
case WM_DESTROY: // Завершение программы
DeleteObject(hBit1); // Удалить растр из памяти
PostQuitMessage (0);
break;
default:
// Все сообщения, не обрабатываемые в
// данной функции, направляются на обработку
// по умолчанию
return DefWindowProc(hwnd,message,
wParam,lParam);
}
return 0;
}