Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 obslužný prvek ve Windows, jsou uloženy na dvou místech: v objektu okna a HWND
. 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 jednou ze čtyř možností:
Implicitně pomocí knihovny MFC poskytované
WNDCLASS
.Implicitně subclassováním 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 třídy 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:
Obor | 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, když je ukazatel myši 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é WNDCLASSy
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ší WNDCLASS
prvky 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;
ikona AFX_IDI_STD_FRAME
šipkový kurzor
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ádání podtříd a nadtříd
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 statickou vyrovnávací paměť ř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, ...);
...
AfxRegisterWndClass
vyvolá výjimku CResourceException, pokud se třídě okna nepodařilo zaregistrovat (z důvodu chybných parametrů nebo nedostatku kapacity 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 AfxRegisterClass
MFC . 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. Při použití AfxRegisterClass
místo RegisterClass
se to za vás automaticky vyřeší.
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 odregistrovány (ve funkci DllMain). Pokud toto neučiníte, může dojít k neočekávanému selhání RegisterClass
, když se jiná klientská aplikace pokusí použít vaši knihovnu DLL.
Viz také
Technické poznámky podle čísla
Technické poznámky podle kategorie