- •Основные компоненты 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), компиляция
Структура windows – программы.
Любая программа начинается с текста:
#include <windows.h>
#include <stdlib.h>
const char szClassName[] = "Имя класса окна";
const char szWindowName[] = "Заголовок окна";
// Прототип функции обработки сообщений главного окна приложения
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);
//обрабатывает различные сообщения
#pragma argsused // Не будет предупреждения, что функция не пользуется своими параметрами
int PASCAL WinMain // компилиция в стиле Паскаль (с очисткой стека от параметров функции) – ускоряет время работы
(HINSTANCE hInstance, // идентификатор приложения
HINSTANCE hPrevInstance, // идентификатор предыдущей копии приложения
LPSTR lpszCmdLine, // адрес командной строки
int nCmdShow) // будет ли видимым или невидимым
{тело функции}
Функция WinMain – обязательна, получает управление при запуске приложения, возвращает значение типа int, что позволяет передать операционной системе Windows или отладчику код завершения приложения. {Устанавливает расположение стека, выполняет все необходимые инициализирующие функции}
Структура программы в Windows:
А
синхр.
– формируется самому себе или другому
приложению, минуя системную очередь
Синхр – через системную очередь, в очередь приложения.
GetMessage выбирает сообщения из очереди приложения и осуществляет заполнение структуры MSG – для временного хранения информации о сообщении.
TranslateMessage – занимается обработкой клавишных команд.( берет сообщение из очереди сообщений.)
DispatchMessage – определяет, какому окну данного приложения направить сообщение. Предусмотрена передача управления в Windows.
Затем Windows берет обработчик, дополняет необходимым кодом (“Prolog”), чтобы функция соответствовала ОС. В этот момент Windows может перехватить управление.
В WM_QUIT проверяется, не окончание ли это работы. Да – выход, нет – идем дальше.
WM_DESTROY – сообщение, в случае закрытия окна. При его выводе из очереди приложения запускается функция, которая генерирует сообщение WM_QUIT и только после этого закрывается окно: для того, чтобы закрывалось не только окно, но и все приложение + сохранить изменения и т.п.
Функция WndProc НЕ ВЫЗЫВАЕТСЯ ни из одной функции приложения. Эту функцию вызывает Windows в процессе обработки сообщений. Для этого адрес функции WndProc указывается при регистрации класса окна. Функция выполняет обработку сообщений главного окна приложения.
Пример простейшего Windows-приложения.
// 1а. Подключение необходимых библиотек
#include <windows.h>
#include <stdlib.h>
// 1б. Объявление необходимых переменных
const char szClassName[] = "WinLab_01"; // Имя класса окна
const char szWindowName[] = "Term II. Windows Lab 01."; // Заголовок окна
// 1б. Объявление прототипа функции обработки сообщений
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);
// 2. Главная функция Windows-приложения – функция WinMain
#pragma argsused
int PASCAL WinMain
(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
// 2а. Объявление идентификатора окна
HWND hWnd;
// 2б. Описание класса окна
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = 5;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szClassName;
// 2в. Регистрируем класс окна
if (!RegisterClass(&wndclass)) exit(FALSE);
// 2г. Создаем окно функцией CreateWindow и проверяем успешность создания
hWnd=CreateWindow(szClassName,szWindowName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
0,CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd) exit(FALSE);
// 2д. Показываем окно
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// 2е. Цикл сообщений
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{TranslateMessage(&msg);
DispatchMessage(&msg);}
return msg.wParam;
}
/* 3. Обработчик сообщений */
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{switch (iMessage)
{case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, iMessage, wParam, lParam); }
return 0;}
Таким образом, для создания окна в Windows необходимо произвести следующие действия:
Написать функцию WinMain 1.1 Зарегистрировать класс окна 1.2.Создать окно.
Организовать цикл сообщений. 1.3. Произвести визуализацию окна. 1.5 Написать обработчик сообщений.
