TN001: Registrazione della classe della finestra
Questa nota vengono descritte le routine MFC che registrano WNDCLASSspeciale es necessario Microsoft Windows.Gli attributi specifici di WNDCLASS utilizzati da MFC e le finestre vengono illustrati.
Il problema
Gli attributi di CWnd oggetto, quali gli handle di HWND in windows, vengono archiviati in due modi: l'oggetto della finestra e WNDCLASS.Il nome di WNDCLASS viene passato alle funzioni generali di creazione della finestra come CWnd::Create e CFrameWnd::Create nel parametro di lpszClassName .
Questo WNDCLASS deve essere registrato con uno dei quattro modi:
In modo implicito utilizzando WNDCLASSfornito MFC.
In modo implicito dalla creazione di una sottoclasse un controllo Windows (o un altro controllo.
Chiamare in modo esplicito MFC AfxRegisterWndClass o AfxRegisterClass.
Chiamare in modo esplicito la routine RegisterClassdi windows.
Campi WNDCLASS
La struttura di WNDCLASS è costituito da diversi campi che descrivono una classe della finestra.Nella tabella seguente vengono elencati i campi e specifica come vengono utilizzati in un'applicazione MFC:
Campo |
Descrizione |
---|---|
lpfnWndProc |
la routine della finestra, deve essere AfxWndProc |
cbClsExtra |
non utilizzato (deve essere zero) |
cbWndExtra |
non utilizzato (deve essere zero) |
hInstance |
automaticamente inserito AfxGetInstanceHandle |
hIcon |
l'icona per le applicazioni utilizzano, vedere in |
hCursor |
il cursore per quando il mouse si trova sulla finestra, vedere in |
hbrBackground |
il colore di sfondo, vedere in |
lpszMenuName |
non utilizzato (deve essere NULL) |
lpszClassName |
il nome della classe, vedere in |
WNDCLASSes fornito
Versioni precedenti di MFC (prima di MFC 4,0), se alcune classi di finestre predefinite.Queste classi di finestre non sono più disponibili per impostazione predefinita.Le applicazioni devono utilizzare AfxRegisterWndClass con i parametri appropriati.
Se l'applicazione fornisce una risorsa con ID di risorsa specificato (ad esempio, AFX_IDI_STD_FRAME), MFC utilizzerà tale risorsa.In caso contrario verrà utilizzata la risorsa predefinita.Per l'icona, dell'applicazione standard è utilizzata e per il cursore, il cursore standard della freccia viene utilizzato.
Due icone supportano le applicazioni MDI con i tipi di documento: un'icona per l'applicazione principale, l'altra icona per il documento in formato di icona/finestre di MDIChild.Per i tipi di documento con icone diverse, è necessario registrare WNDCLASSaggiuntivo di oggetti oppure utilizzare la funzione di CFrameWnd::LoadFrame .
CFrameWnd::LoadFrame registrerà WNDCLASS utilizzando l'icona ID specificato come primo parametro e i seguenti attributi standard:
stile della classe: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
icona AFX_IDI_STD_FRAME
cursore della freccia
Colore di sfondo di COLOR_WINDOW
I valori per colore di sfondo e il cursore per CMDIFrameWnd non vengono utilizzati poiché l'area client di CMDIFrameWnd completamente analizzata dalla finestra MDICLIENT .Microsoft non invita la creazione di una sottoclasse la finestra MDICLIENT in modo da utilizzare i colori e tipi standard del cursore quando possibile.
Creazione di una sottoclasse e controlli di una superclasse
Se sottoclasse o rendere superclasse un controllo Windows (ad esempio, CButton) quindi la classe si ottiene automaticamente gli attributi di WNDCLASS forniti nell'implementazione delle finestre di tale controllo.
La funzione di AfxRegisterWndClass
MFC offre una funzione di supporto per registrare una classe della finestra.A partire da un set di attributi e stile della classe della finestra, cursore, pennello per lo sfondo e l'icona), un nome sintetico viene generato l'evento e la classe della finestra risultante viene registrata.Di seguito è riportato un esempio:
const char* AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon);
Questa funzione restituisce una stringa temporanea del nome della classe della finestra registrato generato.Per ulteriori informazioni su questa funzione, vedere AfxRegisterWndClass.
La stringa restituita è un puntatore temporaneo a un buffer di stringa statico.È valida fino alla chiamata successiva a AfxRegisterWndClass.Se si desidera mantenere questa stringa in, archiviarle in una variabile di CString , come nel seguente esempio:
CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...
AfxRegisterWndClass genererà CResourceException se la classe della finestra non riesce per registrare (a causa dei parametri errati, o dalla memoria di windows.
Le funzioni di AfxRegisterClass e di RegisterClass
Se si desidera eseguire qualsiasi operazione sofisticato di che fornisce AfxRegisterWndClass , è possibile chiamare l'API Windows RegisterClass o la funzione AfxRegisterClassMFC.CWnd, le funzioni di CMDIChildWnde di CFrameWndCreate accettano un nome di stringa di lpszClassName della classe della finestra come primo parametro.È possibile utilizzare qualsiasi nome della classe della finestra registrato, indipendentemente dal metodo utilizzato per la registrazione.
È importante utilizzare AfxRegisterClass (o AfxRegisterWndClass) in una DLL in Win32.In Win32 automaticamente non annulla la registrazione le classi registrate da una DLL, pertanto è necessario specificare in modo esplicito annullare la registrazione di classi quando la DLL viene terminato.Utilizzando AfxRegisterClass anziché RegisterClass questo viene gestito automaticamente automaticamente.AfxRegisterClass gestisce un elenco di classi univoche registrate dalla DLL viene automaticamente annullerà la registrazione durante la DLL termina.Quando si utilizza RegisterClass in una DLL, è necessario assicurarsi che tutte le classi sono si annulla la registrazione quando la DLL viene terminato (nella funzione di DllMain ).L'errore a tale scopo può accadere che RegisterClass l'esito negativo in modo imprevisto quando un'altra applicazione client tenta di utilizzare la DLL.