Sdílet prostřednictvím


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.

Viz také

Další zdroje

Technické poznámky podle čísla

Technické poznámky podle kategorie