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.