- •Оглавление
- •1. Интерфейс графического устройства gdi. Обработка сообщений wm_paint.
- •2. Обмін інформацією між процесами та потоками. Обмін даними за допомогою файлів.
- •3.Створити програму у Windows (Win32 api), яка виводе одне (головне) вікно.
- •4. Обмін інформацією між процесами та потоками. Обмін повідомленнями.
- •5. Створити програму у Windows (Win32 api), яка демонструє основні стилі вікон (вікно верхнього рівня, спливаюче вікно з головним вікном та без нього, дочірнє вікно).
- •6. Процеси та потоки. Створення процесу. Створення потоку
- •7. Створити програму у Windows (Win32 api), яка забезпечує при отриманні повідомлення wm_paint вивід текстових строк у вікно.
- •8) Створити програму у Windows (Win32 api), яка забезпечує при отриманні повідомлення wm_paint вивід різноманітних типів ліній у вікно.
- •9. Робота з файлами. Асинхронні операції з файлами.
- •10. Створити простішу програму у Windows (Win32 api), яка забезпечує при отриманні повідомлення wm_paint вивід простих геометричних фігур у вікно.
- •11. Створити програму у Windows (Win32 api), яка забезпечує обробку повідомлень wm_paint, wm_destroy, wm_create, wm_command. Другі повідомлення передати на обробку стандартній функції вікна.
- •№ 12 Стандартні елементи керування. Графічний список. Індикатор прогресу. Складальний лічильник.
- •13. Створити простішу програму у Windows (Win32 api), яка забезпечує обробку повідомлень миші (wm_lbuttondown, wm_rbuttondown) у вікні.
- •15. Базові команди. Класифікація команд. Команди передачі даних. Команди обміну процесора з пам'яттю. Команди передачі кодів між процесором і периферією.
- •16. Команди обробки даних. Базові арифметичні команди.
- •17. Створити програму у Windows (Win32 api), яка забезпечує обробку повідомлень клавіатури (wm_keyup, wm_keydown) у вікні.
- •18. ВікнаWindows.Процедура створенняд очірнього вікна. Повідомлення wm_create.
- •19. Створити програму у Windows (Win32 api), яка забезпечує роботу з таймером.
- •20.Таймери Windows і служба часу.
- •24. Інтерфейс графічних пристроїв gdi. Обробка повідомлень wm_paint.
- •26. Створити простішу програму у Windows (Win32 api), яка забезпечує роботу з стандартним елементом керування - графічний список.
- •27. Основи розробки Windows-додатків. Головна функція WinMain(). Повідомлення Windows.
- •29 Створити програму у Windows (Win32 api), яка забезпечує роботу з стандартним елементом керування - набірний лічильник.
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.
про
