Dela via


TN003: Mappning av Windows-handtag till objekt

Den här anteckningen beskriver de MFC-rutiner som stöder mappning av Windows-objekthandtag till C++-objekt.

Problemet

Windows-objekt representeras vanligtvis av olika HANDLE-objekt MFC-klasserna omsluter Windows-objekthandtag med C++-objekt. Med funktioner för inpackning av handtag i MFC-klassbiblioteket kan du hitta C++-objektet som omger Windows-objektet som har ett visst handtag. Ibland har dock ett objekt inte ett C++-omslutningsobjekt och vid dessa tillfällen skapar systemet ett tillfälligt objekt som fungerar som C++-omslutning.

Windows-objekten som använder handtagkartor är följande:

  • HWND (CWnd- och CWnd-härledda klasser)

  • HDC (CDC - och CDC-härledda klasser)

  • HMENU (CMenu)

  • HPEN (CGdiObject)

  • HBRUSH (CGdiObject)

  • HFONT (CGdiObject)

  • HBITMAP (CGdiObject)

  • HPALETTE (CGdiObject)

  • HRGN (CGdiObject)

  • HIMAGELIST (CImageList)

  • SOCKET (CSocket)

Med ett handtag för något av dessa objekt kan du hitta MFC-objektet som omsluter handtaget genom att anropa den statiska metoden FromHandle. Till exempel, givet en HWND med namnet hWnd, kommer följande rad att returnera en pekare till CWnd som omsluter hWnd:

CWnd::FromHandle(hWnd)

Om hWnd inte har något specifikt omslutningsobjekt skapas ett tillfälligt CWnd objekt för att omsluta hWnd. Detta gör det möjligt att hämta ett giltigt C++-objekt från valfritt handtag.

När du har ett omslutningsobjekt kan du från en offentlig medlemsvariabel i omslutningsklassen hämta dess handtag. När det gäller en CWndinnehåller m_hWnd HWND för objektet.

Fästa handtag på MFC-objekt

Med tanke på ett nyligen skapat handtagsskyddsobjekt och ett handtag till ett Windows-objekt kan du, som i det här exemplet, associera de två genom att anropa Attach-funktionen.

CWnd myWnd;
myWnd.Attach(hWnd);

Detta gör en post i den permanenta kartan som associerar myWnd och hWnd. Anropet CWnd::FromHandle(hWnd) returnerar nu en pekare till myWnd. När myWnd tas bort förstör destruktorn automatiskt hWnd genom att anropa funktionen Windows DestroyWindow . Om detta inte är önskat måste hWnd kopplas bort från myWnd innan myWnd förstörs (normalt när du lämnar det omfång där myWnd definierades). Metoden Detach gör detta.

myWnd.Detach();

Mer om temporära objekt

Temporära objekt skapas när FromHandle ges en referens som inte redan har ett omslutningsobjekt. Dessa temporära objekt kopplas från handtaget och tas bort av DeleteTempMap funktionerna. Som standardinställning anropar CWinThread::OnIdle automatiskt DeleteTempMap för varje klass som stöder temporära handtagskartor. Det innebär att du inte kan anta att en pekare till ett tillfälligt objekt är giltig förbi slutpunkten från funktionen där pekaren hämtades.

Omslutningsobjekt och flera trådar

Både temporära och permanenta objekt underhålls per tråd. En tråd kan alltså inte komma åt en annan tråds C++-omslutningsobjekt, oavsett om den är tillfällig eller permanent.

Om du vill skicka dessa objekt från en tråd till en annan skickar du dem alltid som deras interna HANDLE typ. Att skicka ett C++-omslutningsobjekt från en tråd till en annan leder ofta till oväntade resultat.

Se även

tekniska anteckningar efter nummer
tekniska anteckningar efter kategori