Знакомство с WinAPI
Запись от nobless1368 размещена 23.01.2013 в 17:30
Показов 22852
Комментарии 2
|
В своем блоге я хочу познакомить вас с основами программирования под самую распространенную на данный момент ОС - Windows. Не буду тратить ваше и свое время на длинные вступительные речи. Постараюсь сделать все коротко и ясно. Я предполагаю, что вы знакомы с синтаксисом языка С++ и имеете представление о том, что же такое ООП. Итак, приступим. Наша первая программа для Windows будет создавать окно с надписью "Hello, mustdie!". Вопреки традиционному подходу "сначала теория, потом практика", я буду рассказывать все и сразу на примерах. Итак, вот наша первая программа:
В любой 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:
В отличие от традиционной точки входа 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 следующим образом:
Особое внимание хотелось бы уделить следующим двум инструкциям:
В следующем поле находится просто описатель экземпляра программы:
То же самое, только для курсора:
Вместо использования структуры данных, как в случае с RegisterClassEx, вызов функции CreateWindow требует, чтобы вся информация передавалась функции в качестве параметров (см. листинг программы). Итак, создали окно внутри Windows, осталось его отобразить. Делается это при помощи всего двух вызовов. Первый:
Второй:
Жду ваших отзывов, комментариев, исправлений и, как бы банально это ни звучало, заинтересованности. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
-
Статья предназначается для людей, которые только начали изучать WinAPI, и если я сразу начну говорить о юникоде, портах и прочих вещах, для изучения которых нужно хоть что-то знать, то у читателей после первой же статьи такая каша в голове образуется, что потом лопатой не разгрести.
Сообщение от Jupiter
Теги добавилЗапись от nobless1368 размещена 27.01.2013 в 00:27
-
Запись от nobless1368 размещена 27.01.2013 в 00:30


