
- •Основные компоненты windows – программы (.Cpp, .H, .Res, .Rc, .Def), компиляция.
- •Файл определения модуля.
- •Структура windows – программы.
- •Структура программы в Windows:
- •Сообщения. Источники сообщений
- •Формирование сообщений, примеры. Очереди.
- •Сообщения. Цикл сообщений, основные компоненты.
- •Сообщения. Структура сообщений на примере wm_command
- •Структура msg. Обработка сообщений.
- •Средства обработки сообщений в приложении и windows.
- •Окна, классы и типы окон.
- •Регистрация класса окна, основные элементы класса.
- •Int cbClsExtra; // 3. Доп. Память для окон, созд-мых на базе данного класса
- •Int cbWndExtra; // 4. Доп. Память для создания окна (3, 4 – в байтах)
- •Линейки прокрутки, переключатели, окна пометки, окна списка.
- •1. Кнопки, переключатели (переключатели – кнопки с 3-мя состояниями (вкл, выкл и неактивен)
- •2. Полосы прокрутки.
- •3. Окна списка
- •Комбинированные списки, окна редактирования и статические текстовые объекты.
- •1. Комбинированные списки
- •2. Окна редактирования
- •3. Статический орган управления (статический текстовый объект)
- •Способы создания меню
- •Создание меню в файле ресурсов
- •С помощью функций в теле программы
- •Создание меню редактором ресурсов
- •Определение диалоговой панели, взаимодействие пользователя с панелью.
- •1. Создание шаблона.
- •2. Создание функции диалога.
- •3. Вызов одной из функций создания диалога
- •Диалоговые панели, модальные панели.
- •Немодальные панели. Отличие циклов сообщений.
- •Ресурсы. Файл ресурсов, текстовый, бинарный. Создание.
- •Файл определения модуля. Назначение, основные директивы (относящиеся к коду и данным).
- •Графический приборный интерфейс gdi. Состав, назначение.
- •Контекст, содержание контекста.
- •Общий контекст, родительский, личный, для класса окна, физический.
- •1. Общий контекст отображения.
- •2. Контекст отображения для класса окна
- •3. Личный контекст отображения
- •4. Родительский контекст отображения
- •5. Контекст физического устройства
- •Последовательность действий приложения при формировании рисунка
- •Преобразование логических координат в физические и наоборот, единицы измерений, масштабирование.
- •Назначение и состав структуры paintstruct. Сообщение wm_paint.
- •Int right; х-коор-та нижнего правого угла
- •Int bottom; y-коор-та
- •Дополнительные темы.
- •Аппаратная независимость
- •Основные компоненты windows – программы (.Cpp, .H, .Res, .Rc, .Def), компиляция
Сообщения. Цикл сообщений, основные компоненты.
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
Сообщение - это извещение о некотором имевшем место событии, посылаемое системой Windows – они информируют Windows или приложение, что произошло какое-то событие (например, произошло нажатие клавиши). Также сообщение может быть послано или получено от другого пользователя или Windows
Для каждого приложения создается своя очередь сообщений. Очередь сообщения приложений может пополняться не только из системной очереди сообщений. Любое приложение может послать сообщение любому другому сообщению, в том числе и само себе.
Основная работа, которую должно выполнять приложение, заключается в обслуживании собственной очереди сообщений. Обычно приложение в цикле, называемом циклом сообщений, опрашивает свою очередь сообщений (каждая программа должна иметь функцию обработки сообщений).
Функция WinMain в цикле обработки сообщений с помощью функции GetMessage выбирает сообщения из очереди сообщений приложения и распределяет их функциям окон, вызывая функцию DispatchMessage.
Функция GetMessage предназначена для выборки сообщения из очереди приложения. Сообщение выбирается из очереди и записывается в область данных, принадлежащую приложению.
Функция TranslateMessage занимается обработкой клавишных команд.
Функция DispatchMessage предназначена для распределения выбранного из очереди сообщения нужной функции окна (определяет, какой функции окна отправить сообщение). Так как приложение обычно создает много окон и эти окна используют различные функции окна, необходимо распределить сообщение именно тому окну, для которого оно предназначено. Поэтому приложение должно распределить сообщение после его выборки из очереди приложения, в котором находятся сообщения для всех окон. Затем управление передается Windows, и он вызывает обработчик. Обработчик дополняется кодом и начинает работать в составе ОС.
Типичный цикл сообщений:
MSG msg; // Структура для временного хранения информации о сообщении.
while(GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
Сообщения. Структура сообщений на примере wm_command
Сообщение - это извещение о некотором имевшем место событии, посылаемое системой Windows – они информируют Windows или приложение, что произошло какое-то событие (например, произошло нажатие клавиши). Также сообщение может быть послано или получено от другого пользователя или Windows.
Сообщение WM_COMMAND
idItem = wParam; /* control or menu item identifier */
hwndCtl = (HWND) LOWORD(lParam); /* handle of control */
wNotifyCode = HIWORD(lParam); /* notification message */
The WM_COMMAND message is sent to a window when the user selects an item from a menu, when a control sends a notification message
Сообщение с кодом WM_COMMAND передается функции родительского окна от органа управления, созданного этим окном. При создании органа управления (например, кнопки на базе класса "button") вызывается функция CreateWindow, которой указываете идентификатор родительского окна и идентификатор органа управления.
Если орган управления изменяет свое состояние (например, когда вы нажали на кнопку), функция родительского окна получает сообщение WM_COMMAND. Вместе с этим сообщением функция родительского окна получает в параметре wParam идентификатор органа управления. Младшее слово параметра lParam содержит идентификатор дочернего окна, т. е. идентификатор окна органа управления. Старшее слово lParam содержит код извещения от органа управления (notification code), по которому можно судить о том, какое действие было выполнено над органом управления.
Когда вы нажимаете на кнопку, родительское окно получает сообщение WM_COMMAND с кодом извещения, равным BN_CLICKED. Получив такое сообщение, приложение определяет, что была нажата кнопка, идентификатор которой находится в параметре wParam.
Или, если у нас создано меню с помощью шаблона, то мы можем получить это сообщение при выборе пункта системного меню. wParam содержит идентификатор строки, определенной в шаблоне меню.
Пример обработки сообщения WM_COMMAND:
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch (iMessage)
{
// Осуществим обработку выбранного пункта меню
case WM_COMMAND:
{
switch (wParam)
{
// Сообщения от меню
case IDM_FIVE:
break;
case IDM_FOUR:
{
PostQuitMessage(0);
break;
}
}
}
default:
return DefWindowProc(hWnd, iMessage, wParam, lParam);
}
return 0;
}