В настоящей записке описываются MFC подпрограмм, которые регистрируют специальных WNDCLASSes, необходимых в Microsoft Windows. WNDCLASS атрибуты используется MFC и обсуждаются Windows.
Проблема
Атрибуты объекта CWnd , как объект HWND в Windows, хранятся в двух местах: на объект window и WNDCLASS. WNDCLASS — отличается от класса C++. Имя WNDCLASS передается в общем окне Создание таких функций как CWnd::Create и CFrameWnd::Create в параметре lpszClassName.
Это WNDCLASS должны быть зарегистрированы через один из четырех средств:
WNDCLASSes и MFC
WNDCLASS структура состоит из различных областей, которые описывают класс окна. Ниже перечислены поля и как они используются в приложениях MFC.
| Стиль | Стиль окна: см.ниже |
| LpfnWndProc | окно proc, должны быть AfxWndProc |
| CbClsExtra | не используется (должно быть равно нулю) |
| CbWndExtra | не используется (должно быть равно нулю) |
| HInstance | автоматически заполнены с AfxGetInstanceHandle |
| HIcon | значок для фрейма окна, смотрите ниже |
| HCursor | курсор для когда указатель мыши находится над окном, смотрите ниже |
| HbrBackground | цвет фона, смотрите ниже |
| LpszMenuName | не используется (должно быть NULL) |
| LpszClassName | имя класса, см. ниже |
Обеспечивает WNDCLASSes
В предыдущих версиях MFC (до MFC 4.0) был ряд предопределенных классов окон. По умолчанию больше не предоставляются эти классы окон из-за технических проблем, связанных с управлением версиями (несколько версий MFC загружен в одном адресном пространстве), а также проблемы, связанные с тем, что приложения MFC и OLE элементы управления могут использовать библиотеки MFC DLL.
Следующие ссылки позволяет помочь перенести код, использующий эти ранее представленную WNDCLASSes. Приложения должны использовать AfxRegisterWndClass (с соответствующими параметрами) вместо этих классов.
В следующем примере показан классы и их атрибуты:
Если приложение предоставляет ресурс с Идентификатором ID (например, AFX_IDI_STD_FRAME) указанного ресурса, этот ресурс будет использовать MFC. В противном случае используется ресурс по умолчанию. Для значка используется стандартный значок приложения, и для курсора, используется стандартный курсор в виде стрелки.
Существует две иконы с поддержкой приложений MDI с типами единого документа (один значок для главного приложения, значок для знаковых документ/MDIChild windows). Для различных типов документов с различными значками необходимо зарегистрировать дополнительные es WNDCLASSили использовать функцию CFrameWnd::LoadFrame.
CFrameWnd::LoadFrame будет автоматически зарегистрировать WNDCLASS с использованием стандартных атрибутов "AfxFrameOrView", но с помощью значка ID, указании в качестве первого параметра для LoadFrame.
Так как клиентской области MDIFrameWnd полностью покрываются в окне "MDICLIENT" не используются значения для цвета фона и курсор для MDIFrameWnd . Корпорацией Майкрософт не поддерживается использование подклассов в окне «MDICLIENT» так что используйте стандартные цвета и типы курсора, когда это возможно.
Создание подклассов элементов управления
Если вы подкласс или суперкласса Windows (например, CButton) затем Управление ваш класс автоматически получает атрибуты WNDCLASS , в осуществлении этого элемента управления Windows.
Функция AfxRegisterWndClass
MFC предоставляет вспомогательной подпрограмме для регистрации класса окна. Учитывая набор атрибутов (стиль класса окна, курсор, фоновую кисть и значок), синтетические имя создается и регистрируется результирующий класс окна. Например,
const char * AfxRegisterWndClass (UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon)
Эта функция возвращает строку временное имя класса сгенерированный зарегистрированных окна. В разделе Справочник по библиотекам классов для получения более подробной информации.
Возвращаемая строка — это временный указатель на буфер статической строки, которая действует до следующего вызова AfxRegisterWndClass. Если вы хотите сохранить эту строку вокруг, сохраните его в переменной CString . Например,
CStrin&g strWndClass = AfxRegisterWndClass (CS_DBLCLK,...);
...
CWnd * pWnd = новый CWnd;
pWnd-gt;Создание (strWndClass,...);
AfxRegisterWndClass создаст исключение CResourceException , если класс окна не удалось зарегистрировать (из Бад параметров, или из памяти Windows).
RegisterClass и функции AfxRegisterClass
Если вы хотите сделать что-либо более сложным, чем то, что обеспечивает AfxRegisterWndClass , вы можете назвать Windows API RegisterClass или функции MFC AfxRegisterClass. ФункцииCreate CMDIChildWnd CWnd, CFrameWnd и принять имя строки lpszClassName для класса окна в качестве первого параметра. Может использоваться любое имя класса окна, независимо от того, как он был зарегистрирован .
Важно использовать AfxRegisterClass (или AfxRegisterWndClass) в библиотеки DLL на Win32. Win32 автоматически не отменить регистрацию зарегистрированной DLL, так что это должно быть сделано явно когда завершается DLL классов. С помощью AfxRegisterClass вместо RegisterClass этого автоматически для вас. AfxRegisterClass ведет список уникальных классов, зарегистрированной DLL и автоматически отменит регистрацию тогда, когда завершается DLL. При использовании RegisterClass в DLL, необходимо убедиться, что все классы являются незарегистрированными при завершении DLL (в функции DllMain ). Неспособность сделать это может вызвать RegisterClass не неожиданно, когда библиотека DLL используется другим приложением клиента.
Технические примечания по номеру |nbsp; Технические примечания по категориям