Windows h создать окно
Пишем на WinAPI с «нуля»
Данная статья является введением в программирование на WinAPI. Важно понимать, что она носит скорее информационный характер, чем служит примером кода для реальных приложений. Дело в том, что WinAPI создавался для языка С, и имеет целый ряд недостатков в применении, как-то: невысокая безопасность, большой объем ручного кодирования для решения простейших задач, С-стиль, плохо выглядящий в C++-приложениях. Практически любое средство разработки на языке C++ для Windows включает те или иные высокоуровневые C++-библиотеки (MFC, ATL/WTL для Visual C++, VCL для C++ Builder), значительно упрощающие разработку Windows-приложений, и делающие ее более безопасной.
Предисловие
Эта статья посвящена описанию программирования приложений на «чистом» Win32 API. Она написана в основном для начинающих программистов, пишущих программы на Visual C++ 6 с использованием библиотеки MFC, но я надеюсь, может пригодиться и более опытным людям.
First Blood
После создания нового проекта Win32 Application, в зависимости от выбранных опций, мастер генерирует стартовый код. Из этого кода программисту впоследствии, и придется писать программу. Создавая новый проект Win32 Application, выберите в окне мастера опцию An empty project и добавьте в раздел Source Files новый файл с расширением .cpp.
В этом файле добавьте функцию WinMain вида:
- HINSTANCE hInstance – дескриптор экземпляра приложения. Этот дескриптор содержит адрес начала кода программы в ее адресном пространстве. Дескриптор hInstance чаще всего требуется функциям, работающим с ресурсами программы.
- HINSTANCE hPrevInstance – дескриптор предыдущего экземпляра приложения. Этот дескриптор остался от старых версий Windows - скорее всего, вам он никогда не пригодится.
- LPSTR lpCmdLine – указатель на начало командной строки, введенной при запуске программы.
- int nCmdShow – это значение содержит желаемый вид окна (например, свернутый или развернутый)
Значение, которое возвращается функцией WinMain (тип int ) – код завершения программы. Принято, что если программа завершила свое выполнение без ошибок, возвращается 0.
Функция WinMain – первая функция, которая выполнятся в программе (ее еще называют «точка входа» или «entry point»). С нее все начинается, и ею (желательно) все должно закончиться.
ПРИМЕЧАНИЕ
Функция WinMain – это первая функция, которую вы можете увидеть и заполнить кодом. На самом деле до этой функции выполняется достаточно много кода из библиотеки C++
You have a Message!
Программисты, незнакомые с программированием на WinAPI, спросят: «Что с этим делать?!», - или: «Где создавать CDialog?». В данном случае ответ прост – нигде! В нашем проекте нет класса CDialog или, предположим, CButton – ведь эта статья посвящена тому, как обойтись без них.
СОВЕТ
Функция GetMessage принимает следующие параметры:
СОВЕТ
При вызове этой функции ей передаются следующие параметры:
CLASSные окна
Итак, регистрация! За нее отвечает функция RegisterClass . В ее параметре необходимо передать указатель на структуру WNDCLASS . Обычно для заполнения структуры и вызова RegisterClass создают отдельную функцию. Но это - дело вкуса.
Вот простейший пример такой функции:
Функция RegisterClass возвращает уникальный «описатель класса окна» типа ATOM . Если при регистрации класса произошла ошибка, это значение будет равно нулю. Чтобы узнать, что произошло, можно вызвать функцию GetLastError() .
Существует также функция RegisterClassEx. Это аналог функции RegisterClass с возможностью присвоения окнам маленькой иконки. При работе с этой функцией необходимо пользоваться структурой WNDCLASSEX.
ПРИМЕЧАНИЕ
Если вы решились работать с GUI Windows вручную, то пользоваться нужно именно RegisterClassEx, поскольку приложение, не имеющее маленькой иконки, сегодня выглядит в Windows как минимум странно. – прим.ред.
hInstance | Дескриптор текущего экземпляра приложения. Так как Windows является многозадачной системой, то очевидно, что одна и та же программа может быть запущена несколько раз. Для того чтобы различать экземпляры программ, каждому экземпляру присваивается условный номер – хэндл (handle). Отмечу, так же, что в Win32 присваиваются хэндлы чему угодно – окну, меню, курсору, иконке и т.д. |
hPrevInctance | Указатель на предыдущий запущенный экземпляр. Всегда равен NULL. В Windows 3.1 hPrevInctance являлся хэндлом предыдущего экземпляра программы. Если запускается первый экземпляр программы, то параметр hPrevInctance был равен нулю. Этот параметр можно было использовать для того, чтобы не позволить системе запускать более одного экземпляра программы. В Win32 hPrevInctance оставлен исключительно для совместимости с предыдущими версиями Windows. |
lpCmdLine | Указатель на командную строку запускаемой программы. Представляет собой указатель на строку параметров, которые были указаны после имени запускаемой программы. При необходимости программа может проанализировать этот аргумент и выполнить некоторые действия. |
nCmdShow | Способ визуализации окна. Определяет, в каком виде создаваемое окно будет появляться на экране. Окно может появиться развернутым на весь экран, свернутым в панель задач, иметь произвольный размер на рабочем столе и другие характеристики. В Win API определяется 11 возможных значений этого параметра. Их идентификаторы начинаются с SW (Show Window). |
Возможные значения параметра nCmdShow приведены ниже:
SW_HIDE | Скрывает окно и активизирует другое окно. |
SW_MAXIMIZE | Распахивает указанное окно на весь экран. |
SW_MINIMIZE | Минимизирует указанное окно и активизирует следующее окно верхнего уровня Z буфера. |
SW_RESTORE | Активизирует и отображает окно. Если окно минимизировано или развернуто, система восстанавливает его в исходное положение и размер. Приложение должно указать этот флаг при восстановлении свернутого окна. |
SW_SHOW | Активирует окно и выводит на экран это в его текущем размере и позиции. |
SW_SHOWMAXIMIZED | Активизирует окно и отображает его как развернутое окно. |
SW_SHOWMINIMIZED | Активизирует окно и отображает его как свернутое окно. |
SW_SHOWMINNOACTIVE | Отображает окно как свернутое окно. Это значение аналогично SW_SHOWMINIMIZED, за исключением того, что окно не активизируется. |
SW_SHOWNA | Отображает окно в его текущем размере и позиции. Это значение аналогично SW_SHOW, за исключением того, что окно не активизируется. |
SW_SHOWNOACTIVATE | Отображает окно в его последнем размер и положение. Это значение аналогично SW_SHOWNORMAL, за исключением того, что окно не активируется. |
SW_SHOWNORMAL | Активизирует и отображает окно. Если окно минимизировано или развернуто, система восстанавливает его в исходное положение и размер. Приложение должно указать этот флаг при показе окна в первый раз. |
Указатель типа int предшествующий названию функции говорит о том, что функция должна вернуть вызывающей её системе целое значение, а характеристика WINAPI – определяет порядок передачи параметров при вызове процедуры. Наименование характеристик говорит само за себя – Windows Application Programming Interface – применяются соглашения о передаче параметров, принятых в системах Windows.
Следующим шагом нужно создать, заполнить и зарегистрировать класс окна. Класс окна представляет собой структуру с именем WNDCLASS.
Прототип структуры WNDCLASS выглядит следующим образом:
ATOM RegisterClass( CONST WNDCLASS *lpWndClass );
В качестве параметров функция принимает указатель на структуру WNDCLASS созданную нами ранее.
HWND CreateWindow ( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam );
lpClassName | Указатель на имя класса окна. |
lpWindowName | Указатель на имя окна. При использовании CreateWindow для создания элементов управления, таких как кнопки, флажки и статические элементы управления, в lpWindowName указывается идентификатор элемента. |
dwStyle | Определяет стиль окна. Этот параметр может быть комбинацией стилей окна. |
x | Задает начальное горизонтальное положение окна. |
у | Задает начальное вертикальное положение окна. |
nWidth | Определяет ширину окна в пикселях. |
nHeight | Определяет высоту окна в пикселях. |
hWndParent | Дескриптор родителя(владельца) создаваемого окна. |
hMenu | Дескриптор меню. |
hInstance | Хэндл экземпляра окна. |
lpParam | Мы пока использовать не будем. |
При успешном выполнении функция возвращает дескриптор созданного окна, при ошибке NULL.
Для того чтобы корректно отобразить окно на экране, следует выполнить ещё две функции ShowWindow и UpdateWindow.
BOOL ShowWindow( HWND hWnd, int nCmdShow )
Функция ShowWindow отображает окно на экране. Первый параметр – дискриптор окна, второй – режим отображения. В качестве этого параметра обычно используют параметр nWinMode функции WinMain.
BOOL UpdateWindow( HWND hWnd )
while (GetMessage(&msg, NULL, 0, 0))
Во всех трех функциях присутствует указатель на строку MSG. Разберём её:
Вот прототип оконной функции:
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
Далее я покажу код приложения создающего простое окно Windows, которое обладает основными элементами: заголовок, кнопки минимизации, распахивания на весь экран и закрытия окна, а так же свойствами: перемещение по экрану, изменение ширины и высоты, завершения работы приложения при нажатии на кнопку завершения приложения (крестик).
Читайте также:
- Во что поиграть на mac os
- Не поддерживает архитектуру i386 ubuntu
- Указанная сборка не установлена в системе windows 7
- Xfce linux что это
- Remote signal не запускается на windows