Win32 API учебник
Начало работы с API Win32
WinAPI (также известный как Win32, официально называемый Microsoft Windows API) — это интерфейс прикладного программирования, написанный на C Microsoft, чтобы разрешить доступ к функциям Windows. Основными компонентами WinAPI являются:
- WinBase: функции ядра, CreateFile, CreateProcess и т. Д.
- WinUser: функции GUI, CreateWindow, RegisterClass и т. Д.
- WinGDI: графические функции, Ellipse, SelectObject и т. Д.
- Общие элементы управления: стандартные элементы управления, списки, ползунки и т. Д.
- Индекс API Windows на MSDN.
Версии
Версии API привязаны к версии операционной системы. Документация MSDN указывает минимальную поддерживаемую операционную систему для каждой функции API.
Привет, мир
Приложения Microsoft Windows обычно записываются как консольное приложение или оконное приложение (существуют другие типы, такие как службы и плагины). Разница для программиста — разница в интерфейсе для основной точки входа для источника приложения, предоставляемого программистом.
Уроки WinApi C++ | Работа с окнами виндовс | HWND на примерах
Когда запускается приложение C или C ++, исполняемая точка входа, используемая исполняемым загрузчиком, представляет собой время выполнения, предоставляемое компилятором. Исполняемый загрузчик читает в исполняемом файле, выполняет любое исправление необходимого изображения и затем вызывает исполняемую точку входа, которая для C или C ++ — это время выполнения, предоставляемое компилятором.
Исходная точка входа, вызываемая загрузчиком, не является основной точкой входа, предоставляемой программным программистом, но вместо этого выполняется время выполнения, предоставляемое компилятором и компоновщиком, который создает исполняемый файл. Runtime устанавливает среду для приложения, а затем вызывает основную точку входа, предоставленную программистом.
Консольное приложение Windows может иметь несколько несколько разных интерфейсов для основной точки входа, предоставляемой программистом. Разница между ними заключается в том, является ли главная точка входа традиционной int main (int argc, char *argv[]) или если это конкретная версия int _tmain(int argc, _TCHAR* argv[]) которая обеспечивает широкий символов в параметрах приложения. Если вы создаете консольный прикладной проект Windows Win32 с использованием Visual Studio, созданный источник будет версией Windows.
Приложение Windows (GUI) имеет другой интерфейс для основной точки входа, предоставляемой программистом. Эта основная точка входа, предоставляемая программистом, имеет более сложный интерфейс, поскольку среда выполнения создает среду GUI и предоставляет дополнительную информацию вместе с параметрами приложения.
В этом примере объясняется интерфейс основной точки входа Windows (GUI). Чтобы изучить эти темы, вы должны:
- IDE с компилятором (желательно Visual Studio)
- Знание
Создайте пустой проект Win32 (графический интерфейс, а не консоль), используя IDE. Параметры проекта должны быть установлены для оконного приложения (а не консольного приложения), чтобы компоновщик связывался с правильным временем выполнения. Создайте файл main.c добавив его в проект, а затем введите следующий код:
ОКОННОЕ ПРИЛОЖЕНИЕ С НУЛЯ — ПОЛНЫЙ БАЗОВЫЙ КУРС C++ WINAPI
#include int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
Это наша программа Win32 «Hello, world». Первым шагом будет включение файлов заголовков Windows. Главным заголовком для всех окон является windows.h , но есть и другие.
WinMain отличается от стандартного int main() используемого с консольным приложением. В интерфейсе больше параметров, и, что более важно, главная точка входа для оконного приложения использует соглашение о вызове, отличное от стандартного C / C ++.
Спецификатор APIENTRY указывает соглашение о вызове, которое является порядком, в котором аргументы помещаются в стек † . По умолчанию соглашение о вызове является стандартным соглашением C, обозначенным __cdecl . Однако Microsoft использует другой тип соглашения о вызове, соглашение PASCAL, для функций Windows API, которое обозначается квалификатором __stdcall . APIENTRY — это определенное имя для __stdcall в одном из файлов заголовков, включенных windows.h (см. Также « Что такое __stdcall?» ).
Следующие аргументы WinMain заключаются в следующем:
- hInst: дескриптор экземпляра
- hInstPrev: предыдущий дескриптор экземпляра. Больше не используется.
- cmdline: аргументы командной строки (см. аргументы Pass WinMain (или wWinMain) для обычного основного )
- cmdshow: указывает, должно ли отображаться окно.
Мы пока не используем ни один из этих аргументов.
Внутри WinMain() — вызов MessageBox() , который отображает простой диалог с сообщением, поле сообщения. Первый аргумент — это дескриптор окна владельца. Поскольку у нас еще нет собственного окна, пропустите NULL . Второй аргумент — основной текст. Третий аргумент — это заголовок, а четвертый аргумент содержит флаги. Когда 0 передано, отображается окно сообщения по умолчанию.
Диаграмма ниже раскрывает диалоговое окно окна сообщения.
- Учебник на winprog.org
- Документация функций MessageBox в MSDN
† Только для 32-битных систем. Другие архитектуры имеют разные соглашения о вызовах.
Источник: learntutorials.net
WinAPI C для начинающих
C WinAPI — это основной набор программных интерфейсов (API) Microsoft, доступных в операционных системах Microsoft Windows. Ранняя версия носила название Win32 API.
Введение
C WinAPI — это интерфейс прикладного программирования, который используется для создания приложений Windows. Для начала работы начинающий пользователь должен загрузить SDK Windows, ранее известный как Platform SDK.
SDK (Software Development Kit) содержит файлы заголовков, библиотеки, образцы, документацию и инструменты, которые используются для разработки приложений. API Windows создан для языков программирования C и C ++. Это самый прямой способ создания приложений в операционной системе от компании.
C WinAPI можно разделить на несколько областей:
- базовые услуги;
- безопасность;
- графика;
- пользовательский интерфейс;
- мультимедиа;
- оболочка Windows;
- сетевые службы.
Базовые службы обеспечивают доступ к основным ресурсам. К ним относятся функции C WinAPI, файловые системы, устройства, процессы, потоки, реестр и обработка ошибок. Область безопасности предоставляет интерфейсы, объекты и другие элементы программирования для аутентификации, авторизации, криптографии и других связанных с безопасностью задач. Подсистема графики обеспечивает функциональность вывода графического содержимого на мониторы, принтеры и другие устройства вывода. Пользовательский интерфейс обеспечивает функциональность для создания окон и элементов управления.
Компонент мультимедиа предоставляет инструменты для работы с видео, звуковыми и входными устройствами. Функции интерфейса оболочки позволяют приложениям получать доступ к функциям, предоставляемым оболочкой операционной системы. Сетевые службы предоставляют доступ к сетевым возможностям ОС Windows.
Компоненты
При создании WinAPI C следует учитывать базовые возможности, предоставляемые Windows API, которые можно упорядочить в семи категориях. Рассмотрим каждую из них подробнее.
Основные услуги предоставляют доступ к базовым системным ресурсам, доступным в Windows. Примеры: файловая система, периферийные устройства, процессы, доступ к системному реестру и система управления исключениями. Эти функции хранятся в файлах kernel.exe, krnl286.exe или krnl386.exe для 16-разрядных систем и kernel32.dll и advapi32.dll для 32-разрядных систем.
Графический интерфейс обеспечивает доступ к ресурсам для отображения на мониторах, принтерах и другом периферийном оборудовании. Хранится в файле gdi.exe на 16-разрядных системах и gdi32.dll в 32-разрядных системах.
Пользовательский интерфейс отвечает за просмотр и управление основными элементами, такими как кнопки и полосы прокрутки, получение информации о клавиатуре и мыши, а также связанные с ними функции. Эти функции хранятся в файле user.exe в 16-разрядных системах и user32.dll comctl32.dll в 32-разрядных системах. Начиная с версии XP элементы управления были сгруппированы в comctl32.dll.
Общие диалоги — отображают данные для открытия и сохранения файлов, выбора цвета и шрифта. Находятся в файле comdlg.dll на 16-разрядных системах и comdlg32.dll в 32-разрядных системах.
Windows Shell — компонент WinAPI, который позволяет приложениям получать доступ к функциям, предоставляемым оболочкой операционной системы.
Сетевые службы обеспечивает доступ к различным сетевым возможностям операционной системы. Его подкомпоненты включают NetBIOS, Winsock, RPC. В старых версиях — NetDDE.
Версии
Win16, Win32 и Win32s являются стандартными наборами компонентов, которые позволяют прикладному программному обеспечению использовать функции различных операционных систем семейства Windows.
Win32, преемник Win16, был представлен в 1993 году в 32-разрядных продуктах семейства Windows, таких как Windows NT, 2000, 95. Этот программный интерфейс реализован тремя программными библиотеками: Kernel32.dll, User32.dll и GDI32.dll2. Те же функции Win32 доступны во всех продуктах Windows, и, в зависимости от продукта, использование определенных функций может привести к ошибке обслуживания.
Возможности Win32 включают в себя взаимодействие между программами, управление процессами, компьютерными сетями, файлами, принтерами, серверами и коммуникационными портами.
Спецификация
C WinAPI — это абстрактная спецификация интерфейса программирования для операционной системы Windows. Состоит из объявлений функций, объединений, структур, типов данных, макросов, констант и других элементов программирования. WinAPI описывается главным образом MSDN (Microsoft Developer Network) и находится в заголовках Windows C. Официальная реализация функций WinAPI находится в динамических библиотеках (DLL): например, kernel32.dll, user32.dll, gdi32.dll или shell32.dll в системном каталоге. Существуют сторонние реализации Windows API: в первую очередь проект Wine и проект ReactOS.
Windows API — динамический объект. Количество функций постоянно растет с каждой новой версией ОС и новыми пакетами обновлений. Существуют также важные различия между версиями сервера и настольными версиями операционной системы. Некоторые функции официально не документированы.
Pelles C
Pelles C — бесплатная программа и лучший компилятор C и интегрированная среда разработки (IDE) для языка программирования C. Поддерживает 32-разрядную Windows (x86) и 64-разрядную Windows (x64). Реализует как стандарты C99, так и C11. Pelles C имеет встроенный редактор ресурсов, растровое изображение, значок и редактор курсоров и редактор шестнадцатеричных дампов.
Он разработан шведским разработчиком Пелле Ориниусом. Название компилятора носит имя своего автора. Поставляется с SDK, поэтому программист сразу может приступить к созданию приложений без дальнейшей установки.
Ошибка целевой архитектуры
Чтобы создавать программы Windows API, необходимо включить расширения Microsoft. По умолчанию они выключены, в связи с чем компилятор выдает следующее сообщение об ошибке, которое служит примером C WinAPI с нарушенной структурой: fatal error #1014: #error: «No target architecture» («Нет целевой архитектуры»). Чтобы включить расширения Microsoft, переходим к параметрам проекта и выбираем вкладку «Компилятор». На этой вкладке активируем флажок «Включить расширения Microsoft».
MSDN
MSDN (Microsoft Developer Network) является центральным порталом для разработки Windows. Это огромная коллекция материалов, связанных с разработкой приложений с использованием инструментов Microsoft. Это самая полная база наряду с документацией по разработке настольных приложений и список API Windows.
Применение DLL в WinAPI C
Библиотека общих элементов управления обеспечивает доступ к расширенным функциям операционной системы, таким как строки состояния, индикаторы выполнения, панели инструментов и вкладки. Эти команды находятся в библиотеке commctrl.dll в 16-разрядных системах и comctl32.dll и сгруппированы с пользовательским интерфейсом.
DLL — это формат файла динамической библиотеки ссылок, используемый для хранения нескольких кодов и процедур для программ Windows. Файлы DLL были созданы таким образом, что несколько программ могли использовать их информацию одновременно, помогая сохранить память. Позволяет пользователю редактировать кодирование сразу нескольких приложений без их изменения. Библиотеки DLL можно преобразовать в статические, используя MSIL Disassembler или DLL для Lib 3.00.
WinAPI C для начинающих
WinAPI как интерфейс прикладного программирования для Windows предлагает множество мощных функций, которые позволяют создавать свои программы, начиная с простой обработки файлов и заканчивая построением графического интерфейса для программирования низкоуровневых драйверов устройств.
Прежде чем начать программирование в WinAPI, необходимо настроить среду для кода в ОС Windows. Поскольку это не дистрибутив Linux, у него нет встроенного компилятора для создания приложений. Рассмотрим следующие варианты для компиляции кода:
- MinGW/Cygwin — стороннее приложение C WinAPI, которые обеспечивает подходящую среду программирования на платформе Windows. Данный компилятор идеален для начинающего пользователя благодаря простоте и удобству организации среды. При работе с этим решением потребуется текстовый редактор, так как он не предусмотрен графическим интерфейсом приложения.
- Сторонние IDE, или интегрированные среды разработки, — это приложения, которые создают среду GUI для разработчиков. Они поставляются в комплекте с соответствующими инструментами, такими как MinGW, для создания программ Windows.
- Microsoft Visual Studio (MSVS) представляет собой разработанную Microsoft IDE в комплекте со своим собственным компилятором, предоставляющим множество функций и возможностей при создании собственных приложений Windows, включая графический интерфейс, информацию о версии приложения, значки и другие ресурсы. Оптимален при исследованиях разработки вредоносных программ.
Для Windows доступен комплект разработчика, который предоставляет документацию и инструменты, позволяющие разработчикам создавать программное обеспечение с использованием API и связанных с ним технологий.
Источник: fb.ru
Введение в Win32 API
Win32 API (далее WinAPI) – это набор функций (API – Application Programming Interface), работающих под управлением ОС Windows. Они содержатся в библиотеке windows.h .
С помощью WinAPI можно создавать различные оконные процедуры, диалоговые окна, программы и даже игры. Эта, скажем так, библиотека является базовой в освоении программирования Windows Forms, MFC, потому что эти интерфейсы являются надстройками этой библиотеки. Освоив её, Вы без труда будете создавать формы, и понимать, как это происходит.
Не будем внедряться в теорию. Начнём с того, как создать этот проект в MVS, а в конце статьи будет разобран простой пример.
Итак. Сначала открываем Visual Studio, затем, нажимаем на вкладку «Файл», далее «Создать проект»:
Затем, в раскрывающемся списке Visual C++ выбираем пункт Win32, там и будет «Проект Win32». Щелкаем по нему: Вводим название проекта, указываем путь и нажимаем «ОК». Далее будет написано: «Добро пожаловать в мастер приложения Win32». Нажимаем далее. По-умолчанию у надписи «Пустой проект» галочка отсутствует. Нам нужно её поставить и убедиться, что у нас «Тип Приложения» — Приложение Windows.
Если всё верно, нажимаем – «Готово».
У нас должен быть пустой проект такого вида:
Ну а теперь начнём писать простую программу, которая традиционно будет выводить на экран надпись: «Привет, Мир. ».
Естественно, к проекту нужно добавить файл типа «имя».cpp. Кликаем по «Файлы исходного кода» правой кнопкой мыши, в раскрывающемся списке выбираем вкладку – «Добавить», далее «Создать элемент…». В результате у нас должно появиться такое окно:
Выбираем «Файл С++», вводим имя, нажимаем «Добавить». Затем открываем этот файл и вставляем в него такой код (подробности далее):
#include // заголовочный файл, содержащий функции API // Основная функция — аналог int main() в консольном приложении: int WINAPI WinMain(HINSTANCE hInstance, // дескриптор экземпляра приложения HINSTANCE hPrevInstance, // в Win32 не используется LPSTR lpCmdLine, // нужен для запуска окна в режиме командной строки int nCmdShow) // режим отображения окна < // Функция вывода окна с кнопкой «ОК» на экран (о параметрах позже) MessageBox(NULL, L»Привет, мир. «, L»Оконная процедура», MB_OK); return NULL; // возвращаем значение функции >
Результат должен быть таким:
Теперь остановимся поподробнее на коде программы.
В первой строке мы подключаем заголовочный файл windows.h . В нём содержатся все необходимые «апишные» функции. Здесь всё понятно.
В 4-7 строках у нас описание функции int WINAPI WinMain() .
Квалификатор WINAPI, нужен для функции WinMain всегда. Просто запомните это. WinMain – название функции. Она имеет четыре параметра. Первый из них – HINSTANCE hInstance (строка 4). hInstance является дескриптором экземпляра окна (это некий код оконной процедуры, идентификатор, по которой ОС будет отличать её от остальных окон).
Через него можно обращаться к окну в процессе работы в других функциях (об этом позже), что-либо менять в параметрах окна. HINSTANCE является одним из многочисленных типов данных определенных в WinAPI, таким же как int, например. А запись HINSTANCE hInstance говорит нам о том, что мы создаём новую переменную типа HINSTANCE с названием hInstance.
О типах данным мы поговорим позже, поэтому переходим к следующему параметру: HINSTANCE hPrevInstance (строка 5). Как написано в комментариях, в Win32 он не используется, так как он создан для 3.x разрядной системы, из предыдущего понятно, что это дескриптор экземпляра окна. Далее у нас переменная типа LPSTR (строка 6) с именем lpCmdLine . Она используется в том случае, если мы запускаем окно через командную строку с прописью параметров. Очень экзотический способ, поэтому мы не будем на нём задерживаться.
И последний параметр: целочисленный, определяет способ показа окна. Нужен для функции ShowWindow , которая будет описана позже. Например, с помощью него мы можем развернуть окно на весь экран, сделать его определённой высоты, прозрачным или поверх остальных.
Переходим к функции MessageBox() (строка 10). Она имеет четыре параметра и нужна для вывода сообщений о ошибках, например. В данном случае мы использовали её для вывода сообщения. В общем виде описание функции выглядит следующим образом:
int MessageBox(HWND hWnd, // дескриптор родительского окна LPCTSTR lpText, // указатель на строку с сообщением LPCTSTR lpCaption, // указатель на строку с текстом заголовка UINT uType);// флаги для отображения кнопок, стиля пиктограммы и прочее
В нашем случае, первому параметру присвоен ноль. Всё потому, что у нас нет родительских окон (оно не запущено какой-нибудь программой).
Далее у нас идут две переменные типа LPCTSTR : lpText и lpCaption . Первая сообщает информацию, которая будет выведена в окне в текстовом виде. Вторая сообщает, что будет написано в тексте заголовка к окну. Это аналог char *str , но всё же нет. Для того, чтобы текст выводился корректно, нужно перед строкой поставить букву L (UNICODE строка).
Ну и последний тип данных – UINT – 32-х битное целое без знака. То есть аналог unsigned int . Этому параметру можно передавать некоторые значения (о них тоже позже), за счёт чего можно менять вид кнопки. В нашем случае – это MB_OK — означает, что окно создаёт кнопку с надписью «ОК» и соответствующим действием при её нажатии (закрытием приложения).
В строке 11 мы возвращаем значение функции, так как она имеет не тип void .
Таким образом, общее представление о WinAPI теперь есть. Продолжение в следующих разделах.
Источник: cppstudio.com
Программирование под Windows с использованием Win API
Аннотация: В данной лекции вводятся основные термины и понятие, используемые при разработке Windows-приложений. Рассматриваются простейшие примеры создания 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 принято использовать префиксы перед именами переменных, указывающие на принадлежность к типу данных. Рекомендуется давать имена собственным переменным и идентификаторам, придерживаясь следующих принципов:
- мнемоническое значение – идентификатор должен легко запоминаться;
- смысловое значение – роль идентификатора должна быть ясна из его названия;
- преемственность – похожие объекты должны иметь похожие идентификаторы;
- быстрота принятия решения – придумывание, ввод и редактирование идентификатора не должны занимать много времени.
Некоторые префиксы венгерской нотации:
A | массив |
B | логический тип (int) |
By | беззнаковый символьный тип (byte) |
C | символьный тип (1 байт) |
Cb | счетчик байтов |
Cr | цвет |
cx,cy | короткий тип (short) |
Dbl | double (с плавающей точкой) |
Dw | беззнаковое длинное целое число (dword) |
Flt | float (вещественная с плавающей точкой) |
Fn | функция |
g_ | префикс для глобальной переменной (глобальная переменная) |
H | handle (беззнаковое целое число) |
hDC | handle (указатель на контекст устройства) |
I | целое (integer) |
Id | интегральное значение идентификатора |
L | длинный тип (long) |
Lp | длинный указатель |
Lpsz | дальний указатель на строку, заканчивающуюся нулевым байтом |
m_ | переменная класса |
N | short или int |
Np | ближний указатель |
P | указатель |
Pfn | указатель на функцию |
Pst | указатель на структуру |
Psz | указатель на строку, заканчивающуюся нулевым байтом |
Pv | указатель на тип void |
S | строка |
Sz | строка, заканчивающая нуль-символом |
U | беззнаковый символ |
Tm | текстовая метрика |
V | тип void |
W | беззнаковое целое (word, 16-бит) |
x, y | короткое целое число (координата x или y) |
Часто используемые типы данных Windows:
HANDLE | определяет идентификатор; 32-разрядное целое, используемое в качестве дескриптора – числа, определяющего некоторый ресурс |
HWND | определяет идентификатор окна |
HDC | определяет идентификатор контекста устройства |
LONG | 32-битовое целое со знаком |
LPSTR | определяет линейный указатель |
NULL | |
UINT | тип данных Win32 (32 бита для Win32) |
WCHAR | 16-битовый символ UNICODE. Используется для представления символов языков мира |
Создание простейшего 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 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.style = CS_HREDRAW | CS_VREDRAW; w.lpfnWndProc = WndProc; w.hInstance = hInstance; w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); w.lpszClassName = «My Class»; RegisterClass( hwnd = CreateWindow(«My Class», «Окно пользователя», WS_OVERLAPPEDWINDOW,500, 300, 500, 380, NULL, NULL, hInstance, NULL); ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); while(GetMessage( TranslateMessage( DispatchMessage( >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 ).
Источник: intuit.ru
Знакомство с WinAPI
Наша первая программа для Windows будет создавать окно с надписью «Hello, mustdie!».
Вопреки традиционному подходу «сначала теория, потом практика», я буду рассказывать все и сразу на примерах.
Итак, вот наша первая программа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
#include #include «mmsystem.h» LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) const wchar_t szAppName[] = L»Hello, Mustdie»; HWND hwnd; MSG msg; WNDCLASSEX wndclass; wndclass.cbSize = sizeof (wndclass); wndclass.style = CS_HREDRAW return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) HDC hdc; PAINTSTRUCT ps; RECT rect; switch(iMsg) { case WM_CREATE : //раскомментировать, если нужно будет воспроизвести звук //PlaySound («forthelinux.wav», NULL, SND_FILENAME return DefWindowProc (hwnd, iMsg, wParam, lParam); }
Итак, нам предстоит докопаться до сокрытого в этих восьмидесяти строчках кода смысла.
В любой Windows-программе имеется как минимум две функции: WinMain и WndProc. WinMain — это аналог стандартной функции main языка С. WndProc — это «оконная процедура» для окна HELLOWIN. Не пугаемся страшных терминов, которые все равно нам придется запомнить. Оконная процедура — это способ инкапсулирования кода, отвечающего за ввод/вывод информации. Вот тут я сделаю небольшое отступление.
Дело в том, что с этого момента вам придется уяснить, что ОС непрерывно общается с вашей программой, отправляя ей сообщения. Эти сообщения ваша программа должна уметь обрабатывать и обработка этих сообщений осуществляется в функции WndProc. Как конкретно это делается разберемся позже, а сейчас, если вы вдумчиво посмотрите в код программы, то увидите, что в нём отсутствуют инструкции для вызова WndProc. WndProc вызывает сама Windows. Однако, в WinMain имеется ссылка на WndProc, поэтому эта функция описывается в самом начале программы, еще до определения WinMain.
Ну а теперь, как бы печально это ни звучало, настало время зубрёжки.
В программе вызываются не менее 17 функций Windows. Здесь я перечислю их в порядке появления в программе с кратким описанием.
LoadIcon — загружает значок для использования в программе.
LoadCursor — загружает курсор мыши для использования в программе.
GetStockObject — получает графический объект (в этом случае для закрашивания окна используется кисть)
RegisterClassEx — регистрирует класс окна.
CreateWindow — создает окно на основе класса окна.
ShowWindow — выводит окно на экран.
UpdateWindow — заставляет окно перерисовать свое содержимое.
GetMessage — получает сообщения из очереди сообщений.
TranslateMessage — преобразует некоторые сообщения, полученные с помощью клавиатуры.
DispatchMessage — отправляет сообщение оконной процедуре.
PlaySound — воспроизводит звуковой файл.
BeginPaint — инициализирует процесс рисования окна.
GetClientRect — получает размер рабочей области окна.
DrawText — выводит на экран строку текста.
EndPaint — прекращает рисование окна.
PostQuitMessage — вставляет сообщение о завершении программы в очередь сообщений.
DefWindowProc — выполняет обработку сообщений по умолчанию.
С функциями закончили. Приступим к идентификаторам.
У каждого идентификатора есть префикс, обозначающий категорию, к которой он принадлежит.
CS — опция стиля класса.
IDI — идентификационный номер иконки.
IDC — идентификационный номер курсора.
WS — стиль окна.
CW — опция создания окна.
WM — сообщение окна.
SND — опция звука.
DT — опция рисования текста.
Так же, в данной программе использовано четыре типа данных. Немного позже я подробнее расскажу о них, а пока что нужно примерно знать что они за собой скрывают.
MSG — структура сообщения.
WNDCLASSEX — структура класса окна.
PAINTSTRUCT — структура рисования.
RECT — структура прямоугольника.
Первые две структуры данных используются WinMain для определения двух структур, названных msg и wndclass. Две вторые используются WndProc для определения структур ps и rect.
Наконец, в программе имеются еще три идентификатора, которые предназначены для различных типов описателей (handles):
HINSTANCE — описатель экземпляра (instance) самой программы.
HWND — описатель окна.
HDC — описатель контекста устройства (об этом позже).
Немного отвлечемся. Любой хороший программист должен заботиться о том, чтобы его код могли прочитать другие. Будем соблюдать правила хорошего тона и обратимся к Венгерской нотации. Венгерская нотация помогает избежать ошибок в программе еще до ее компоновки.
Поскольку имя переменной описывает и тип её данных, то намного снижается вероятность ошибки с несовпадением типов данных. Все, что нужно сделать — это приписать в имени переменной префикс, соответствующий её типу. Вот краткий список префиксов переменных:
с — символ
by — BYTE (беззнаковый символ)
n — короткое целое
i -целое
x, y — целые числа, используемые в качестве координат
cx, cy — целые числа, используемые в качестве длины. c означает «cout» — счёт.
b — BOOL (булево целое).
f — флаг.
w — WORD — беззнаковое короткое целое.
l — длинное целое.
dw — DWORD — беззнаковое длинное целое.
fn — функция.
s — строка.
sz — строка, завершаемая нулём.
h — описатель (handle).
p — указатель (pointer).
Ну вот и все, с зубрёжкой можно покончить.
Начнем разбираться построчно.
Заголовочный файл windows.h включает много других заголовочных файлов, содержащих объявления функций windows, структур, типов данных и числовых констант.
Ниже следует объявление WndProc:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
Это объявление в начале программы необходимо, потому что в тексте WinMain имеются ссылки на WndProc. Саму функцию мы рассмотрим немного позже.
В отличие от традиционной точки входа main в языке С, в программировании для Windows точкой входа является функция WinMain. WinMain всегда определяется следующим образом:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
Рассмотрим её параметры.
Параметр hInstance называется описателем экземпляра (instance handle). Это уникальное число, идентифицирующее вашу программу, когда она работает под WIndows. У каждого запущенного экземпляра программы уникальный описатель, что позволяет им не конфликтовать.
gПараметр hPrevInstance — описатель предыдущего экземпляра (previous instance) — в настоящее время устарел и остался для совместимости.
szCmdLine — это указатель на строку, в которой содержатся любые параметры, переданные из командной строки.
iCmdShow — число, показывающее, каким должно быть выведено окно на экран (например, свёрнутым).
Разберем подробнее регистрацию класса окна.
Окно всегда создается на основе класса окна. Класс окна идентифицирует оконную процедуру, которая выполняет процесс обработки сообщений, поступающих окну. На основе одного класса окна можно создать несколько окон, достаточно только определить некоторые дополнительные характеристики.
Итак, чтобы создать окно для программы необходимо сначала зарегистрировать для него класс окна. Делается это при помощи функции RegisterClassEx, у которой имеется всего один параметр: указатель на структуру типа WNDCLASSEX, которая определяется в заголовочных файлах Windows следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
typedef struct tagWNDCLASSEX { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; HICON hIconSm; } WNDCLASSEX;
По названиям переменных не сложно догадаться за что они отвечают.
Особое внимание хотелось бы уделить следующим двум инструкциям:
wndclass.cbClsExtra = 0;
Источник: www.cyberforum.ru