Как узнать класс окна windows

Обновлено: 01.07.2024

ориентированного подхода. Фраза стала нелогичной с 1993. Появился FrameWork – объектно-ориентированная надстройка.

Окна в Windows определяются как структуры, содержащие поля данных. Совокупности методов,

управляющих полями, реализованы в виде одной функции, которая называется функцией окна.

Т.о. единственная для каждого окна функция окна регулирует все методы окна как объекта.

В Windows предусмотрен механизм наследования методов, которые реализуются с использованием класса окна. Для каждого класса определяется функция окна. При создании окна необходимо указать, какому классу оно будет принадлежать и соответственно какую функцию окна будет использовать для обработки событий.

Приложения могут создавать собственные классы окна, либо использовать стандартные, определенные Windows классы окна. Любое создаваемое окно может наследовать свойство уже созданных ранее окон. Для большинства стандартных элементов управления, таких как кнопки, меню, списки и т.ж. уже определены классы окна и все необходимые методы.

1) Описание функции окна: функция окна не стандартна, ее нельзя напрямую вызвать из функции WinMain или любой другой. Вызов функции окна осуществляет ОС.

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)

return DefWindowProc (hWnd, msg, wp, lp);

Тип возвращаемого значения указывает, что функция окна это функция обратного вызова. Имя

функции окна может быть произвольным.

2) Описание класса окна.

WNDCLASS typedef struct tagWNDCLASS

UINTstyle;

WNDPROClpfnWndProc;

intcbClsExtra;

intcbWndExtra;

HINSTANCEhInstance;

HICONhIcon;

HCURSORhCursor;

HBRUSHhbrBackground;

LPCTSTRlpszMenuName;

LPCTSTRlpszClassName;

1 – определяет стиль класса, задается в виде именованных констант с префиксами.

CS_VREDRAW – окно должно быть перерисовано с изменением масштаба, горизонтального размера.

Стиль задает реакцию окна на некоторые события и характеристики отображения окна.

3 – используется для выделения дополнительной памяти, общей и доступной для всех окон, созданных на базе данного класса.

4 – позволяет увеличить размер области памяти для хранения информации (общей и доступной), имеющей отношение к экземпляру окна.

5 – содержит идентификатор приложения, создающий класс окна.

6 – содержит идентификатор пиктограммы, в которую превращается окно при инициализации. Пиктограмма может быть загружена с помощью LoadIcon(HINSTANCE, LPCSTR) – 1 параметр идентификатор приложения, 2 – идентификатор ресурса.

7 – задает вид курсора мыши, при его прохождении над окном, LoadCursor(..).

8 – определяет кисть для закрашивания поля окна, в качестве кисти используется либо цвет, либо пиктограмма.

9 – определяет меню главного окна приложения. Если меню нет, то используется NULL.




ATOM WINAPI RegisterClass(const WNDCLASS *wndclass);

В качестве аргумента используется адрес, полностью инициализирующий структуру класса окна.

WndClass = RegisterClass(& wc);

ATOM – тип идентификатора текстовых строк, которые храняться в системной памяти.

4) Создание главного окна приложения.

HWND WINAPI CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, // int y, // лев верх угол int nWidth, // ширина int nHeight, //высота HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);

Отображение окна на экране:

ShowWindow(HWND hwnd, in CmdShow);

while (GetMessage(&msg, 0, 0, 0))

Жму компилировать и появляется вот такая ошибка:
Компиляция.
GetClassName.cpp
c:\documents and settings\дима\мои документы\visual studio 2008\projects\getclassname\getclassname\getclassname.cpp(10) : error C2601: Find: недопустимые локальные определения функций
c:\documents and settings\дима\мои документы\visual studio 2008\projects\getclassname\getclassname\getclassname.cpp(9): эта строка содержит ' c:\documents and settings\дима\мои документы\visual studio 2008\projects\getclassname\getclassname\getclassname.cpp(12) : error C2664: FindWindowW: невозможно преобразовать параметр 2 из 'const char [12]' в 'LPCWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
c:\documents and settings\дима\мои документы\visual studio 2008\projects\getclassname\getclassname\getclassname.cpp(15) : error C2664: GetClassNameW: невозможно преобразовать параметр 2 из 'char [100]' в 'LPWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
Журнал построения был сохранен в "file://c:\Documents and Settings\Дима\Мои документы\Visual Studio 2008\Projects\GetClassName\GetClassName\Debug\BuildLog.htm"
GetClassName - ошибок 3, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Помогите пожалуйста! Вроде все правильно сделал, что еще не так не пойму.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Как получить значение поля класса Окна в классе Контроллера для этого окна?
Доброго всем времени суток. Есть вот такая ситуация. Создаю окна, путем загрузки разметки из fxml.


Как получить имя активного окна?
Здравствуйте, у меня такой вопрос: Как получить имя процесса активного окна

Как получить полное квалификационное имя класса
Как получить полное квалификационное имя класса в Intelliji IDEA, например в eclipse для этого.

Как получить имя класса, которому принадлежит поле
Есть метод с одним out-параметром, принимающим string. Как с помощью рефлексии в этом методе.

В этом разделе рассматриваются следующие темы.

Типы классов окон

Существует три типа классов окон:

Эти типы различаются в области и в случаях, когда и как они регистрируются и уничтожаются.

Системные классы

система регистрирует системные классы для процесса в первый раз, когда один из его потоков вызывает функцию пользователя или Windows интерфейс графических устройств (GDI).

Каждое приложение получает собственную копию системных классов. все 16-разрядные приложения на основе Windows в одном и том же классе общей системы VDM, как и в 16-разрядных Windows.

В следующей таблице описаны системные классы, доступные для использования всеми процессами.

Класс Описание
Кнопка Класс для кнопки.
ComboBox Класс для поля со списком.
Изменить Класс для элемента управления "поле ввода".
ListBox Класс для поля со списком.
мдиклиент Класс для клиентского окна MDI.
ScrollBar Класс для полосы прокрутки.
Статический Класс для статического элемента управления.

В следующей таблице описаны системные классы, доступные только для использования системой. Они перечислены здесь для полноты.

Глобальные классы приложений

Чтобы создать класс, который можно использовать в каждом процессе, создайте класс окна в .dll и загрузите .dll в каждом процессе. Чтобы загрузить .dll в каждом процессе, добавьте его имя в значение библиотеки _ DLL в следующем разделе реестра:

HKey _ _ \ программное обеспечение \ Microsoft \ Windows NT \ CurrentVersion \ на локальном компьютере Windows

Каждый раз при запуске процесса система загружает указанный .dll в контексте вновь запущенного процесса перед вызовом функции точки входа. .dll необходимо зарегистрировать класс во время инициализации и указать стиль CS _ глобалкласс . Дополнительные сведения см. в разделе стили классов.

Чтобы удалить глобальный класс приложения и освободить связанное с ним хранилище, используйте функцию унрегистеркласс .

Локальные классы приложения

Локальный класс приложения — это любой класс окна, который исполняемый файл или .dll регистрируется для монопольного использования. Хотя можно зарегистрировать любое количество локальных классов, обычно регистрируется только один. Этот класс окон поддерживает процедуру окна главного окна приложения.

Система уничтожает локальный класс, когда модуль, который зарегистрировал его, закрывается. Приложение также может использовать функцию унрегистеркласс для удаления локального класса и освобождения связанного с ним хранилища.

Как система находит класс окна

Система содержит список структур для каждого из трех типов классов окон. Когда приложение вызывает функцию CreateWindow или CreateWindowEx для создания окна с указанным классом, система использует следующую процедуру для нахождение класса.

  1. Выполните поиск в списке локальных классов приложения для класса с указанным именем, чей экземпляр соответствует обработчику экземпляра модуля. (Несколько модулей могут использовать одно и то же имя для регистрации локальных классов в одном процессе.)
  2. Если имя отсутствует в списке локальных классов приложения, выполните поиск в списке глобальных классов приложения.
  3. Если имя отсутствует в списке глобальных классов приложения, выполните поиск по списку классов системы.

Все окна, созданные приложением, используют эту процедуру, включая Windows, созданную системой от имени приложения, например диалоговые окна. Можно переопределить системные классы, не затрагивая другие приложения. Это значит, что приложение может зарегистрировать локальный класс приложения с тем же именем, что и системный класс. Этот класс System заменяется в контексте приложения, но не мешает другим приложениям использовать класс System.

Класс окна определяет атрибуты окна, например его стиль, значок, курсор, меню и процедуру окна. Первым шагом при регистрации класса окна является заполнение структуры вндклассекс данными класса Window. Дополнительные сведения см. в разделе элементы класса Window. Затем передайте структуру в функцию RegisterClassEx . Дополнительные сведения см. в разделе using Window classes.

Чтобы зарегистрировать глобальный класс приложения, укажите _ стиль CS глобалкласс в элементе Style структуры вндклассекс . При регистрации локального класса приложения не указывайте стиль CS _ глобалкласс .

Исполняемый файл или библиотека DLL, которая зарегистрировала класс, является владельцем класса. Система определяет владение классом из элемента HINSTANCE структуры вндклассекс , передаваемого в функцию RegisterClassEx при регистрации класса. Для библиотек DLL элемент HINSTANCE должен быть обработчиком .dll экземпляра.

Класс не уничтожается, когда .dll, которому принадлежит он, выгружается. Таким образом, если система вызывает процедуру окна для окна этого класса, это вызовет нарушение прав доступа, так как .dll, содержащий процедуру окна, больше не находится в памяти. Процесс должен уничтожить все окна с помощью класса до выгрузки .dll и вызова функции унрегистеркласс .

Элементы класса Window

Элементы класса Window определяют поведение Windows по умолчанию, принадлежащее классу. Приложение, которое регистрирует класс окна, назначает элементы классу путем установки соответствующих элементов в структуре вндклассекс и передачи структуры в функцию RegisterClassEx . Функции жетклассинфоекс и жеткласслонг извлекают сведения о данном классе окна. Функция сеткласслонг изменяет элементы локального или глобального класса, которые приложение уже зарегистрировало.

Хотя полный класс окна состоит из множества элементов, система требует, чтобы приложение предпредоставил только имя класса, адрес процедуры окна и экземпляр. Используйте другие элементы для определения атрибутов по умолчанию для окон класса, например формы курсора и содержимого меню для окна. Все неиспользуемые члены структуры вндклассекс необходимо инициализировать равными нулю или null. В следующей таблице приведены элементы класса Window.

Имя класса

Каждому классу окна требуется имя класса , чтобы отличать один класс от другого. Назначьте имя класса, задав для элемента лпсзкласснаме структуры вндклассекс адрес строки, завершающейся нулем, которая указывает имя. Поскольку классы окон зависят от процесса, имена классов окон должны быть уникальными только в пределах одного процесса. Кроме того, поскольку имена классов занимают пространство в частной таблице Atom системы, следует как можно более короткие строки имен классов.

Функция className возвращает имя класса, которому принадлежит заданное окно.

Адрес процедуры окна

Маркер экземпляра

Каждый класс окна требует наличия обработчика экземпляра для указания приложения или .dll, которые регистрировали класс. Система требует наличия дескрипторов экземпляров для наблюдения за всеми модулями. Система назначает маркер каждой копии выполняемого исполняемого файла или .dll.

Система передает экземпляр в функцию точки входа каждого исполняемого файла (см. статью WinMain) и .dll (см. DllMain). Исполняемый файл или .dll назначает этот экземпляр обработчику, копируя его в элемент HINSTANCE структуры вндклассекс .

Курсор класса

Курсор класса определяет форму курсора, когда он находится в клиентской области окна в классе. Система автоматически устанавливает курсор на заданную фигуру, когда курсор попадает в клиентскую область окна, и гарантирует, что эта фигура останется в клиентской области. Чтобы назначить форму курсора классу окна, загрузите стандартную фигуру курсора с помощью функции лоадкурсор , а затем назначьте возвращенный маркер курсора элементу хкурсор структуры вндклассекс . Кроме того, можно предоставить настраиваемый ресурс курсора и использовать функцию лоадкурсор для ее загрузки из ресурсов приложения.

Значки классов

Значок класса — это изображение, используемое системой для представления окна определенного класса. Приложение может иметь два значка класса — один крупный и один маленький. Система отображает значок крупного класса окна в окне переключения задач, которое появляется, когда пользователь нажимает ALT + TAB и в представлениях крупных значков панели задач и обозревателя. Значок небольшого класса появляется в строке заголовка окна и в представлениях мелких значков панели задач и обозревателя.

Чтобы назначить большой и маленький значок классу окна, укажите дескрипторы значков в элементах Хикон и хиконсм структуры вндклассекс . Размеры значков должны соответствовать обязательным измерениям для крупных и мелких значков классов. Для значка крупного класса можно определить необходимые измерения, указав значения SM _ Кксикон и SM _ Циикон в вызове функции жетсистемметрикс . Для значка небольшого класса укажите значения SM _ Ккссмикон и SM _ цисмикон . Дополнительные сведения см. в разделе значки.

Если приложение устанавливает для элементов Хикон и Хиконсм структуры вндклассекс значение NULL, система использует значок приложения по умолчанию в качестве крупных и мелких значков классов для класса Window. Если указать значок крупного класса, но не маленький, система создает маленький значок класса, основанный на большом размере. Однако если указать маленький значок класса, но не большой, система будет использовать значок приложения по умолчанию в качестве значка крупного класса и указанный значок в качестве значка небольшого класса.

Кисть фона класса

Чтобы назначить фоновую кисть для класса, создайте кисть с помощью соответствующих функций GDI и назначьте возвращенный дескриптор кисти элементу хбрбаккграунд структуры вндклассекс .

Вместо создания кисти приложение может задать для элемента хбрбаккграунд одно из стандартных значений системного цвета. Список стандартных значений системного цвета см. в разделе сетсисколорс.

Чтобы использовать стандартный системный цвет, приложение должно увеличить значение цвета фона на единицу. Например, цвет фона ( _ фон ) + 1 является системным цветом фона. Кроме того, можно использовать функцию жетсисколорбруш для получения дескриптора кисти, соответствующей стандартному системному цвету, а затем указать дескриптор в элементе хбрбаккграунд структуры вндклассекс .

Меню класса

Меню класса определяет меню по умолчанию, используемое окнами в классе, если при создании окон не задано явное меню. Меню — это список команд, из которых пользователь может выбрать действия для выполнения приложения.

Можно назначить меню классу, задав для элемента лпсзменунаме структуры вндклассекс адрес строки, завершающейся нулем, которая указывает имя ресурса меню. Предполагается, что меню является ресурсом в данном приложении. Система автоматически загружает меню при необходимости. Если ресурс меню идентифицируется целым числом, а не именем, то приложение может задать для элемента лпсзменунаме это целое число, применив макрос макеинтресаурце перед присвоением значения.

В системе не требуется меню класса. Если приложение устанавливает для элемента лпсзменунаме структуры вндклассекс значение NULL, в Windows в классе нет строк меню. Даже если меню класс не задано, приложение по-прежнему может определить строку меню для окна при создании окна.

Если для класса задано меню и создано дочернее окно этого класса, меню игнорируется. Дополнительные сведения см. в разделе меню.

Стили класса

Стили классов определяют дополнительные элементы класса Window. Два или более стиля можно объединить с помощью побитового оператора OR ( | ). Чтобы назначить стиль классу окна, назначьте стиль элементу Style структуры вндклассекс . Список стилей классов см. в разделе стили классов окон.

Классы и контексты устройств

Контекст устройства — это специальный набор значений, которые используются приложениями для рисования в клиентской области окна. Система требует наличия контекста устройства для каждого окна на экране, но обеспечивает некоторую гибкость в том, как система хранит и обрабатывает контекст устройства.

Если явно не задан стиль контекста устройства, система предполагает, что в каждом окне используется контекст устройства, полученный из пула контекстов, поддерживаемых системой. В таких случаях каждое окно должно извлекать и инициализировать контекст устройства перед рисованием и освобождать его после рисования.

Чтобы избежать извлечения контекста устройства каждый раз, когда ему требуется закрашивать внутри окна, приложение может указать стиль _ овндк CS для класса Window. Этот стиль класса направляет систему для создания частного контекста устройства, то есть для выделения уникального контекста устройства для каждого окна в классе. Приложению требуется только получить контекст, а затем использовать его для всех последующего рисования.

Память дополнительного класса

Поскольку дополнительный объем памяти выделяется из локальной кучи системы, приложение должно использовать память дополнительного класса с осторожностью. Функция RegisterClassEx завершается ошибкой, если объем запрашиваемой памяти дополнительного класса превышает 40 байт. Если приложению требуется более 40 байт, он должен выделить собственную память и сохранить указатель на память в дополнительной памяти класса.

Функции сетклассворд и сеткласслонг копируют значение в память дополнительного класса. Чтобы получить значение из памяти дополнительного класса, используйте функции жетклассворд и жеткласслонг . Элемент кбклсекстра структуры вндклассекс указывает объем дополнительной памяти класса для выделения. Приложение, которое не использует память дополнительного класса, должно инициализировать элемент кбклсекстра в ноль.

Размер дополнительной памяти окна

Система поддерживает внутреннюю структуру данных для каждого окна. При регистрации класса окна приложение может указать ряд дополнительных байтов памяти, называемых дополнительной памятью окна. При создании окна класса система выделяет и добавляет заданный объем дополнительной памяти окна в конец структуры окна. Приложение может использовать эту память для хранения данных, относящихся к окну.

Поскольку дополнительный объем памяти выделяется из локальной кучи системы, приложение должно использовать лишние окна памяти с осторожностью. Функция RegisterClassEx завершается ошибкой, если объем требуемой дополнительной памяти превышает 40 байт. Если приложению требуется более 40 байт, он должен выделить собственную память и сохранить указатель на память в дополнительной памяти окна.

Функция SetWindowLong копирует значение в лишнюю память. Функция жетвиндовлонг извлекает значение из дополнительной памяти. Элемент кбвндекстра структуры вндклассекс указывает объем дополнительной памяти окна, выделяемой для выделения. Приложение, которое не использует память, должно инициализировать кбвндекстра до нуля.

Прикладная программа, когда создается окно, должна предоставить следующую информацию:

В разделах ниже описываются эти атрибуты.

Программа использует функцию SetWindowText, чтобы изменить имя окна после того, как окно создано. Она использует функции GetWindowTextLength и GetWindowText, чтобы сделать выборку текущего текста имени окна.

Каждое окно имеет один или несколько стилей окна. Стиль окна (window style) - это име-нованная константа, которая определяет аспекты внешнего вида и поведения окна, которые не определяет класс окна. Например, класс SCROLLBAR создает линейку прокрутки, а стили SBS_HORZ и SBS_VERT определяют создание или горизонтальной или вертикальной линейки прокрутки. Несколько стилей окна применяют все окна, но большинство их применяют окна конкретного класса окна. Окна и, до некоторой степени, оконная процедура класса, интерпретируют стили.

Родительское или самостоятельное окно

Окно может иметь родительское окно. Окно, которое имеет родительское окно, называется дочерним окном (child window). Родительское окно (parent window) предоставляет систему координат, которая используется для позиционирования дочернего окна. Наличие родительского окна воздействует на аспекты внешнего вида окна; например, дочернее окно обрезается так, что-бы ни одна часть дочернего окна не могла появиться вне рамок своего родительского окна. Окно, у которого нет родительского окна или родитель которого самое главное окно, называется окном верхнего уровня (top-level window). Прикладная программа использует функцию EnumWindows, чтобы получить дескриптор каждого из своих окон верхнего уровня. Функция EnumWindows, в свою очередь, передает дескриптор каждого окна верхнего уровня в определенную программой функцию повторного вызова EnumWindowsProc.

Окно может иметь или принадлежать другому окну. Находящееся в собственности окно всегда появляется перед окном его владельца, скрывается, когда окно его владельца сворачивается и разрушается, когда окно его владельца разрушается.

Расположение, размер и позиция в Z-последовательности

Каждое окно имеет расположение, размер и позицию в Z-последовательности. Расположение - это координаты верхнего левого угла окна, относительно верхнего левого угла экрана или, в случае дочернего окна, верхнего левого угла рабочей области родителя. Размер окна - это его ширина и высота, измеряемая в пикселях. Позиция окна в Z-последовательности (Z order) - это позиция окна в стеке перекрывающихся окон. Для получения дополнительной информации, см "1.6 Z-последовательность (Z Order)".

Идентификатор Дочернего окна или дескриптор Меню

Дочернее окно может иметь идентификатор дочернего окна (child-window identifier), уникальное значение определенное программой, связанное с дочерним окном. Идентификаторы дочернего окна особенно полезны в прикладных программах, которые создают многочисленные дочерние окна. При создании дочернего окна, прикладная программа определяет идентификатор дочернего окна. После создания окна, прикладная программа может изменять идентификатор окна, используя функцию SetWindowLong, или может отыскать идентификатор, используя функцию GetWindowLong.

Каждое окно, за исключением дочернего окна, может иметь меню. Прикладная программа может включать в себя меню, путем предоставления дескриптора меню, или при регистрации класса окна, или при создании окна.

Дескриптор экземпляра

Каждая базирующаяся на Win32 прикладная программа имеет дескриптор связанного с ней экземпляра. Windows обеспечивает программу дескриптором экземпляра, когда она стартует. Поскольку он может запускать многочисленные копии одной и той же программы, Windows использует дескрипторы экземпляра внутри себя, чтобы отличить один экземпляр прикладной программы из другого. Прикладная программа должна определить дескриптор экземпляра во многих различных окнах, включая и те, которые создаются окнами.

Данные создания

Каждое окно может иметь определяемые программой данные создания, связанные с ней. Когда создано первое окно, Windows передает указатель на данные в оконную процедуру создаваемого окна. Оконная процедура использует эти данные, чтобы инициализировать определяемые программой переменные.

Читайте также: