Condividi tramite


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.

Vedere anche

Altre risorse

Note tecniche del numero

Note tecniche per categoria