Программирование под Windows с использованием Win API
Основные понятия и термины, используемые при разработке Windows приложений
Ядро Windows:
- USER (16, 32) .dll – функции ввода с клавиатуры мыши, ввод через интерфейс и т.д. (взаимодействие приложений с пользователями и средой Windows).
- KERNEL (16, 32) .dll – функции операционной системы (память, распределение системных ресурсов, загрузка).
- GDI (16, 32) .dll – графический интерфейс (функции создания и отображения графических объектов).
GUI (Graphics User Interface) – стандартный графический интерфейс пользователя. Это та часть Windows, которая обеспечивает поддержку аппаратно-независимой графики.
API (Application Program Interface) — интерфейс прикладных программ (набор функций, сосредоточенных в ядре Windows и дополнительных библиотеках).
DLL (Dynamic Link Libraries) — библиотека динамической компоновки. Функции API содержатся в библиотеках динамической загрузки.
DDE – динамический обмен данными.
Нотация Windows ("венгерская нотация Чарльза Симони")
При программировании под Windows принято использовать префиксы перед именами переменных, указывающие на принадлежность к типу данных. Рекомендуется давать имена собственным переменным и идентификаторам, придерживаясь следующих принципов:
- мнемоническое значение – идентификатор должен легко запоминаться;
- смысловое значение – роль идентификатора должна быть ясна из его названия;
- преемственность – похожие объекты должны иметь похожие идентификаторы;
- быстрота принятия решения – придумывание, ввод и редактирование идентификатора не должны занимать много времени.
Некоторые префиксы венгерской нотации:
Часто используемые типы данных Windows:
Создание простейшего Windows-приложения с использованием Win API
Элементы Windows-приложения
Построение приложения Windows включает выполнение следующих этапов:
- Создание WinMain(...) и связанных с ней функций на языке C или C++.
- Создание описаний меню и всех дополнительных ресурсов, помещение описаний в файл описания ресурсов.
- Создание уникальных курсоров, пиктограмм и битовых образов.
- Создание диалоговых окон.
- Создание файла проекта.
- Компиляция и компоновка всего кода.
Простейшая программа. Создание и вывод Windows-окна на экран
Создадим пустой проект Windows- приложения с помощью мастера:
- File New Project.
- Project types: Win32 Templates: Win32 Project.
- Ok.
- Установить галочку Empty project.
- Добавить в проект файл *.cpp.
- Project Properties. Вкладка Configuration Properties General.
- Значение поля Character Set устанавливаем Use Multi-Byte Character Set.
Добавим следующий код:
#include <windows.h> LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASS w; memset(&w,0,sizeof(WNDCLASS)); w.style = CS_HREDRAW | CS_VREDRAW; w.lpfnWndProc = WndProc; w.hInstance = hInstance; w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); w.lpszClassName = "My Class"; RegisterClass(&w); hwnd = CreateWindow("My Class", "Окно пользователя", WS_OVERLAPPEDWINDOW,500, 300, 500, 380, NULL, NULL, hInstance, NULL); ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam) { switch (Message) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, Message, wparam, lparam); } return 0; }
Скомпилируем и запустим программу. На экране появится Windows-окно.
Комментарии к программе
Все приложения Windows должны содержать два основных элемента: функцию WinMain(...) и функцию окна WndProc.
Функция WinMain(...) служит точкой входа в приложение. Эта функция отвечает за следующие действия:
- регистрацию типа класса окон приложения;
- выполнение всех инициализирующих действий;
- создание и инициализацию цикла сообщений приложения;
- завершение программы (обычно при получении сообщения WM_QUIT ).
Функция WndProc отвечает за обработку сообщений Windows. Эта часть программы является наиболее содержательной с точки зрения выполнения поставленных перед программой задач. Если мы хотим, чтобы программа обращала на наши действия внимание, то необходимо добавить ветки case для оператора switch в оконную процедуру WndProc. Например, если мы хотим, чтобы наше приложение обращало внимание на щелчок левой кнопкой мыши – добавляем ветку case WM_LBUTTONDOWN. В настоящий момент в оконной процедуре происходит только обработка сообщения WM_DESTROY. Больше Windows-окно пока ничего делать не умеет.
Заголовочный файл windows.h нужен для любой традиционной Windows программы на C. Именно в нем содержатся разные определения констант ( WM_DESTROY и т. д.).
Параметры функции WinMain:
- hInstance (тип HINSTANCE ) – является идентификатором текущего экземпляра приложения. Данное число однозначно определяет программу, работающую под управлением Windows.
- hPrevInstance (тип HINSTANCE ) – указывал ранее (Windows 3.1) на предыдущий запущенный экземпляр приложения. В современных версиях Windows он равен NULL.
- lpCmdLine – это указатель на строку, заканчивающуюся нулевым байтом. В этой строке содержатся аргументы командной строки приложения (как правило, содержит NULL ).
- nCmdShow – этот параметр принимает значение одной из системных констант, определяющих способ изображения окна (например, SW_SHOWNORMAL, SW_SHOWMAXIMIZED или SW_SHOWMINIMIZED ).