TN001: Вікно реєстрації класів

Цієї записці описується MFC процедур, які зареєструвати спеціальні WNDCLASSes, які необхідні для Microsoft Windows. Конкретні WNDCLASS атрибути використовують MFC і обговорюються Windows.

Проблема

Атрибути об'єкта CWnd , як HWND у Windows, зберігаються у двох місцях: у вікні об'єкта і WNDCLASS. WNDCLASS відрізняється від C++-класів. Ім'я WNDCLASS передається до загального вікно створення таких функцій, як CWnd::Create і CFrameWnd::Create в параметрі lpszClassName.

Цей WNDCLASS повинні бути зареєстровані через одного з чотирьох засоби:

WNDCLASSes і MFC

WNDCLASS структура, що складається з різних поля, які описують клас вікна. Нижче наведені поля, і як вони використовуються в застосунку MFC.

Стиль Стиль вікна: див. нижче
LpfnWndProc вікно proc, має бути AfxWndProc
CbClsExtra не використовується (має бути нуль)
CbWndExtra не використовується (має бути нуль)
HInstance автоматично заповнені з AfxGetInstanceHandle
HIcon значок для кадру windows, див. нижче
HCursor курсор для коли миші знаходиться на вікні, див. нижче
HbrBackground колір тла, див. нижче
LpszMenuName не використовується (має бути NULL)
LpszClassName ім'я класу, див. нижче

Умови WNDCLASSes

У попередніх версіях MFC (до MFC 4.0) цілий ряд попередньо класи вікон, які надаються. Ці класи вікон більше не надаються за промовчанням з-за технічних проблем, пов'язаних з керування версіями (декілька версій MFC завантажуються в одному адресному просторі), а також проблем, пов'язаних з тим, що MFC додатків і елементи керування OLE може використовувати MFC DLL.

Такі посилання надаються допомогти міграція коду, що використовує ці раніше умови WNDCLASSes. Застосунки повинні використовувати AfxRegisterWndClass (з відповідними параметрами) місце в цих класів.

Нижче показано класів та їх атрибутів:

Якщо додаток забезпечує ресурс з вказаний ресурс ID ID (наприклад, AFX_IDI_STD_FRAME), MFC буде використовувати цей ресурс. Інакше ресурс за промовчанням використовується. Піктограми використовується значок стандартні програми, і курсор, використовується стандартний стрілку курсору.

Є дві ікони, які підтримують MDI додатків з одного документа типів (один значок для основного, інші значок windows знакових документа/MDIChild). Для кількох типів документів з різних іконок слід зареєструвати додаткові WNDCLASSes або скористайтеся функцією CFrameWnd::LoadFrame.

CFrameWnd::LoadFrame буде автоматично реєструвати WNDCLASS використовують стандартні атрибути "AfxFrameOrView", але використовуючи значок ID, що ви вказати як перший параметр для LoadFrame.

Значення кольору фону і курсор для MDIFrameWnd не використовуються після клієнтської області MDIFrameWnd повністю покривається вікна "MDICLIENT". Microsoft не заохочує так subclassing "MDICLIENT" вікно за допомогою стандартних кольорів і типів курсора, коли це можливо.

Subclassing елементи керування

Якщо ви підкласу або суперкласу Windows керування (наприклад, CButton) тоді ваш клас автоматично отримує WNDCLASS атрибутів у реалізації Windows цього елемента керування.

AfxRegisterWndClass функції

MFC забезпечує звичайної Помічник реєстрації клас вікна. Дали набір атрибутів (клас стиль вікна, курсор, фон пензля та значок), синтетичних ім'я генерується і зареєстрована в результаті клас вікна. Наприклад,

константа 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. CWnd, CFrameWnd і CMDIChildWndфункціїСтворення прийняти lpszClassName рядок ім'я клас вікна як перший параметр. Будь-яке ім'я класу вікна використовуються, незалежно від того, як був зареєстрований .

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

Технічні примітки за номером |nbsp; Технічні примітки за категоріями

Index