
- •Уп. 1. Создание оконных приложений Win32
- •1. Определения
- •2. Класс окон
- •2.1. Описание используемых классом окон ресурсов
- •2.2. Пример регистрации класса окон
- •2.3. Функция окна
- •3. Создание окон
- •4. Главная функция приложения
- •5. Создание приложения Win32
- •1.6. Вспомогательные функции создания окон
- •1.6.1. Функции поиска и определения состояния окон
- •1.6.2. Функции перемещения окон
- •1.6.3. Сообщения приложения для пользователя
- •7. Примеры создания окон
- •7.1. Проверка наличия предыдущего экземпляра
- •7.2. Расположение окон черепицей
- •Контрольные вопросы
- •Упражнения
- •Приложение 1
5. Создание приложения Win32
Структура текста приложения определяется двумя требованиями:
1. Текст содержит описание функции с именем WinMain.
2. Если регистрируются новые классы, то текст содержит описание структуры типа WNDCLASS и функций окон этих классов.
Рассмотрим пошагово процесс создания базового приложения на базе Win32, отображающего в окне надпись "Hello, World!".
В меню File последовательно выберите пункты New и Project.
В левой области диалогового окна New Project щелкните Installed Templates (Установленные шаблоны), выберите Visual C++ и щелкните Win32. В средней области выберите Win32 Project.
В поле Name введите имя проекта, например UP0101_fio (UP – учебная практика, 01 – первый день, 01 – первое приложение, fio – ваши инициалы).
В поле Location (Расположение) установите путь к вашим проектам (предположительно: c:\stud\5xx\, где хх – номер вашей группы).
В поле Solution name (Имя решения) укажите UP01_fio, чтобы все проекты первого дня практики сохранялись в одной папке.
Еще раз проверьте правильность ввода имени проекта и пути для сохранения и нажмите ОК.
На начальной странице Win32 Application Wizard (Мастер приложений Win32) ознакомьтесь с информацией и нажмите кнопку Next.
На странице Application Settings (Параметры приложения) в разделе Application type (Тип приложения) выберите Windows application (Приложение Windows).
В поле Additional options (Дополнительные параметры) выберите Empty project (Пустой проект).
Чтобы создать проект, нажмите кнопку Finish (Готово).
В окне Solution Explorer (Обозреватель решений) щелкните правой кнопкой мыши созданный проект UP0101_fio, выберите команду Add (Добавить) и щелкните New Item (Новый элемент).
В диалоговом окне Add New Item (Добавление нового элемента) выберите C++ File (.cpp).
В поле Name введите имя файла, например zad01_fio.cpp.
Нажмите кнопку Add.
Поскольку в коде приложения должны использоваться существующие определения, добавьте в файл оператор включения
#include <windows.h>
Добавьте функцию WinMain следующего синтаксиса:
//Описание главной функции
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
return 0;
}
Добавьте функцию оконной процедуры с именем WndProc:
//Описание функции окон
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
return 0;
}
Добавьте глобальные переменные – дескриптор текущего приложения hInst и название класса окна szClassName: (fio – это ваши ФИО)
//Описание глобальных переменных
HINSTANCE hInstance;
TCHAR szClassName[]=TEXT("WinAppClass_fio");
В функции WinMain задайте значение глобальной переменной hInstance, установив его равным первому параметру, переданному в функцию WinMain:
hInstance = hInst;
Создайте функцию регистрации окна RegClass, пример которой с подробным описанием всех строк приведен в п. 2.2
//Описание функции регистрации классов
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
WNDCLASS wc;
wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;
wc.lpfnWndProc = Proc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(brBackground + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szName;
return (RegisterClass(&wc) != 0);
}
Добавьте в функцию WinMain вызов функции регистрации окна. Первым параметром передайте название функции окна, вторым параметром – имя регистрируемого класса окна, третьим – цвет окна. В случае неудачи будет показано стандартное окно сообщений (отредактируйте выдаваемые сообщения по своему вкусу!!!):
if (!RegClass( WndProc, szClassName, COLOR_WINDOW))
{
MessageBox( NULL,
TEXT("Вызов функции RegClass закончился с ошибкой!"),
TEXT("Первое Win32 приложение Иванова Ивана"),
NULL);
return FALSE;
}
Теперь можно создать окно. Для этого в функции WinMain воспользуйтесь функцией CreateWindow (отредактируйте заголовок окна!!!). Эта функция возвращает объект HWND, являющийся дескриптором окна:
HWND hwnd;
hwnd = CreateWindow(szClassName,
TEXT("Первое Win32 приложение Иванова Ивана"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0, 0,
hInstance,
NULL);
if (!hwnd)
{
MessageBox(NULL,
TEXT("Вызов функции CreateWindow завершился ошибкой!"),
TEXT("Первое Win32 приложение Иванова Ивана"),
NULL);
return FALSE;
}
Отредактируйте функцию окна WndProc, чтобы окно могло обрабатывать необходимые сообщения. Для минимальной функциональности окно должно обрабатывать сообщение WM_DESTROY, получаемое перед разрушением окна:
//Описание функции окон
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY: { PostQuitMessage(0); return 0;}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
Теперь добавьте в функцию WinMain цикл обработки сообщений для прослушивания отправляемых ОС сообщений. Цикл обработки сообщений напоминает следующий код.
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
На данном этапе можно попробовать запустить приложение. Если все было выполнено правильно, то вы увидите окно, показанное на рисунке 1.2.
Рис. 1.2. Результат выполнения приложения
Рассмотренное приложение регистрирует класс перекрывающихся окон, создает окно этого класса и передает управление циклу обработки сообщений.
Как видно из листингов, приложение является обычной программой языка Си. Текст содержит привычные директивы, объявления и описания. Отличие содержится в заголовке главной функции, в специфической функции окна и в способе ее вызова.
Рассмотрим алгоритм работы этого приложения.
Классы окон регистрируют в начале работы приложения.
Окно приложения создают до передачи управления циклу обработки сообщений.
Отсутствуют вызовы функций ShowWindow и UpdateWindow. Это обусловлено тем, что окно создано со стилем WS_VISIBLE. В таком случае функция CreateWindow посылает все сообщения, которые необходимы для отображения созданного окна и перерисовки его рабочей области.
Управление передают циклу обработки сообщений. В теле этого цикла выбираются и распределяются сообщения.
Функция окна обрабатывает сообщение WM_DESTROY, а остальные сообщения возвращает системе. Функция окна приложения должна обрабатывать это сообщение.
Приложение завершает работу.
Таким же является алгоритм работы большинства приложений. Отличие между ними в основном заключается в функциях окон.
Может показаться, что отображение и удаление окна – слишком простая задача для такого "сложного" текста.
Проанализируем, что же на самом деле может сделать это приложение.
Как видим, стиль полностью определяет внешнее поведение окна. Благодаря стилю WS_OVERLAPPEDWINDOW окно содержит двойные рамки изменения размеров и заголовок, в области заголовка расположены системное меню и кнопки для сворачивания, восстановления размеров и закрытия окна. С помощью этих элементов можно перемещать окно, изменять его размеры, сворачивать окно в пиктограмму, восстанавливать и закрыть окно.
Функциональные возможности окна могли бы быть необозримо шире. Это окно принимает все сообщения от пользователя, системы и других окон. То есть оно готово сотрудничать с пользователем и открыть доступ к ресурсам системы. Но описание функции окна в примере содержит обработку только одного сообщения. Остальные сообщения в примере не обрабатывают и передают операционной системе. По сути, они только удаляются из очереди сообщений.
Обработка сообщений в первую очередь подразумевает определение текущего состояния окон и управление этим состоянием, выдачу тех или иных сообщений пользователю. Приступим к изучению таких функций операционной системы. Сначала рассмотрим функции, которые связаны с процессом создания окон.