TN001: registrazione delle classi di finestre

Questa nota descrive le routine MFC che registrano gli elementi WNDCLASSspeciali necessari per Microsoft Windows. Vengono illustrati attributi specifici WNDCLASS usati da MFC e Windows.

Problema

Gli attributi di un oggetto CWnd, come un HWND handle in Windows, vengono archiviati in due posizioni: l'oggetto finestra e .WNDCLASS Il nome dell'oggetto WNDCLASS viene passato alle funzioni generali di creazione della finestra, ad esempio CWnd::Create e CFrameWnd::Create nel parametro lpszClassName .

Questa WNDCLASS operazione deve essere registrata tramite uno dei quattro mezzi seguenti:

  • In modo implicito usando un MFC fornito WNDCLASS.

  • In modo implicito sottoclassando un controllo Windows (o un altro controllo).

  • In modo esplicito chiamando MFC AfxRegisterWndClass o AfxRegisterClass.

  • In modo esplicito chiamando la routine RegisterClass di Windows.

Campi WNDCLASS

La WNDCLASS struttura è costituita da vari campi che descrivono una classe finestra. La tabella seguente illustra i campi e specifica come vengono usati in un'applicazione MFC:

Campo Descrizione
lpfnWndProc window proc, deve essere un AfxWndProc
cbClsExtra non usato (deve essere zero)
cbWndExtra non usato (deve essere zero)
Hinstance compilato automaticamente con AfxGetInstanceHandle
hIcon icona per le finestre cornice, vedere di seguito
hCursor cursore per quando il mouse è posizionato sulla finestra, vedere di seguito
hbrBackground colore di sfondo, vedere di seguito
lpszMenuName non usato (deve essere NULL)
lpszClassName nome della classe, vedere di seguito

WNDCLASSes forniti

Nelle versioni precedenti di MFC (prima di MFC 4.0), sono disponibili diverse classi Window predefinite. Queste classi Window non vengono più fornite per impostazione predefinita. Le applicazioni devono usare AfxRegisterWndClass con i parametri appropriati.

Se l'applicazione fornisce una risorsa con l'ID risorsa specificato (ad esempio, AFX_IDI_STD_FRAME), MFC userà tale risorsa. In caso contrario, userà la risorsa predefinita. Per l'icona viene usata l'icona dell'applicazione standard e per il cursore viene usato il cursore freccia standard.

Due icone supportano applicazioni MDI con singoli tipi di documento: un'icona per l'applicazione principale, l'altra icona per le finestre iconiche document/MDIChild. Per più tipi di documento con icone diverse, è necessario registrare altri WNDCLASSes o usare la funzione CFrameWnd::LoadFrame .

CFrameWnd::LoadFrame registrerà un WNDCLASS oggetto usando l'ID icona specificato come primo parametro e gli attributi standard seguenti:

  • stile classe : CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • icona AFX_IDI_STD_FRAME

  • cursore freccia

  • COLOR_WINDOW colore di sfondo

I valori per il colore di sfondo e il cursore per CMDIFrameWnd non vengono usati perché l'area client di CMDIFrameWnd è completamente coperta dalla finestra MDICLIENT . Microsoft non incoraggia la sottoclasse della finestra MDICLIENT , quindi usare i colori standard e i tipi di cursore quando possibile.

Sottoclasse e controlli di superclasse

Se sottoclassi o superclassi un controllo Windows ,ad esempio CButton, la classe ottiene automaticamente gli WNDCLASS attributi forniti nell'implementazione di Windows di tale controllo.

Funzione AfxRegisterWndClass

MFC fornisce una funzione helper per la registrazione di una classe window. Dato un set di attributi (stile della classe finestra, cursore, pennello di sfondo e icona), viene generato un nome sintetico e viene registrata la classe della finestra risultante. Ad esempio,

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

Questa funzione restituisce una stringa temporanea del nome della classe della finestra registrata generata. Per altre informazioni su questa funzione, vedere AfxRegisterWndClass.

La stringa restituita è un puntatore temporaneo a un buffer stringa statico. È valido fino alla chiamata successiva a AfxRegisterWndClass. Se si vuole mantenere questa stringa, archiviarla in una variabile CString , come in questo esempio:

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

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

...

AfxRegisterWndClass genererà un'eccezione CResourceException se la classe window non è riuscita a eseguire la registrazione (a causa di parametri non valido o memoria insufficiente di Windows).

Funzioni RegisterClass e AfxRegisterClass

Se vuoi eseguire operazioni più sofisticate rispetto a quelle AfxRegisterWndClass fornite, puoi chiamare l'API RegisterClass Windows o la funzione AfxRegisterClassMFC . Le CWndfunzioni , CFrameWnd e CMDIChildWndCreate accettano un nome di stringa lpszClassName per la classe window come primo parametro. È possibile usare qualsiasi nome di classe della finestra registrata, indipendentemente dal metodo usato per registrarlo.

È importante usare AfxRegisterClass (o AfxRegisterWndClass) in una DLL in Win32. Win32 non annulla automaticamente la registrazione delle classi registrate da una DLL, pertanto è necessario annullare esplicitamente la registrazione delle classi quando la DLL viene terminata. L'uso AfxRegisterClass invece di RegisterClass questo viene gestito automaticamente. AfxRegisterClass mantiene un elenco di classi univoche registrate dalla DLL e le annulla automaticamente al termine della DLL. Quando si usa RegisterClass in una DLL, è necessario assicurarsi che tutte le classi vengano annullate quando la DLL viene terminata (nella funzione DllMain ). In caso contrario, potrebbe verificarsi RegisterClass un errore imprevisto quando un'altra applicazione client tenta di usare la DLL.

Vedi anche

Note tecniche per numero
Note tecniche per categoria