2. Структура винпрогр (Ответы на вопросы билетов)
Описание файла
Файл "2. Структура винпрогр " внутри архива находится в следующих папках: Ответы на вопросы билетов, WinAPI - Ответы на вопросы билетов. PDF-файл из архива "Ответы на вопросы билетов", который расположен в категории "". Всё это находится в предмете "api windows" из 6 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "к экзамену/зачёту", в предмете "api windows" в общих файлах.
Просмотр PDF-файла онлайн
Текст из PDF
1. Структура WINDOWS – программы.Любая программа начинается с текста:#include <windows.h>#include <stdlib.h>const char szClassName[] = "Имя класса окна";const char szWindowName[] = "Заголовок окна";// Прототип функции обработки сообщений главного окна приложенияLRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);#pragma argsused // Не будет предупреждения, что функция не пользуется своими параметрамиint PASCAL WinMain// компилиция в стиле Паскаль (с очисткой стека отпараметров функции) – ускоряет время работы(HINSTANCE hInstance,// идентификатор приложенияHINSTANCE hPrevInstance, // идентификатор предыдущей копии приложенияLPSTR lpszCmdLine,// адрес командной строкиint nCmdShow)// будет ли видимым или невидимым{тело функции}Функция WinMain – обязательна, получает управление при запуске приложения, возвращает значениетипа int, что позволяет передать операционной системе Windows или отладчику код завершенияприложения. {Устанавливает расположение стека, выполняет все необходимые инициализирующиефункции}Структура программы в Windows:Асинхр.
– формируется самому себеили другому приложению, минуясистемную очередьСинхр – через системную очередь, вочередь приложения.GetMessage выбирает сообщения изочереди приложения и осуществляетзаполнение структуры MSG – длявременного хранения информации осообщении.TranslateMessage – занимаетсяобработкой клавишных команд.DispatchMessage – определяет,какому окну данного приложениянаправить сообщение. Предусмотренапередача управления в Windows.Затем Windows берет обработчик,дополняет необходимым кодом(“Prolog”), чтобы функциясоответствовала ОС.
В этот моментWindows может перехватить управление.В WM_QUIT проверяется, не окончание ли это работы. Да – выход, нет – идем дальше.WM_DESTROY – сообщение, в случае закрытия окна. При его выводе из очереди приложения запускаетсяфункция, которая генерирует сообщение WM_QUIT и только после этого закрывается окно: для того, чтобызакрывалось не только окно, но и все приложение + сохранить изменения и т.п.Функция WndProc НЕ ВЫЗЫВАЕТСЯ ни из одной функции приложения.
Эту функцию вызываетWindows в процессе обработки сообщений. Для этого адрес функции WndProc указывается прирегистрации класса окна. Функция выполняет обработку сообщений главного окна приложения.Пример простейшего Windows-приложения.// 1а. Подключение необходимых библиотек#include <windows.h>#include <stdlib.h>// 1б. Объявление необходимых переменныхconst char szClassName[] = "WinLab_01"; // Имя класса окнаconst char szWindowName[] = "Term II. Windows Lab 01."; // Заголовок окна// 1б. Объявление прототипа функции обработки сообщенийLRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);// 2. Главная функция Windows-приложения – функция WinMain#pragma argsusedint PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){// 2а. Объявление идентификатора окнаHWND hWnd;// 2б.
Описание класса окнаWNDCLASS wndclass;wndclass.style= CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc= WndProc;wndclass.hInstance= hInstance;wndclass.hIcon= LoadIcon(hInstance, IDI_APPLICATION);wndclass.hCursor= LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground= 5;wndclass.lpszMenuName= NULL;wndclass.lpszClassName= szClassName;// 2в. Регистрируем класс окнаif (!RegisterClass(&wndclass)) exit(FALSE);// 2г. Создаем окно функцией CreateWindow и проверяем успешность созданияhWnd=CreateWindow(szClassName,szWindowName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd) exit(FALSE);// 2д.
Показываем окноShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);// 2е. Цикл сообщенийMSG msg;while(GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}/* 3. Обработчик сообщений */LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){switch (iMessage){case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, iMessage, wParam, lParam); }return 0;}.