Введение Windows API (сокр. Win API) Windows Application Programming Interface - наименование набора базовых функций интерфейсов программирования приложений операционных систем семейства Windows. Что же такое интерфейс программирования приложений? API - это набор констант, структур, функций и классов предоставляемых приложением, библиотекой и т.д. для использования во внешних приложениях. Говоря проще, Win API - средство взаимодействия вашей программы с операционной системой. Здесь можно посмотреть список того, что можно сделать используя Win API, так же Microsoft заботливо выпускает SDK - Platform SDK который содержит документацию, набор библиотек и инструментов для работы с Win API. Обыкновенная программа на языке C/C++ начинается со слов: А программа на Win API начинается со слов: Обратите внимание: венгерская нотация - внутренний стандарт Microsoft, поэтому все параметры имеют префиксы соответствующие типу переменной. HINSTANCE hInstance - дескриптор, описатель, грубо говоря указатель (handle) приложения(см ниже) HINSTANCE hPrevInstance - дескриптор предыдущего приложения, вещь оставшаяся в Win API со старых версий винды, скорее всего вам никогда не пригодится. PSTR szCmdLine - указатель на начало командной строки, введенной при запуске программы. int iCmdShow - это значение содержит желаемый вид окна (например, свернутый или развернутый) В остальном WinMain ничем не отличается от простого main - является точкой входа в программу, возвращает 0 если все прошло нормально. В WinAPI очень часто используется понятие handle(дескриптор) - это целое число, вариант указателя который используется Windows для определения различных объектов: окон, файлов, приложений, устройств и прочего. Дескрипторы будут очень часто использоваться поэтому если видите переменную с префиксом h, можете быть уверены это один из многочисленных дескрипторов объектов, воспринимайте их как простые указатели. Hello world Для работы с Win API вам необходимо подключить windows.h, этот файл подключит все необходимое и вы сможете писать ваши собственные приложения, таким образом Hello world будет выглядеть так: Функция MessageBox выведет сообщение, после чего программа будет завершена. MSDN содержит очень хорошие описания всех функций Win API, настоятельно рекомендую пользоваться как основным источником справки (есть и на русском языке, если вы до сих пор не знаете английский), из описания MessageBox на MSDN мы узнаем, что: Функция выводит модальный диалог с сообщением, иконкой и набором управляющих кнопок, возвращает целое число, которое обозначает какую кнопку нажал пользователь. Параметры: HWND hWnd - дескриптор окна-владельца, если такового нет используется NULL LPCTSTR lpText - текст сообщения LPCTSTR lpCaption - заголовок окна UINT uType - набор флагов определяющих набор кнопок и иконок. Типы данных [FONT=Arial, Helvetica, sans-serif]Как и многие API, WinAPI использует свой набор типов данных, который отличается ужасным с виду капсом и зачастую довольно страшными названиями.[/FONT] [FONT=Arial, Helvetica, sans-serif] [/FONT] [FONT=Arial, Helvetica, sans-serif]Например: [/FONT] [FONT=Arial, Helvetica, sans-serif]LPCTSTR - является [/FONT] LPCSTR в свою очередь Оказалась обыкновенной null-terminated строкой (строкой с завершающим 0, классические строки C) LPCWSTR Тоже строка с завершающим нулем, но для широких символов, где каждый символ занимает 16 бит, а не 8 как в обычных строках (более подробно о широких символах тут). Такая, на первый взгляд, странная и сложная система типов убережет вас от ошибок совместимости типов на разных аппаратных платформах, поэтому рекомендуется использовать встроенные типы и явно преобразовать типы при необходимости. Со списком типов можно ознакомится здесь Сообщения Windows Приложения, процессы, окна в windows так же как и люди постоянно обмениваются сообщениями, на этих сообщения построена вся система Windows, приложение получает сообщение и на основании этого сообщения совершает определенное действие, например: WM_CLOSE - сигнализирует, что окно или приложение закрывается. Это сообщение не имеет параметров. По умолчанию оно закрывает окно, которому послано. Если приложение обрабатывает это сообщение, то оно должно возвращать нуль. При обработке этого сообщение приложение может запросить пользователя о необходимости закрывать окно или вызвать функцию закрывания окна только при положительном ответе. Для обработки сообщений вашим приложением, вы должны создать функцию: Эта функция ваша, но её внешний вид должен соответствовать ожиданию системы. HWND hwnd - дескриптор окна получившего сообщение UINT iMsg - сообщение (список сообщений можно найти тут) WPARAM wParam, LPARAM lParam - набор дополнительных параметров сообщения Для обработки сообщений от системы используется switch: Функция должна обрабатывать сообщение WM_DESTROY, и должна возвращать DefWindowProc, обработка остальных сообщений дело вашей совести и фантазии. Пример В завершение я напишу приложение с одним окном и обработчиком нажатия клавиш. Для создания Win API приложения в среде CodeGear RAD STUDIO (Builder 2007) вызовите мастер создания консольного приложения и снимите все галочки, в результате вы получите проект с основным файлом, функцией WinMain и подключенным windows.h Для создания окна вашего приложения вам потребуется класс WNDCLASSEX и вызвать функцию создания создания окна, потом организуем цикл обработки сообщений: Я специально не привожу описание функции CreateWindows - сделайте это сами, поигравшись с параметрами вы можете создать полно экранное окно без рамок - первый шаг в написании игр. Теперь дело до обработки сообщений: Сообщение WM_PAINT - посылается окну когда возникает необходимость перерисовать его WM_KEYDOWN - при нажатии любой клавиши (wParam содержит код нажатой клавиши) и WM_DESTROY при закрытии приложения. Данное приложение создаст окно с текстом и будет уведомлять пользователя если он нажал какую либо клавишу, дабы не перегружать функцию WndProc обычно из нее вызывают функции реализующие обработку того или иного события. (c)bitbybit.ru
Вин АПИ классная штука от изобретения велосипеда, уменьшение веса. От себя могу посоветовать использовать не только ради каких то функций но и для от рисовки компонентов. Если делать это стандартными методами то например кнопка у вас будет как ресурс. Когда этих кнопок 100 штук то они занимают приличное место как ресурс. Если их делать через вызов АПИ то их вес уменьшится в раз 20-30. Не знаю как это будет актуально в си, тк тесно знакомился с ними в рамках ASMа.
1. Абсолютно не кроссплатформенно. Что уже сейчас все больше и больше смотрится как признак дурного тона. 2. Писать визуальные вещи на WinAPI - могут только люди, у которых уйма ненужного времени. 3. Но знать WinAPI весьма полезно) //Ждал твоего комментария))
1) Про кроссплатформенность тут и не шла речь, не всегда стоит такая задача при разработке. 2) Либо которым важен размер ( я фанатик асма был )
)))) Если не трудно, пример, хотя бы одного визуального приложения, для Windows, где критически важен размер)))) Естественно речь идет о настоящем времени) А не о 90х когда каждый килобайт считали) Плюс, если уж говорить о WinAPI, в визуальных штуках- я вижу только один - более аккуратное использование GDI ресурсов, при правильном программировании)
~|~евто|-|, Твоя критика, как от профессионала, весьма уместна. Но думаю в качестве ознакомления с WinAPI написано довольно-таки не плохо. зы. Кроссплатформенность кода, и обьяснение думаю потянет на ещё на одну статью