Функция CreateWindowEx()
Для создания окна используется функция CreateWindowEx(). Ее можно применять для создания дочерних, всплывающих или перекрывающихся окон. При создании окна вы указываете используемый класс, имя приложения и некоторые другие параметры. Прототип функции выглядит следующим образом:
HWND CreateWindowEx( DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam );
Первый параметр имеет тип DWORD и называется dwExStyle. Он похож на определяющий стиль член структуры WNDCLASSEX, но задает дополнительные стили окна. Список доступных дополнительных стилей приведен в таблице2.6.
Таблица 2.6. Дополнительные стили окна | |
Стиль | Описание |
WS_EX_ACCEPTFILES | Окно может получать файлы с использованием механизма перетаскивания. |
WS_EX_APPWINDOW | Заставляет окно перемешаться на верхний уровень панели задач, когда оно видимо. |
WS_EX_CLIENTEDGE | Окно обрамлено рамкой, чтобы клиентская область выглядела углубленной. |
WS_EX_CONTROLPARENT | Позволяет переключаться между дочерними окнами с помощью клавиши TAB. |
WS_EX_DLGMODALFRAME | Окно будет обрамлено двойной рамкой. |
WS_EX_LEFT | Окно выровнено по левой границе. Это значение по умолчанию. |
WS_EX_LEFTSCROLLBAR | Для некоторых языков полосу прокрутки следует располагать слева от текста. В таких случаях и применяется этот стиль. |
WS_EX_LTRREADING | Отображаемый в окне текст читается слева направо. Это значение по умолчанию. |
WS_EX_NOPARENTNOTIFY | Подавляет сообщение WM_PARENTNOTIFY отправляемое дочерним окном родительскому при создании или уничтожении. Применяется для дочерних окон. |
WS_EX_OVERLAPPEDWINDOW | Комбинация флагов WS_EX_CLIENTEDGE и WS_EX_WINDOWEDGE. |
WS_EX_PALETTEWINDOW | Комбинация флагов WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW и WS_EX_TOPMOST. |
WS_EX_RIGHT | Содержимое окна выравнивается по правой границе. Это необходимо для некоторых языков. |
WS_EX_RIGHTSCROLLBAR | Полоса прокрутки располагается справа от клиентской части окна. Это значение по умолчанию. |
WS_EX_RTLREADING | В некоторых языках текст читают справа налево. Для таких языков использование данного стиля позволит системе отображать символы в окне справа налево. |
WS_EX_STATICEDGE | Создает окно, предназначенное для элементов, которые не будут получать входные данные от пользователя. |
WS_EX_TOOLWINDOW | Создает окно, выглядящее как панель инструментов. |
WS_EX_TOPMOST | Окно будет оставаться самым верхним на рабочем столе, независимо от того, активно оно или нет. |
WS_EX_WINDOWEDGE | У окна будет рамка с рельефной гранью. |
В рассматриваемом примере я указываю в первом параметре дополнительный стиль WS_EX_OVERLAPPEDWINDOW. Благодаря использованию этого стиля, окно программы будет выглядеть подобно большинству приложений Windows.
Второй параметр представляет собой завершающуюся нулевым символом строку, содержащую имя класса для создаваемого окна. Все, что необходимо сделать — указать то же имя, которое вы использовали при инициализации члена lpszClassName структуры WNDCLASSEX. В моем примере я использую строку «Window Class».
Третий параметр — это еще одна завершающаяся нулевым символом строка. Вместо того, чтобы определять имя класса, она задает текст, который будет выведен в заголовке окна. Вы можете назвать свою программу как пожелаете, а я свою назвал «Create Window Example».
Четвертый параметр, dwStyle, позволяет задать различные комбинации стилей для вашего окна. Доступные стили перечислены в таблице 2.7.
Таблица 2.7. Cтили окна | |
Стиль | Описание |
WS_BORDER | Окно обрамлено тонкой рамкой. |
WS_CAPTION | У окна есть заголовок. |
WS_CHILD | Окно является дочерним. Этот стиль нельзя использовать вместе со стилем WS_POPUP. |
WS_CHILDWINDOW | То же самое, что и WS_CHILD. |
WS_CLIPCHILDREN | Предотвращает рисование в тех областях окна, которые заняты дочерними окнами. |
WS_CLIPSIBLINGS | Используется только для дочерних окон. Если дочернее окно, для которого был установлен этот стиль перекрывается другими дочерними окнами, то при обновлении содержимого окна будет перерисовываться только та часть, которая не закрыта другими окнами. |
WS_CLIPSIBLINGS | Окно заблокировано и не может принимать данные от пользователя. |
WS_DLGFRAME | Стиль для диалоговых окон. |
WS_GROUP | Указывает, что данное окно является первым в группе окон. Используется для упорядочивания окон. Первое окно, у которого установлен стиль WS_GROUP начинает группу, после чего все последующие окна будут добавляться в ту же группу, пока снова не встретится окно с установленным стилем WS_GROUP (оно начнет следующую группу). |
WS_HSCROLL | Окно с горизонтальной полосой прокрутки. |
WS_ICONIC | После создания окно отображается в свернутом виде. |
WS_MAXIMIZE | После создания окно отображается развернутым на весь экран. |
WS_MAXIMIZEBOX | В заголовке окна есть кнопка для развертывания на весь экран. |
WS_MINIMIZE | То же самое, что и стиль WS_ICONIC. |
WS_MINIMIZEBOX | В заголовке окна есть кнопка для свертывания окна. |
WS_OVERLAPPED | Перекрывающееся окно с заголовком и рамкой. |
WS_OVERLAPPEDWINDOW | Окно с комбинацией стилей WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX. |
WS_POPUP | Стиль для всплывающих окон. |
WS_POPUPWINDOW | Всплывающее окно с комбинацией стилей WS_BORDER, WS_POPUP и WS_SYSMENU. |
WS_SIZEBOX | Окно может изменять размер. |
WS_SYSMENU | У окна есть системное меню, вызываемое при щелчке правой кнопкой мыши по заголовку. Чтобы этот стиль работал правильно, он должен использоваться совместно со стилем WS_CAPTION. |
WS_TABSTOP | Окно может стать активным при нажатии на клавишу TAB. |
WS_THICKFRAME | То же самое, что и стиль WS_SIZEBOX. |
WS_TILED | То же самое, что и стиль WS_OVERLAPPED. |
WS_VISIBLE | После создания окно будет видимым. |
WS_VSCROLL | Окно с вертикальной полосой прокрутки. |
В программе CreateWindow в этом параметре я указываю стиль WS_OVERLAPPEDWINDOW. Это придает окну вид, похожий на большинство других приложений Windows.
Пятый параметр функции CreateWindowEx() — это целое число, задающее позицию окна на экране по горизонтали. Если вы создаете дочернее окно, координата отсчитывается относительно координаты по горизонтали родительского окна. Поскольку в примере нет дочерних окон, используемое значение координаты, 0, приведет к размещению окна вплотную к левой границе экрана.
Шестой параметро задает позицию окна на экране по вертикали. Подобно позиции по горизонтали, позиция по вертикали представляет координату на экране только в том случае, если окно не является дочерним. Для дочернего окна это значение задает смещение относительно позиции по вертикали родительского окна. Чтобы лучше понять эту концепцию взгляните на рис. 2.11.
Рис. 2.11. Координаты окна определяют его позицию в зависимости от того, является окно дочерним или нет |
Седьмой параметр создающей окно функции задает ширину окна в пикселах. В нашем примере ширина окна равна 320 пикселам.
Восьмой параметр задает высоту окна в пикселах. В примере высота окна равна 200 пикселам.
Девятый параметр функции указывает родителя данного окна. Он полезен, когда создается приложение с несколькими окнами. Поскольку в рассматриваемом примере есть только одно главное окно, данному параметру присваивается значение NULL чтобы указать, что у окна нет родителя.
Десятый параметр используется для задания дескриптора связанного с окном меню. В примере нет никаких меню, поэтому данному параметру присваивается значение NULL.
Одиннадцатый параметр используется для задания дескриптора экземпляра модуля. В этом параметре вы передаете дескриптор экземпляра, полученный функцией WinMain() в одном из ее параметров.
Последний параметр используется для указания дополнительных данных создаваемого окна. Мне очень редко приходилось использовать этот параметр, поэтому в большинстве приложений я присваиваю ему значение NULL.
Ничего себе! Вы проделали почти всю работу, необходимую для отображения окна на экране. На рис. 2.12 показан ход выполнения программы до настоящего момента.
Рис. 2.12. Ход выполнения кода приложения до вызова функции CreateWindowEx() |