Questa nota descrive la MFC le routine che supportano Windows di mappatura oggetto handle a oggetti C++.
Il problema
Oggetti di Windows normalmente sono rappresentati da gestires. Le classi MFC avvolgono maniglie oggetto Windows con oggetti C++. Le funzioni di avvolgimento handle della libreria di classi MFC forniscono un modo per trovare l'oggetto C++ che esegue il wrapping dell'oggetto Windows con un manico in particolare. Ci sono volte che quando un oggetto Windows non è un oggetto wrapper C++, tuttavia e in questi periodi che di agire come il wrapper C++ viene creato un oggetto temporaneo.
Gli oggetti di Windows che utilizzano handle mappe sono:
Dato un handle ad uno qualsiasi di questi oggetti, è possibile trovare l'oggetto MFC che avvolge l'handle chiamando la funzione membro statico FromHandle. Ad esempio, dato un HWND hWnd di chiamata:
CWnd::FromHandle(hWnd)
restituisce un puntatore alla CWnd che avvolge l' hWnd. Se tale hWnd non dispone di un oggetto wrapper specifico, una temporanea CWnd viene creata per avvolgere l' hWnd. Questo rende possibile per ottenere un oggetto C++ valido da un punto di manipolazione.
Una volta che hai un oggetto wrapper, arriva alla sua maniglia attraverso una variabile membro pubblico. Nel caso di un CWnd, m_hWnd contiene l' HWND per quell'oggetto.
Associare maniglie agli oggetti MFC
Dato un oggetto appena creato handle-wrapper e un handle a un oggetto di Windows, è possibile associare i due chiamando Attach. Ad esempio:
CWnd myWnd;
myWnd.Attach(hWnd)
In questo modo una voce nella mappa permanente l'associazione myWnd e hWnd. Chiamata CWnd::FromHandle(hWnd) ora restituisce un puntatore a myWnd. Quando myWnd viene eliminato, il distruttore automaticamente distruggerà l'hWnd chiamando la funzione di Windows DestroyWindow . Se questo non è desiderato, l' hWnd deve essere staccata dal myWnd prima che l'oggetto myWnd è distrutto (normalmente quando lasciando l'ambito in cui myWnd è stato definito). La funzione membro Detach fa questo.
myWnd.Detach()
Di più su oggetti temporanei
Oggetti temporanei vengono creati ogni volta che FromHandle è dato un handle che non dispone già di un oggetto wrapper. Questi oggetti temporanei sono staccati dal loro maniglia e cancellati dalle funzioni di DeleteTempMap . L'elaborazione di OnIdle predefinito in CWinThread chiama automaticamente DeleteTempMap per ogni classe che supporta mappe handle temporanea. Ciò significa che voi non può assumere che un puntatore a un oggetto temporaneo sarà valido oltre il punto di uscita dalla funzione dove il puntatore è stato ottenuto, come l'oggetto temporaneo sarà eliminata durante il tempo di inattività del ciclo di messaggi di Windows.
Oggetti wrapper e thread multipli
Oggetti temporanei e permanenti sono mantenuti su una base per thread. Che è, un thread non può accedere a un altro thread oggetti wrapper C++, indipendentemente sia temporanea o permanente. Come detto sopra, oggetti temporanei vengono eliminati quando il thread che appartiene a quell'oggetto temporaneo entra nel OnIdle.
Per passare questi oggetti da un thread a altro, sempre inviare loro come loro nativa di gestire digitare. Passando un oggetto wrapper C++ da un thread a altro spesso si tradurrà in risultati imprevisti.
&Note tecniche per numero |nbsp; Note tecniche per la categoria