Операционная система Microsoft Windows 3.1 для программиста -том 1

         

Листинги файлов приложения


В отличие от первого приложения (листинг 1.1) новое приложение состоит из двух файлов - файла window.cpp (листинг 1.2), содержащего исходный текст функций приложения, и файла window.def (листинг 1.3), который является файлом определения модуля.

В файле window.cpp определены функции WinMain, InitApp и функция окна WndProc, то есть все функции, из которых состоит приложение. Файл window.def содержит инструкции редактору связей. Эти инструкции используются при создании загрузочного exe-файла приложения.

Рассмотрим подробно файл window.cpp.

Листинг 1.2. Файл window\window.cpp

// ---------------------------------------- // Простейшее приложение Windows // с циклом обработки сообщений // ---------------------------------------- #define STRICT #include <windows.h> #include <mem.h> // Прототипы функций BOOL InitApp(HINSTANCE); LRESULT CALLBACK _export WndProc(HWND, UINT, WPARAM, LPARAM); // Имя класса окна char const szClassName[] = "WindowAppClass"; // Заголовок окна char const szWindowTitle[] = "Window Application"; // ===================================== // Функция WinMain // Получает управление при запуске // приложения // ===================================== #pragma argsused int PASCAL WinMain(HINSTANCE hInstance, // идентификатор текущей // копии приложения HINSTANCE hPrevInstance, // идентификатор предыдущей // копии приложения LPSTR lpszCmdLine, // указатель на командную // строку int nCmdShow) // способ отображения // главного окна приложения { MSG msg; // структура для работы с сообщениями HWND hwnd; // идентификатор главного окна приложения // Проверяем, не запускалось ли это приложение ранее if(!hPrevInstance) { // Если не запускалось, вызываем функцию InitApp // для инициализации приложения. // Если инициализацию выполнить не удалось, // завершаем приложение if(!InitApp(hInstance)) return FALSE; } // Если данное приложение уже работает, // выводим сообщение о том, что допускается // запуск только одной копии приложения, и // затем завершаем работу приложения else { MessageBox(NULL, "Можно запускать только одну копию приложения", "Ошибка", MB_OK | MB_ICONSTOP); return FALSE; } // После успешной инициализации приложения создаем // главное окно приложения hwnd = CreateWindow( szClassName, // имя класса окна szWindowTitle, // заголовок окна WS_OVERLAPPEDWINDOW, // стиль окна CW_USEDEFAULT, // задаем размеры и расположение CW_USEDEFAULT, // окна, принятые по умолчанию CW_USEDEFAULT, CW_USEDEFAULT, 0, // идентификатор родительского окна 0, // идентификатор меню hInstance, // идентификатор приложения NULL); // указатель на дополнительные // параметры // Если создать окно не удалось, завершаем приложение if(!hwnd) return FALSE; // Рисуем окно.
Для этого после функции ShowWindow, // рисующей окно, вызываем функцию UpdateWindows, // посылающую сообщение WM_PAINT в функцию окна ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // Запускаем цикл обработки сообщений while(GetMessage(&msg, 0, 0, 0)) { DispatchMessage(&msg); } // Возвращаем значение WParam, переданное // в качестве параметра функции PostQuitMessage // в процессе инициирования завершения работы // приложения из функции окна. // Затем завершаем работу приложения return msg.wParam; } // ===================================== // Функция InitApp // Вызывается из функции WinMain для // инициализации приложения. // Выполняет регистрацию класса окна // ===================================== BOOL InitApp(HINSTANCE hInstance) { ATOM aWndClass; // атом для кода возврата WNDCLASS wc; // структура для регистрации // класса окна memset(&wc, 0, sizeof(wc)); // Стиль окна wc.style = 0; // Указатель на функцию окна, обрабатывающую // сообщения, предназначенные для всех окон, // созданных на основе данного класса wc.lpfnWndProc = (WNDPROC) WndProc; // Размер дополнительной области данных, // зарезервированной в описании класса окна wc.cbClsExtra = 0; // Размер дополнительной области данных, // зарезервированной для каждого окна, // созданного на основе данного класса wc.cbWndExtra = 0; // Идентификатор приложения, которое // создало данный класс wc.hInstance = hInstance; // Идентификатор пиктограммы, используемой // для окна данного класса wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Идентификатор курсора, используемого // для окна данного класса wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Цвет фона окна wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // Идентификатор меню wc.lpszMenuName = (LPSTR)NULL; // Имя, которое присваивается создаваемому // классу и используется при создании // окон данного класса wc.lpszClassName = (LPSTR)szClassName; // Регистрация класса aWndClass = RegisterClass(&wc); // Возвращаем результат регистрации класса return (aWndClass != 0); } // ===================================== // Функция WndProc // НЕ ВЫЗЫВАЕТСЯ ни из одной функции приложения. // Эту функцию вызывает Windows в процессе // обработки сообщений.


Для этого адрес функции WndProc // указывается при регистрации класса окна. // Функция выполняет обработку сообщений главного // окна приложения // ===================================== LRESULT CALLBACK _export WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { // Выполняем обработку сообщений. Идентификатор // сообщения передается через параметр msg switch (msg) { // Это сообщение приходит, когда вы поместили курсор // мыши в область главного окна приложения и нажали // левую клавишу мыши case WM_LBUTTONDOWN: { MessageBox(NULL, "Нажата левая клавиша мыши", "Сообщение", MB_OK | MB_ICONINFORMATION); return 0; } // Это сообщение приходит, когда вы поместили курсор // мыши в область главного окна приложения и нажали // правую клавишу мыши case WM_RBUTTONDOWN: { MessageBeep(-1); // звуковой сигнал MessageBox(NULL, "Нажата правая клавиша мыши", "Сообщение", MB_OK | MB_ICONINFORMATION); return 0; } // Это сообщение приходит, когда вы завершаете // работу приложения стандартным для // Windows способом case WM_DESTROY: { // Инициируем завершение работы приложения, // помещая в очередь приложения сообщение // WM_QUIT. Это приведет к завершению // цикла обработки сообщений в функции WinMain PostQuitMessage(0); return 0; } } // Все сообщения, которые не обрабатываются нашей // функцией окна, ДОЛЖНЫ передаваться функции // DefWindowProc return DefWindowProc(hwnd, msg, wParam, lParam); }


Содержание раздела