TN001: Finestra classe registrazione

Questa nota descrive le routine di MFC registrare l'es WNDCLASSspeciale necessario da Microsoft Windows. Gli attributi specifici di WNDCLASS utilizzati da MFC e Windows sono discusse.

Il problema

Gli attributi di un oggetto CWnd , come un HWND in Windows, vengono archiviati in due punti: l'oggetto window e WNDCLASS. Un WNDCLASS è diverso da una classe C++. Il nome di WNDCLASS viene passato a finestra generale funzioni di creazione, come viene e CFrameWnd::Create nel parametro lpszClassName.

Questo WNDCLASS deve essere registrata tramite uno dei quattro mezzi:

WNDCLASSes e MFC

La struttura WNDCLASS è costituito da vari campi che descrivono una classe finestra. Di seguito sono riportati i campi e come essi sono utilizzati in un'applicazione MFC.

Stile Lo stile della finestra: vedi sotto
LpfnWndProc finestra proc, deve essere AfxWndProc
CbClsExtra non utilizzato (dovrebbe essere pari a zero)
CbWndExtra non utilizzato (dovrebbe essere pari a zero)
HInstance compilato automaticamente con AfxGetInstanceHandle
HIcon icona per le finestre cornice, vedi sotto
HCursor cursore per quando il mouse è sul finestra, vedi sotto
HbrBackground colore di sfondo, vedi sotto
LpszMenuName non utilizzato (dovrebbe essere NULL)
LpszClassName nome della classe, vedi sotto

Fornito WNDCLASSes

Nelle versioni precedenti di MFC (prima di MFC 4.0), c'erano un certo numero di classi di finestre predefinite fornite. Tali classi di finestra non più sono disponibili per impostazione predefinita a causa di problemi tecnici, relativi al controllo delle versioni (più versioni di MFC caricate nello spazio di un indirizzo) così come le preoccupazioni relative al fatto che sia le applicazioni MFC e OLE controlli possono utilizzare DLL MFC.

Il seguente riferimento viene fornito per eseguire la migrazione di codice che utilizza queste precedentemente fornite WNDCLASSes. Le applicazioni devono utilizzare AfxRegisterWndClass (con i parametri appropriati) al posto di queste classi.

Di seguito è riportato le classi e i relativi attributi:

Se l'applicazione fornisce una risorsa con l'ID ID (ad esempio, AFX_IDI_STD_FRAME) di una risorsa specificata, MFC utilizzerà tale risorsa. In caso contrario la risorsa predefinito viene utilizzata. Per l'icona, verrà utilizzata l'icona dell'applicazione standard e per il cursore, viene utilizzato il cursore a freccia standard.

Ci sono due icone che supportano applicazioni MDI con tipi di documento unico (un'icona per l'applicazione principale, l'altra icona per windows iconica documento/MDIChild). Per più tipi di documenti con icone diverse, è necessario registrare ulteriori WNDCLASSes o utilizzare la funzione CFrameWnd::LoadFrame.

CFrameWnd::LoadFrame registrerà automaticamente un WNDCLASS usando gli attributi "AfxFrameOrView" standard ma utilizzando l'icona ID si specifica come primo parametro alla LoadFrame.

I valori di colore di sfondo e il cursore per la MDIFrameWnd non vengono utilizzati dal momento che l'area client della MDIFrameWnd è completamente coperto da finestra "MDICLIENT". Microsoft non incoraggia così sottoclassi finestra "MDICLIENT" utilizzare i tipi di cursore quando possibile e colori standard.

Controlli per la creazione di sottoclassi

Se voi sottoclasse o superclasse un Windows controlla (ad esempio, CButton) quindi la classe automaticamente ottenuti gli attributi WNDCLASS forniti nell'attuazione di tale controllo Windows.

La funzione AfxRegisterWndClass

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

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

Questa funzione restituisce una stringa temporanea del nome della classe generata finestra registrati. Vedere il Riferimento alla libreria di classi per maggiori dettagli.

La stringa restituita è un puntatore temporaneo a un buffer di stringa statici che è valido fino alla successiva chiamata al AfxRegisterWndClass. Se si desidera mantenere questa stringa intorno, archiviarla in una variabile CString . Ad esempio,

CStrin&g strWndClass = AfxRegisterWndClass (CS_DBLCLK,...);
...
CWnd * pWnd = CWnd nuovo;
pWnd-gt;Crea (strWndClass,...);

AfxRegisterWndClass genererà un CResourceException se la classe finestra Impossibile registrare (a causa dei parametri cattivi, o esaurito la memoria di Windows).

Le funzioni di AfxRegisterClass e RegisterClass

Se volete fare qualcosa di più sofisticato di quello che fornisce AfxRegisterWndClass , si può chiamare l'API Windows RegisterClass o la funzione MFC AfxRegisterClass. La CMDIChildWndCreate funzioni CWnd, CFrameWnd e prendono un nome di stringa lpszClassName per la classe di finestra come primo parametro. Qualsiasi nome di classe della finestra può essere utilizzato, indipendentemente da come esso è stato registrato .

È importante utilizzare AfxRegisterClass (o AfxRegisterWndClass) in una DLL di Win32. Win32 non deregistrare automaticamente classi registrate da una DLL, quindi questo deve essere fatto in modo esplicito quando è terminata la DLL. Utilizzando AfxRegisterClass anziché RegisterClass questo viene fatto automaticamente per voi. AfxRegisterClass mantiene un elenco di classi univoche registrato dalla DLL e verrà automaticamente deregistrare poi quando termina la DLL. Quando si utilizza RegisterClass in una DLL, deve assicurare che tutte le classi sono registrate quando la DLL viene terminata (nella funzione DllMain ). In caso contrario può causare RegisterClass a fallire inaspettatamente quando la DLL viene utilizzata da un'altra applicazione client.

&Note tecniche per numero |nbsp; Note tecniche per la categoria

Index