Инициализация программы
В файле MDIDEMO.С WinMain начинается с регистрации классов окна для главного окна и двух дочерних окон. Их оконные процедуры называются FrameWndPro c, HelloWndProc и RectWndPro c. Как правило, с каждым из этих трех классов связан свой значок. Для простоты в программе и для главного и для дочерних окон использован стандартный значок IDI_APPLICATION. Обратите внимание, что в поле hbrBackground структуры WNDCLASSEX для класса главного окна задан системный цвет COLOR_APPWORKSPACE. Однако, когда главное окно появляется на экране первым, одинаковый цвет смотрится несколько лучше.
В поле lpszMenuName заносится значение NULL для каждого из трех классов окна. Для классов окна дочерних окон Hello и Rect это нормально. Для главного окна это сделано для того, чтобы указать описатель меню при создании главного окна в функции CreateWindo w.
Далее WinMain использует функцию LoadMenu для загрузки трех меню и сохраняет их описатели в глобальных переменных. Три вызова функции GetSubMenu позволяют получить описатели подменю Window, в которому будет добавлен список окон документов. Они также запоминаются в глобальных переменных. Функция LoadAccelerators загружает таблицу быстрых клавиш.
Вызов функции CreateWindow в WinMain создает главное окно. При обработке в FrameWndProc сообщения WM_CREATE главное окно создает окно - администратор. При этом еще раз вызывается функция CreateWindo w. Класс окна задается как MDICLIENT, который представляет собой уже зарегистрированный в системе класс для окна - MDI. Последний параметр функции CreateWindow должен быть указателем на структуру типа CLIENTCREATESTRUCT. В этой структуре имеется два поля:
hWindowMenu является описателем подменю, в котором появится список документов. В программе MDIDEMO это описатель hMenuInitWindo w, полученный в WinMai n. Позже мы узнаем, как изменить меню.
idFirstChild является идентификатором меню , относящимся к первому окну документа в списке документов.
Он просто равен IDM_FIRSTCHILD.
Вернемся к WinMai n. Программа MDIDEMO выводит на экран только что созданное главное окно и входит в цикл обработки сообщений. Этот цикл обработки сообщений немного отличается от обычного: после получения сообщения из очереди при помощи функции GetMessage программа MDI передает сообщение функции TranslateMDISysAccel (функции TranslateAccelerato r, если, как и в программе MDIDEMO, в программе также имеются быстрые клавиши меню ).
Функция TranslateMDISysAccel преобразует любые комбинации клавиш, которые могут соответствовать специальным быстрым клавишам MDI (<Ctrl>+<F6>), в сообщение WM_SYSCOMMAND. Если одна из
– 95 –
функций TranslateMDISysAccel или TranslateAccelerator возвращает TRUE (означает, что сообщение было преобразовано одной из этих функций ), то вызова функции TranslateMessage и функции DispatchMessage не происходит.
Обратите внимание на два описателя окон, передаваемые функциям TranslateMDISysAccel и TranslateAccelerato r: соответственно hwndClient и hwndFram e. Функция WinMain получает описатель окна hwndClien t, используя вызов функции GetWindow с параметром GW_CHILD.
Дата добавления: 2016-11-22; просмотров: 545;