- •Московская финансово-промышленная академия
- •Содержание
- •Глава 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. Линейки прокрутки
4.6. Загрузка таблицы акселераторов
Хотя акселераторы определены в том же файле ресурсов, что и меню, они должны быть отдельно загружены при помощи функции API LoadAccelerators(), которая имеет следующий прототип:
HACCEL LoadAccelerators (HINSTANCE ThisInst, LPSTR Name);
ThisInst – это дескриптор текущего экземпляра приложения, a Name – имя таблицы акселераторов. Функция возвращает дескриптор загруженной таблицы акселераторов либо NULL, если таблица не может быть загружена.
Функцию LoadAccelerators() нужно вызывать сразу после создания окна. Например, таблица акселераторов для MYMENU загружается так:
HACCEL hAccel;
...
hAccel=LoadAccelerators(hThisInst,"Mymenu");
Значение hAccel будет использовано позже для обработки акселераторных комбинаций.
Несмотря на то, что функция LoadAccelerators() загружает таблицу акселераторов, программа не будет обрабатывать их до тех пор, пока Вы не добавите в цикл обработки сообщений еще одну функцию API. Эта функция называется TranslateAccelerator():
int TranslateAccelerator (HWND hwnd,
HACCEL hAccel,
LPMSG lpMess) ;
Здесь hwnd является дескриптором окна, для которого должны транслироваться акселераторные комбинации, hAccel – дескриптором таблицы акселераторов, возвращаемым функцией LoadAccelerators(), и наконец, lpMess – указателем на сообщение.
Функция TranclateAccelerator() возвращает ненулевое значение, если была использована акселераторная комбинация, и нулевое – в противном случае. Таким образом, эта функция транслирует акселераторы в соответствующие сообщения WM_COMMAND.
С использованием функции TranslateAccelerator() цикл обработки сообщений будет выглядеть так:
while(GetMessage(&msg,NULL,0,0))
{
if(!TranslateAccelerator(hwnd,hAccel,&msg))
{
TranslateMessage(&msg); // Использовать клавиатуру
DispatchMessage (&msg); // Вернуть упр. к Windows
}
}
Пример 4-3. Попробуйте использовать акселераторы, подставив в предыдущий пример приведенную ниже версию WinMain() и добавив в файл ресурсов таблицу акселераторов:
// Обработка акселераторов
#include <Windows.h>
#include <String.h>
#include <Stdio.h>
#include "Menu.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;
HACCEL hAccel; // Для обработки акселераторов
WNDCLASS wcl; // Определить класс окна
wcl.hInstance=hThisInst; // Дескриптор приложения
wcl.lpszClassName=szWinName; // Имя класса окна
wcl.lpfnWndProc=WindowFunc; // Функция окна
wcl.style=0; // Стиль по умолчанию
wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);// Иконка
wcl.hCursor=LoadCursor(NULL,IDC_ARROW); // Курсор
wcl.lpszMenuName="Mymenu"; // Главное меню
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); // Нет дополнит. аргументов
hAccel=LoadAccelerators(hThisInst,"Mymenu");
// Загрузить акселераторы
ShowWindow (hwnd, nWinMode); // Показать окно
UpdateWindow (hwnd); // и перерисовать
while(GetMessage(&msg,NULL,0,0))
{
if(!TranslateAccelerator(hwnd,hAccel,&msg))
{
TranslateMessage(&msg); // Использ. клавиатуру
DispatchMessage (&msg); // Вернуться. к Windows
}
}
return msg.wParam;
}
Прежде чем следовать дальше, поэкспериментируйте со своими собственными окнами сообщений, меню и аксел00ераторами. Попробуйте различные варианты и посмотрите, что получится. Меню и окна сообщений будут часто использоваться в настоящей книге, поэтому важно четко понимать, как работают эти элементы.