Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
04-09-2015_19-17-13 / Конспект лекций.doc
Скачиваний:
98
Добавлен:
01.03.2016
Размер:
1.31 Mб
Скачать

17.2 Структура каркасного Windows-приложения

//Простейшая программа с главным окном

//Операторы препроцессора

#define STRICT //Строгая проверка типов переменных

#include <windows.h> //Два файла с определениями, макросами и прототи-

#include <windowsx.h> //пами функций Windows

#include <string.h> //Заголовочный файл с прототипом функции memset

//Прототипы используемых в программе функций Windows

void Register(HINSTANCE); //Функция регистрации класса окна

void Create(HINSTANCE, int); //Функция создания главного (единств.) окна

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //Оконная функция

//Глобальные переменные, доступные всем функциям

char szClassName[]=”MainWindow”; //Произвольное имя класса главного окна

char szTitle[]=”Программа”; //Произвольный заголовок окна

//Главная функция WinMain

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR, int nCmdShow)

{

MSG msg; //Структура для временного хранения сообщений Windows

if (hPrevInstance==NULL) //Только для первого экземпляра приложения

Register(hInstance); // 1) Регистрация в Windows класса окна

Create(hInstance, nCmdShow); // 2) Создание и вывод на экран окна

while (GetMessage(&msg, NULL, 0, 0)) // 3) Цикл обработки сообщений:

DispatchMessage(&msg); // ждать сообщение, записать его в msg и передать WndProc

Return msg.wParam; //После выхода из цикла вернуться в Windows

}

//Функция Register() регистрации класса окна

void Register(HINSTANCE hInst)

{

WNDCLASS wc; //Структура для задания характеристик класса окна

memset(&wc, 0, sizeof(wc)); //Обнуление всех членов структуры

wc.lpszClassName=szClassName; //Записываем в структуру имя класса окна

wc.hInstance=hInst; //Дескриптор приложения

wc.lpfnWndProc=WndProc; //Определяем оконную функцию для главного окна

wc.hCursor=LoadCursor(NULL, IDC_ARROW); //Будет стандартный курсор мыши

wc.hIcon=LoadIcon(NULL, IDC_APPLICATION); //Будет стандартная пиктограмма

wc.hbrBackground=GetStockBrush(WHITE_BRUSH); //Будет белая кисть для фона окна

RegisterClass(&wc); //Вызов функции Windows регистрации класса окна

}

//Функция Create() создания и показа окна

void Create(HINSTANCE hInst, int nCmdShow)

{

HWND hwnd=CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW, 10, 10, 300, 100, HWND.DESKTOP, NULL, hInst, NULL); //Класс и заголовок окна, стиль окна и его координаты и размеры, родитель, меню, дескриптор, дополнительные параметры

ShowWindow(hwnd, nCmdShow); //Вызов функции Windows показа окна

}

//Оконная функция WndProc() главного окна

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

switch(msg)

{

case WM_DESTROY: //При завершении приложения пользователем

PostQuitMessage(0); //Параметр – код завершения пойдет в msg.wParam

return 0;

default: //В случае всех остальных сообщений Windows

return(DefWindowProc(hwnd, msg, wParam, lParam)); //Обработка их по умолчанию

}

}

Данная структура программы типична для простых приложений Windows. В программе описаны четыре функции: WinMain(), Register(), Create() и WndProc(). При запуске приложения Windows управление всегда передается функции WinMain(), которая должна присутствовать в любой программе. Более того, эта функция, имея в принципе циклический характер, выполняется в течение всей жизни приложения. Основное ее назначение – выполнение инициализирующих действий и организация цикла обработки сообщений, т. е. сообщить системе о новом для нее приложении, его свойствах и особенностях.

Для достижения этой цели WinMain() выполняет следующие действия:

  • определяет и регистрирует класс окна приложения;

  • создает и отображает окно приложения зарегистрированного класса;

  • создает и запускает цикл обработки сообщений для приложения;

  • завершает программу при получении оконной функцией соответствующего сообщения.

Сообщения Windows являются, пожалуй, самой важной концепцией этой системы. Каждый раз, когда происходит какое-либо событие, затрагивающее интересы программы (например, пользователь выбирает пункт меню или нажимает на кнопку в окне диалога), Windows посылает приложению сообщение об этом событии. Задача функции WinMain() заключается в приеме этого сообщения и передаче его второму важнейшему компоненту любого приложения Windows – функции главного окна или оконной функции. В отличие от главной функции WinMain(), имя которой изменять нельзя, имя оконной функции может быть любым (в нашем случае – WndProc()). У внутренних окон, расположенных внутри главного окна, будут другие оконные функции.

Оконная функция состоит из стольких фрагментов, сколько конкретных сообщений предполагается обрабатывать в данном приложении. Если, например, приложение должно отслеживать координаты мыши, то в оконную функцию следует включить фрагмент обработки сообщений о перемещении мыши; если, кроме этого, приложение должно реагировать на нажатие клавиш клавиатуры, в оконную функцию включается фрагмент обработки сообщений о нажатии клавиш. В соответствии с соглашениями ОС Windows оконная функция приложения должна быть видимой за пределами приложения, в котором она описана. Это связано с тем, что оконная функция вызывается самой ОС Windows при поступлении сообщений для каждого приложения.

Две остальные функции, входящие в состав приложения – Register()и Create() введены в программу просто для повышения ее модульности. Они являются подпрограммами, явно вызываемыми из функции WinMain(). Другими словами, в эти функции внесены некоторые действия, которые, вообще говоря, должны быть выполнены в функции WinMain().

Программа начинается с группы операторов препроцессора.

Определения дескрипторов, как и многих других специфических для Windows типов переменных, содержатся в заголовочном файле windows.h, который необходимо присоединить к компилируемой программе с помощью директивы препроцессора

#include <windows.h>.

Функции Win32 API в качестве передаваемых им параметров используют множество констант и данных определенной структуры. В пакете компилятора С/С++ эти данные расположены в заголовочных файлах, совокупность которых можно рассматривать как дерево с корнем в виде файла windows.h.

Вслед за операторами препроцессора идет раздел прототипов, где определяются прототипы всех функций пользователя, включенных в программу. Прототип функции WinMain(), также как и прототипы всех остальных функций Windows (RegisterClass(), GetMessage() и другие) описан в файле windows.h и не нуждается в повторном определении.

Функции Register() и Create() придуманы для повышения структурированности программы. Типы их параметров и возвращаемых значений были определены в известной степени произвольно. Иное положение с оконной функцией WndProc(). Эта функция вызывается из Windows при поступлении в приложение того или иного сообщения. Поэтому список параметров, а также тип возвращаемого значения и прочие характеристики этой функции определены совершенно жестко и изменены быть не могут. Функция принимает четыре параметра типов: HWND, UINT, WPARAM и LPARAM и возвращает результат типа LRESULT. Кроме этого, функция должна быть объявлена описателем CALLBACK, что эквивалентно far pascal, т. е. с дальней передачей параметров.

Глобальные переменные, описываемые до главной функции WinMain(), характерны тем, что они известны, или видимы во всех функциях и других блоках программы; их объявление позволяет сократить список параметров функций. Так, переменная szClassName используется в функциях Register() и Create() без передачи ее через параметры этих функций. Однако переменная szTitle используется лишь однажды при вызове функции Windows CreateWindow() и объявлять ее глобальной нет ни какой необходимости; в список глобальных эта переменная попала лишь ради наглядности и упрощения последующей модификации программы.

Соседние файлы в папке 04-09-2015_19-17-13