Sdílet prostřednictvím


TN001: Registrace tříd oken

Tato poznámka popisuje rutiny MFC, které registrují speciální třídy WNDCLASSpotřebné systémem Microsoft Windows. Probírají se konkrétní WNDCLASS atributy používané prostředím MFC a Windows.

Problém

Atributy objektu CWnd , jako je HWND popisovač ve Windows, jsou uloženy na dvou místech: objekt okna a WNDCLASSobjekt . Název objektu WNDCLASS je předán do obecných funkcí pro vytváření oken, jako jsou CWnd::Create a CFrameWnd::Create v parametru lpszClassName .

Musí WNDCLASS se zaregistrovat prostřednictvím jednoho ze čtyř prostředků:

  • Implicitně pomocí poskytnuté WNDCLASSknihovny MFC .

  • Implicitně podtřídou ovládacího prvku Windows (nebo jiného ovládacího prvku).

  • Explicitně voláním MFC AfxRegisterWndClass nebo AfxRegisterClass.

  • Explicitně zavoláním rutiny RegisterClass systému Windows.

Pole WNDCLASS

Struktura WNDCLASS se skládá z různých polí popisující třídu okna. Následující tabulka ukazuje pole a určuje, jak se používají v aplikaci MFC:

Pole popis
lpfnWndProc okno proc, musí být AfxWndProc
cbClsExtra nepoužívané (mělo by být nula)
cbWndExtra nepoužívané (mělo by být nula)
hInstance automaticky vyplněno AfxGetInstanceHandle
hIcon ikona oken s rámečkem, viz níže
hCursor kurzor pro, pokud je myš nad oknem, viz níže
hbrBackground Barva pozadí, viz níže
lpszMenuName nepoužívané (mělo by mít hodnotu NULL)
lpszClassName název třídy, viz níže

Poskytnuté WNDCLASS

Starší verze MFC (před MFC 4.0) poskytovaly několik předdefinovaných tříd oken. Tyto třídy oken již nejsou ve výchozím nastavení poskytovány. Aplikace by měly používat AfxRegisterWndClass s příslušnými parametry.

Pokud aplikace poskytuje prostředek se zadaným ID prostředku (například AFX_IDI_STD_FRAME), mfc tento prostředek použije. V opačném případě použije výchozí prostředek. Pro ikonu se použije standardní ikona aplikace a pro kurzor se použije standardní kurzor šipky.

Dvě ikony podporují aplikace MDI s jedním typem dokumentu: jedna ikona pro hlavní aplikaci, druhá ikona ikonických dokumentů nebo oken MDIChild. U více typů dokumentů s různými ikonami je nutné zaregistrovat další WNDCLASSprvky nebo použít funkci CFrameWnd::LoadFrame .

CFrameWnd::LoadFrame zaregistruje WNDCLASS pomocí ID ikony, které zadáte jako první parametr, a následující standardní atributy:

  • styl třídy: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • AFX_IDI_STD_FRAME ikon

  • kurzor šipky

  • barva pozadí COLOR_WINDOW

Hodnoty pro barvu pozadí a kurzor pro CMDIFrameWnd se nepoužívají, protože klientská oblast objektu CMDIFrameWnd je zcela pokryta oknem MDICLIENT . Microsoft nepodporuje podtřídu okna MDICLIENT , takže pokud je to možné, používejte standardní barvy a typy kurzorů.

Ovládací prvky podtřídy a nadtřídy

Pokud podtřídu nebo nadtřídu ovládacího prvku Windows (například CButton), pak vaše třída automaticky získá WNDCLASS atributy poskytované v implementaci windows tohoto ovládacího prvku.

Funkce AfxRegisterWndClass

MFC poskytuje pomocnou funkci pro registraci třídy okna. Vzhledem k sadě atributů (styl třídy okna, kurzor, štětec na pozadí a ikona), se vygeneruje syntetický název a výsledná třída okna se zaregistruje. Příklad:

const char* AfxRegisterWndClass(UINT nClassStyle,
    HCURSOR hCursor,
    HBRUSH hbrBackground,
    HICON hIcon);

Tato funkce vrátí dočasný řetězec generovaného názvu třídy registrovaného okna. Další informace o této funkci naleznete v tématu AfxRegisterWndClass.

Vrácený řetězec je dočasný ukazatel na vyrovnávací paměť statického řetězce. Je platný až do dalšího volání AfxRegisterWndClass. Pokud chcete zachovat tento řetězec kolem, uložte ho do proměnné CString , jak je znázorněno v tomto příkladu:

CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);

...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);

...

AfxRegisterWndClassvyvolá výjimku CResourceException, pokud se třídě okna nepodařilo zaregistrovat (z důvodu chybných parametrů nebo z paměti systému Windows).

Funkce RegisterClass a AfxRegisterClass

Pokud chcete udělat cokoliv složitějšího než to, co AfxRegisterWndClass poskytuje, můžete volat rozhraní API RegisterClass systému Windows nebo funkci AfxRegisterClassMFC . Funkce CWnd, CFrameWnd a CMDIChildWndCreate mají lpszClassName název řetězce pro třídu okna jako první parametr. Můžete použít jakýkoli název registrované třídy okna bez ohledu na metodu, kterou jste použili k registraci.

Je důležité použít AfxRegisterClass (nebo AfxRegisterWndClass) v knihovně DLL v systému Win32. Win32 automaticky neregistruje třídy registrované knihovnou DLL, takže je nutné explicitně zrušit registraci tříd při ukončení knihovny DLL. Použití místo AfxRegisterClass RegisterClass toho se automaticky zpracuje za vás. AfxRegisterClass udržuje seznam jedinečných tříd registrovaných knihovnou DLL a automaticky je zruší registraci při ukončení knihovny DLL. Při použití RegisterClass v knihovně DLL je nutné zajistit, aby všechny třídy byly při ukončení knihovny DLL ukončeny (ve funkci DllMain ). Pokud se jiná klientská aplikace pokusí použít vaši knihovnu DLL, může to způsobit RegisterClass neočekávané selhání.

Viz také

Technické poznámky podle čísel
Technické poznámky podle kategorií