Поделиться через


TN001: регистрация класса окна

Эта заметка описывает процедуры MFC, которые регистрируют специальное WNDCLASS es необходимости Microsoft Windows.Обсуждаются определенные атрибуты, используемые WNDCLASS MFC и окна.

Проблема

Атрибуты объекта CWnd, например маркер HWND в окнах, хранятся в 2 местах: объект окна и WNDCLASS.Имя WNDCLASS передается к общим функциям создания окна, как CWnd::Create и CFrameWnd::Create в параметре lpszClassName.

Это WNDCLASS необходимо зарегистрировать с помощью одного из 4 означает:

  • Неявно с помощью WNDCLASS предоставленного MFC.

  • Неявно с subclassing управления windows (или несколько другого элемента управления).

  • Явно, вызвав MFC AfxRegisterWndClass или AfxRegisterClass.

  • Явно, вызвав программу RegisterClass windows.

Поля WNDCLASS

Структура WNDCLASS состоит из разных полей, которые описывают класса окна.В следующей таблице показаны поля и определяет, как они используются в приложении MFC:

Поле

Описание

lpfnWndProc

proc окна, должно быть AfxWndProc

cbClsExtra

не используется (должен быть равен нулю)

cbWndExtra

не используется (должен быть равен нулю)

hInstance

автоматически заполняется AfxGetInstanceHandle

hIcon

значок окна фрейма см. ниже

hCursor

курсор, если указатель мыши находится над полем см. ниже

hbrBackground

цвет фона см. ниже

lpszMenuName

не используется (NULL)

lpszClassName

имя класса см. в разделах ниже

Предоставленное WNDCLASSes

Более ранние версии MFC (MFC до 4.0), при условии, что несколько предопределенных классов окна.Эти классы окна больше не предоставленного по умолчанию.Приложения должны использовать AfxRegisterWndClass с соответствующими параметрами.

Если приложение предоставляет ресурс с указанным идентификатором ресурса (например, AFX_IDI_STD_FRAME), то MFC будет использовать этот ресурс.В противном случае он будет использоваться по умолчанию ресурс.Для значка стандартный значок приложения, и для курсора, используется стандартный курсор в виде стрелки.

2 Значка поддерживают приложения MDI с отдельными типами документов: один значок для основного приложения, другой значок для иконических документов и windows MDIChild.Для нескольких типов документов с различными значками, необходимо зарегистрировать дополнительные WNDCLASS es или использовать функцию CFrameWnd::LoadFrame.

CFrameWnd::LoadFrame регистрирует WNDCLASS, используя идентификатор значка необходимо указать в качестве первого параметра и следующие стандартные атрибуты:

  • стиль класса: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • значок AFX_IDI_STD_FRAME

  • курсор в виде стрелки

  • Цвет фона COLOR_WINDOW

Не используются значения цвета фона и курсор для CMDIFrameWnd поскольку клиентскую область CMDIFrameWnd полностью покрыта окном MDICLIENT.Корпорация Майкрософт не ободряет subclassing окно MDICLIENT поэтому используйте стандартные цвета и типы курсора, когда это возможно.

Элементы управления Subclassing и Superclassing

Если подкласс или контролировать суперкласс окна (например, CButton), то класс автоматически получает атрибуты WNDCLASS предоставляется в реализации окон этого элемента управления.

Функция AfxRegisterWndClass

MFC обеспечивает вспомогательную функцию для регистрации класса окна.Если задан набор атрибутов (стиля класса окна, курсора, кисти фона и значков), создается синтетическое имя, а результирующий класс окна зарегистрирован.Например:

const char* AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon);

Эта функция возвращает временной строку созданного зарегистрированного имени класса окна.Дополнительные сведения об этой функции см. в разделе AfxRegisterWndClass.

Возвращаемая строка статический временный указатель на буфер строк.Это допустимо до следующего вызова AfxRegisterWndClass.Если нужно сохранить эту строку, храните вокруг его в переменной CString, как показано в следующем примере:

CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...

AfxRegisterWndClass вызовет CResourceException если класс окна не удалось зарегистрировать (или из-за плохих параметров или недостаточно памяти windows).

Функции RegisterClass и AfxRegisterClass

Если нужно делать что-либо более изощрять меньше, AfxRegisterWndClass, можно вызвать функцию API RegisterClass windows или функция AfxRegisterClass MFC.CWnd, функции CFrameWnd и CMDIChildWndCreate принимают имя строки lpszClassName для класса окна в качестве первого параметра.Можно использовать любое зарегистрированное имя класса окна, независимо от метода используется для регистрации.

Важно использовать AfxRegisterClass (или AfxRegisterWndClass) в библиотеке DLL в Win32.Win32 позволяет не зарегистрированные классы отмены регистрации dll-библиотеки, поэтому необходимо явно классы отмены регистрации dll-библиотеки, когда прекращается.С помощью AfxRegisterClass вместо RegisterClass это обрабатывается автоматически.AfxRegisterClass ведет список уникальных классов, зарегистрированных в библиотеку DLL и автоматически отмены регистрации dll-библиотеки их, когда завершается.При использовании RegisterClass в библиотеке DLL, необходимо убедиться, что все классы удалены, когда библиотека DLL прекращается (в функции DllMain ).Невыполнение этого требования может вызвать непредвиденное RegisterClass завершиться ошибкой, если другое клиентское приложение пытается использовать библиотеки DLL.

См. также

Другие ресурсы

Технические замечания по номеру

Технические замечания по категориям