Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CП.docx
Скачиваний:
9
Добавлен:
30.10.2018
Размер:
824 Кб
Скачать
☆

27. Основи розробки Windows-додатків. Головна функція WinMain(). Повідомлення Windows.

Полноценная программа для Win32 должна содержать как минимум две функции:

WinMain — главную функцию и WndProc — оконную процедуру, обеспечивающую обработку сообщений.

Классическая структура программы-Windows имеет такую структуру:

  • Создание нового класса окна

  • Регистрация класса окон

  • Создание главного окна

  • Цикл обработки очереди сообщений

  • Процедура главного окна

Структура программы выглядит так:

WinMain (список аргументов) // Головна функція

{

WNDCLASS wc //Создание нового класса окна

RegisterClassEx(&wc) //Регистрация класса окон

CreateWindow (список аргументов) //Создание главного окна

while(GetMessage()) //Цикл обработки очереди сообщений

{

TranslateMessage();

DispatchMessage();

}

}

WndProc (список аргументов) // Процедура главного окна

{

Обработка полученного сообщения;

}

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

В основе взаимодействия программы с внешним миром и с операционной системой лежит концепция сообщений. Сообщение — это структура данных, содержащая следующие элементы:

 дескриптор окна, которому адресовано сообщение;

 код (номер) сообщения;

 дополнительную информацию, зависящую от кода сообщения.

Сообщения от внешних источников, например от клавиатуры, адресуются в каждый конкретный момент времени только одному из работающих приложений, а именно — активному окну. С момента старта операционная система создает в памяти глобальный объект, называемый системной очередью сообщений. Все сообщения, генерируемые как аппаратурой, так и приложениями, помещаются в эту очередь. Сообщения, получаемые приложением, могут поступать асинхронно из разных источников. Чтобы не допустить потери сообщений, Windows одновременно с запуском приложения создает глобальный объект, называемый очередью сообщений приложения. Время жизни этого объекта совпадает с временем жизни приложения. путь следования сообщений, вызванных аппаратными событиями, можно представить так:

аппаратное событие -> системная очередь сообщений -> очередь сообщений приложения.

Оконные сообщения начинаются с префикса WM_, сообщения с префиксом ВМ_ поступают от кнопок, сообщения с префиксом ЕМ_ — от текстовых полей, сообщения с префиксом LB_ — от списков. Разработчик может определить в приложении и потом использовать собственные коды сообщений. Все сообщения обрабатываются в главной функции программы в цикле. Извлечение из очереди осуществляет функция GetMessage. TranslateMessage касается сообщений WM_KEYDOWN и WM_KEYUP, которые транслируются в WM_CHAR и WM_DEADCHAR.

28. Основи програмування мовою С++. Оголошення й використання даних.

Простейшая программа на С++ Win api

Оконная процедура — это «функция обратного вызова», предназначенная для обработки сообщений, адресованных любому окну того «оконного класса», в котором содержится ссылка на данную процедуру. функция обратного вызова - вызывает сама операционная система. Поэтому в коде приложения вы не найдете прямого вызова такой функции. Компилятор узнает функцию обратного вызова по спецификатору CALLBACK. В этом определении LRESULT — тип возвращаемого значения , hWnd — дескриптор окна, которому адресовано сообщение, uMsg — код сообщения, wParam и IParam — параметры сообщения. Имя функции может быть произвольным, но для главного окна приложения обычно используется имя WndProc. В теле функции после объявления необходимых локальных переменных обычно размещается оператор switch, внутри которого и происходит обработка нужных сообщений. Каждому коду сообщения в Windows сопоставлен уникальный символический идентификатор. Все системные идентификаторы определены при помощи директивы #define в заголовочном файле winuser.h. Это облегчает чтение и понимание программ. Чаще всего приложение обрабатывает оконные сообщения (window messages), начинающиеся с префикса WM_, например: WM_PAINT, WM_SIZE, WM_M0VE и многие другие. Другие типы сообщений могут поступать от элементов управления, например: сообщения с префиксом ВМ_ поступают от кнопок, сообщения с префиксом ЕМ_ — от текстовых полей, сообщения с префиксом LB_ — от списков.

Непременным компонентом всех Windows-приложений является цикл обработки сообщений. У приложения всегда есть главная функция WinMain. Обычно она содержит вызовы функций для инициализации и создания окон, после чего следует цикл обработки сообщений и необходимый код для закрытия приложения. Что происходит в цикле обработки сообщений? Как известно, все сообщения, адресованные приложению, Windows записывает в очередь сообщений приложения. Извлечение сообщения из этой очереди осуществляет функция GetMessage. Если очередное сообщение имеет код WM_QUIT, то происходит выход из цикла, после чего приложение завершает свою работу. Если очередное сообщение не является сообщением WM_QUIT, то оно передается функции DispatchMessage, которая возвращает сообщение обратно в Windows. Windows отправляет сообщение для его обработки соответствующей оконной процедуре — иными словами, Windows вызывает оконную процедуру. После возврата из оконной процедуры Windows передает управление оператору, который расположен после DispatchMessage, и работа цикла продолжается.

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

MessageBox(NULL, "Простейшая программа!","WinAPI App", 0); //сообщение

return 0;

}

Полноценная программа на С++ Win api

#include <windows.h>

// объявление функций

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

ATOM RegMyWindowClass(HINSTANCE, LPCTSTR);

//////////////////////////////////////////////////////////////////////////

// функция вхождений программы WinMain

int APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

// имя будущего класса

LPCTSTR lpzClass = TEXT("My Window Class!");

// регистрация класса

if (!RegMyWindowClass(hInstance, lpzClass))

return 1;

// вычисление координат центра экрана

RECT screen_rect;

GetWindowRect(GetDesktopWindow(),&screen_rect); // разрешение экрана

int x = screen_rect.right / 2 - 150;

int y = screen_rect.bottom / 2 - 75;

// создание диалогового окна

HWND hWnd = CreateWindow(lpzClass, TEXT("Dialog Window"),

WS_OVERLAPPEDWINDOW | WS_VISIBLE, x, y, 300, 150, NULL, NULL,

hInstance, NULL);

// если окно не создано, описатель будет равен 0

if(!hWnd) return 2;

// цикл сообщений приложения

MSG msg = {0}; // структура сообщения

int iGetOk = 0; // переменная состояния

while ((iGetOk = GetMessage(&msg, NULL, 0, 0 )) != 0) // цикл сообщений

{

if (iGetOk == -1) return 3; // если GetMessage вернул ошибку - выход

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam; // возвращаем код завершения программы

}

//////////////////////////////////////////////////////////////////////////

// функция регистрации класса окон

ATOM RegMyWindowClass(HINSTANCE hInst, LPCTSTR lpzClassName)

{

WNDCLASS wcWindowClass = {0};

// адрес ф-ции обработки сообщений

wcWindowClass.lpfnWndProc = (WNDPROC)WndProc;

// стиль окна

wcWindowClass.style = CS_HREDRAW|CS_VREDRAW;

// дискриптор экземпляра приложения

wcWindowClass.hInstance = hInst;

// название класса

wcWindowClass.lpszClassName = lpzClassName;

// загрузка курсора

wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);

// загрузка цвета окон

wcWindowClass.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;

return RegisterClass(&wcWindowClass); // регистрация класса

}

//////////////////////////////////////////////////////////////////////////

// функция обработки сообщений

LRESULT CALLBACK WndProc(

HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

// выборка и обработка сообщений

switch (message)

{

case WM_LBUTTONUP:

// реакция на сообщение

MessageBox(hWnd, TEXT("Вы кликнули!"), TEXT("событие"), 0);

break;

case WM_DESTROY:

PostQuitMessage(0); // реакция на сообщение

break;

default:

// все сообщения не обработанные Вами обработает сама Windows

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

Все типы данных в Windows определены посредством директив #define или #typedef в заголовочных файлах Win32.

В табл. 1.1 приведены некоторые наиболее часто встречающиеся типы данных Windows.

про

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]