Теперь, когда вы познакомились с основными понятиями и структурой приложения Presentation Manager, можно перейти к практике. Для начала мы создадим простейшее приложение MYWINDOW, которое создает одно главное окно и не имеет ни меню, ни других атрибутов современных приложений.
Если вы установите курсор мыши в область Client Window и сделаете щелчок правой либо левой клавишей мыши, на экране появится диалоговая панель, в которой будут показаны координаты курсора мыши (в системе координат, связанной с окном Client Window).
Внешний вид приложения MYWINDOW и диалоговая панель с координатами курсора мыши показана на 1.2.
1.2. Главное окно приложения MYWINDOW
Исходные тексты приложения приведены в листинге 1.1.
Листинг 1.1. Файл mywindow\mywindow.c
// =================================================== // Определения // ===================================================
// Определения для файла os2.h #define INCL_WIN #define INCL_GPI #define INCL_WINDIALOGS
// Файл содержит определения, необходимые // для любого приложения OS/2 #include <os2.h>
// Этот файл нужен для определения функции sprintf #include <stdio.h>
// Определение констант для приложения MYWINDOW #include "mywindow.h"
// Заголовок приложения CHAR szAppTitle[] = "My First OS/2 Application";
// =================================================== // Главная функция приложения main // Получает управление при запуске приложения // ===================================================
int main () { // Идентификатор очереди сообщений HMQ hmq;
// Структура, в которую записывается сообщение, // извлеченное из очереди QMSG qmsg;
// Переменная для хранения кода возврата BOOL fRc;
if(fRc == FALSE) { WinMessageBox (HWND_DESKTOP, HWND_DESKTOP, "Ошибка при регистрации класса главного окна", "Ошибка", 0, MB_ICONHAND | MB_OK);
// Перед аварийным завершением приложения // уничтожаем созданную ранее очередь сообщений и // вызываем функцию WinTerminate WinDestroyMsgQueue (hmq); WinTerminate (hab);
// Удаляем очередь сообщений и вызываем // функцию WinTerminate WinDestroyMsgQueue (hmq); WinTerminate (hab);
// Возвращаем управление операционной системе return(0); }
// =================================================== // Функция главного окна приложения // Обрабатывает сообщения, поступающие // в очередь приложения // ===================================================
MRESULT EXPENTRY WndProc( HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2) { // Временный буфер для подготовки сообщения CHAR szMsg[100];
switch (msg) { // Обработчик сообщения WM_ERASEBACKGROUND // Это сообщение поступает перед перерисовкой // внутренней области окна case WM_ERASEBACKGROUND : return(MRFROMLONG(1L));
// Обработчик сообщений // WM_BUTTON1DOWN и WM_BUTTON2DOWN . // Эти сообщения поступают, когда пользователь // делает в окне приложения щелчок левой и правой // кнопкой мыши, соответственно case WM_BUTTON1DOWN : case WM_BUTTON2DOWN : { // Определяем координаты курсора мыши и // записываем их в виде текстовой строки // во временный буфер sprintf (szMsg, "(x, y) = (%ld, %ld)", SHORT1FROMMP (mp1), SHORT2FROMMP (mp1));
// Если наша функция окна не обрабатывает // сообщение, его следует обязательно передать // функции WinDefWindowProc default: return(WinDefWindowProc (hWnd, msg, mp1, mp2)); } }
Файл mywindow.h, который содержит определение идентификатора окна Frame Window , представлен в листинге 1.2.