Condividi tramite


TN003: Mappe degli handle di Windows a oggetti

Questa nota vengono descritte le routine MFC che supportano gli handle di windows del mapping agli oggetti C++.

Il problema

Gli oggetti di windows in genere sono rappresentati da vari oggetti di HANDLE un handle di windows del wrapping delle classi MFC con C++ oggetto.Le funzioni del wrapping di handle della libreria di classi MFC consentono di trovare l'oggetto C++ che esegue il wrapping delle finestre dell'oggetto che ha un handle particolari.Talvolta, un oggetto non ha oggetto wrapper C++ e ai tempi il sistema crea un oggetto temporaneo che funge da wrapper di C++.

Le finestre degli oggetti che le mappe di handle di utilizzo sono le seguenti:

  • HWND (CWnd e CWnddi classi derivate)

  • HDC (CDC e CDCdi classi derivate)

  • HMENU (CMenu)

  • HPEN (CGdiObject)

  • HBRUSH (CGdiObject)

  • HFONT (CGdiObject)

  • HBITMAP (CGdiObject)

  • HPALETTE (CGdiObject)

  • TIPO (CGdiObject)

  • HIMAGELIST (CImageList)

  • SOCKET (CSocket)

Fornito un handle a uno qualsiasi di questi oggetti, è possibile trovare l'oggetto MFC che esegue il wrapping di un handle chiamando il metodo statico FromHandle.Ad esempio, dato un HWND ha chiamato hWnd, la riga seguente restituisce un puntatore a CWnd che esegue il wrapping hWnd:

CWnd::FromHandle(hWnd)

Se hWnd non dispone di un oggetto specifico del wrapper, CWnd temporaneo viene creato per eseguire il wrapping hWnd.Ciò consente di ottenere un oggetto C++ valido da tutti gli handle.

Dopo avere un oggetto wrapper, è possibile recuperare le relative handle da una variabile membro pubblico della classe wrapper.Nel caso di CWnd, m_hWnd contiene HWND per tale oggetto.

Allegare un handle agli oggetti MFC

Dato un oggetto appena creato il handle-wrapper e handle alle finestre oggetto, è possibile associare i due chiamando la funzione di Attach come nel seguente esempio:

CWnd myWnd;
myWnd.Attach(hWnd);

Questa è una voce nella mappa permanente che associa myWnd e hWnd.Chiamando CWnd::FromHandle(hWnd) ora restituisce un puntatore a myWnd.Quando myWnd viene eliminato, il distruttore automaticamente distrutto hWnd chiamando la funzione di DestroyWindow di windows.Se ciò non è previsto, hWnd deve essere rimosso da myWnd prima di myWnd venga eliminato in genere quando let l'ambito a cui myWnd è definito).Il metodo di Detach tale operazione.

myWnd.Detach();

Ulteriori informazioni sugli oggetti temporanei

Gli oggetti temporanei vengono creati ogni volta che FromHandle viene fornito un handle che già di un oggetto wrapper.Questi oggetti temporanei vengono rimossi dal relativo handle ed eliminate da funzioni di DeleteTempMap .Per impostazione predefinita CWinThread::OnIdle chiama automaticamente DeleteTempMap per ogni classe che supporta le mappe temporanee di handle.Ciò significa che non è possibile presupporre che un puntatore a un oggetto temporaneo sarà valido dopo il punto uscita dalla funzione in cui il puntatore è stato ottenuto.

Oggetti e thread del wrapper

Sia gli oggetti temporanei che permanenti sono gestiti in base ai singoli thread.Ovvero un thread non può accedere agli oggetti wrapper di C++ di un altro thread, indipendentemente dal fatto che è temporaneo o permanente.

Per passare questi oggetti da un thread a un altro, successivo invio sempre come tipo nativo di HANDLE .Passando l'oggetto wrapper C++ da un thread a un altro determina spesso risultati imprevisti.

Vedere anche

Altre risorse

Note tecniche del numero

Note tecniche per categoria