TN001: Registrace třídy okna
Tato poznámka popisuje MFC rutin, které registrují zvláštní WNDCLASSNo potřebné systému Microsoft Windows.Zvláštní WNDCLASS jsou uvedeny atributy MFC a systému Windows.
Problém
Atributy CWnd jako objekt HWND zpracování v systému Windows, jsou uloženy na dvou místech: objektu okna a WNDCLASS.Název WNDCLASS je předán do funkce vytvoření Obecné okna jako CWnd::Create a CFrameWnd::Create v lpszClassName parametr.
Tento WNDCLASS musí být registrována přes jedno ze čtyř prostředky:
Implicitně pomocí MFC, podle WNDCLASS.
Implicitně pomocí subclassing řízení systému Windows (nebo jiného ovládacího prvku).
Explicitně voláním jednotka MFC AfxRegisterWndClass nebo AfxRegisterClass.
Explicitně voláním rutiny systému Windows RegisterClass.
Pole WNDCLASS
WNDCLASS Struktura se skládá z různých polí, které popisují třídu okna.Následující tabulka uvádí pole a určuje, jak jsou použity v aplikaci MFC:
Pole |
Description |
---|---|
lpfnWndProc |
musí být proc oknoAfxWndProc |
cbClsExtra |
Nepoužito (musí být nula) |
cbWndExtra |
Nepoužito (musí být nula) |
hInstance |
automaticky vyplněnoAfxGetInstanceHandle |
hIcon |
Níže naleznete ikonu rám okna |
hCursor |
kurzor při myši přes okno, viz níže |
hbrBackground |
Barva pozadí, viz níže |
lpszMenuName |
Nepoužito (má být NULL) |
lpszClassName |
název třídy, viz níže |
Podle WNDCLASSes
Starší verze MFC (před MFC 4.0) k dispozici několik předdefinovaných tříd okna.Tyto třídy okna se již nadále ve výchozím nastavení.Aplikace by měly používat AfxRegisterWndClass s příslušnými parametry.
Pokud aplikace poskytuje prostředek s ID prostředku (například AFX_IDI_STD_FRAME), MFC bude používat tento prostředek.Jinak bude používat výchozí zdroj.Používá standardní aplikace ikonu na ikonu a kurzor, je použita standardní šipka kurzoru.
Dvě ikony Podpora MDI aplikací s typy jediného dokumentu: jedna ikona pro hlavní aplikace, na ikonu pro windows ikony dokumentu/MDIChild.Pro více typů dokumentů s různými ikony musíte zaregistrovat Další WNDCLASSes nebo použití CFrameWnd::LoadFrame funkce.
CFrameWnd::LoadFramebude registrovat WNDCLASS pomocí ID ikony určíte jako první parametr a standardní následující atributy:
Třída styl: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
Ikona AFX_IDI_STD_FRAME
šipka kurzoru
Barva pozadí COLOR_WINDOW
Hodnoty pro barvu pozadí a kurzor CMDIFrameWnd od oblasti klienta není použito CMDIFrameWnd zcela vztahuje MDICLIENT okna.Společnost Microsoft nedoporučuje vytváření podtříd MDICLIENT okna tak, aby pomocí standardních barev a typů kurzor, pokud je to možné.
Vytváření podtříd a ovládací prvky Superclassing
Pokud je podtřídou nebo nadřazené třídy Windows prvek (například CButton) pak automaticky získá třídy WNDCLASS atributy v provádění ovládací prvek systému Windows.
Funkce AfxRegisterWndClass
Poskytuje pomocné funkce MFC registrace třídy okna.Uvedena sada atributů (třída styl okna, kurzor, štětec pozadí a ikony), syntetická název generovaný a výsledné třídy okna je registrována.Příklad:
const char* AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon);
Tato funkce vrací řetězec dočasný název třídy registrované generované okno.Další informace o této funkci naleznete v tématu AfxRegisterWndClass.
Vrácený řetězec je dočasné ukazatel do vyrovnávací paměti statické řetězec.Je platné až při příštím volání na AfxRegisterWndClass.Pokud chcete zachovat tento řetězec kolem, uložte jej v CString proměnné, jako v následujícím příkladu:
CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...
AfxRegisterWndClassvyvolají CResourceException -li třída okna se nepodařilo zaregistrovat (z důvodu chybné parametry, nebo paměti systému Windows).
RegisterClass a AfxRegisterClass funkce
Pokud chcete udělat nic více sofistikované než co AfxRegisterWndClass poskytuje mohou volat rozhraní API systému Windows RegisterClass nebo funkce MFC AfxRegisterClass.CWnd, CFrameWnd a CMDIChildWndCreate funkcí lpszClassName název třídy okna jako první parametr řetězec.Můžete použít libovolný název třídy registrované okna, bez ohledu na metodu, kterou používá jej zaregistrovat.
Je důležité použít AfxRegisterClass (nebo AfxRegisterWndClass) v knihovně DLL v systému Win32.Win32 není automaticky registraci třídy registrované DLL, tak při ukončení DLL musí výslovně unregister tříd.Pomocí AfxRegisterClass namísto RegisterClass to je zpracována automaticky za vás.AfxRegisterClassudržuje seznam jedinečných třídy registrované knihovny DLL a bude automaticky registraci je při ukončení knihovny DLL.Při použití RegisterClass v knihovně DLL musí zajistit, že jsou všechny třídy neregistrované při ukončení DLL (ve vaší DllMain funkci).Tak může dojít k RegisterClass neočekávané selhání při jiné klientské aplikace pokusí použít knihovny DLL.