Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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