TN003: Mapowanie systemu Windows obsługuje do obiektów
Uwaga ta opisuje MFC procedur, które obsługują mapowanie systemu Windows obiektu uchwytów do obiektów C++.
Problem
Obiekty systemu Windows zazwyczaj są reprezentowane przez różne obsługi obiekty klas The MFC Zawijaj uchwytów do obiektów systemu Windows z obiektami C++.Uchwyt zawijania funkcje biblioteki klas MFC pozwalają znaleźć obiekt C++, który jest otaczanie obiektu Windows, który ma określonego dojścia.Jednak czasami obiekt nie ma obiektu opakowującego C++ i w tych godzinach system tworzy tymczasowy obiekt jako otoka C++.
Obiektów systemu Windows, które używają uchwyt mapy są następujące:
HWND (CWnd i CWnd-klasy pochodne)
HDC (CDC i CDC-klasy pochodne)
HMENU (CMenu)
HPEN (CGdiObject)
HBRUSH (CGdiObject)
HFONT (CGdiObject)
HBITMAP (CGdiObject)
HPALETTE (CGdiObject)
HRGN (CGdiObject)
HIMAGELIST (CImageList)
GNIAZDO (CSocket)
Biorąc pod uwagę uchwyt do jednej z tych obiektów, można znaleźć obiektu MFC, który otacza uchwyt przez wywołanie metody statycznej FromHandle.Na przykład, biorąc pod uwagę HWND o nazwie hWnd, następujący wiersz zwraca wskaźnik do CWnd który otacza hWnd:
CWnd::FromHandle(hWnd)
Jeśli hWnd nie ma obiektu określonego otoki, tymczasowy CWnd tworzona jest zawijany hWnd.Dzięki temu można uzyskać prawidłowy obiekt C++ z dowolnego uchwytu.
Po utworzeniu obiektu otoki można pobrać uchwytu ze zmiennej publicznego członka klasy otoki.W odniesieniu do CWnd, m_hWnd zawiera HWND dla tego obiektu.
Dołączanie uchwytów do obiektów MFC
Biorąc pod uwagę obiektu nowo utworzone otoki uchwyt oraz uchwyt do obiektu systemu Windows, można skojarzyć dwa przez wywołanie Attach działać jak w poniższym przykładzie:
CWnd myWnd;
myWnd.Attach(hWnd);
Dzięki temu wpis w kojarzenia stałe mapę myWnd i hWnd.Wywołanie CWnd::FromHandle(hWnd) zwróci teraz wskaźnik do myWnd.Gdy myWnd jest usunięty, zostanie automatycznie zniszczy hWnd przez wywołanie Windows DestroyWindow funkcji.Jeśli nie jest pożądane, hWnd musi zostać odłączony od myWnd przed myWnd jest niszczony (zwykle podczas opuszczania zakresu, w którym myWnd został zdefiniowany).Detach Metoda robi to.
myWnd.Detach();
Więcej informacji na temat obiektów tymczasowych.
Tymczasowe obiekty są tworzone przy każdym FromHandle podano uchwyt, który nie ma obiektu otoki.Te tymczasowe obiekty są odłączone od ich uchwyt i usunięte przez DeleteTempMap funkcji.Domyślnie CWinThread::OnIdle wywołuje automatycznie DeleteTempMap dla każdej klasy, która obsługuje mapy dojście tymczasowe.Oznacza to, że nie można zakładać, że wskaźnik tymczasowy obiekt będzie obowiązywać poza punktem wyjścia z funkcji uzyskano wskaźnik.
Obiekty opakowaniowe i wiele wątków
Zarówno czasowych i obiekty są utrzymywane na podstawie dla wątku.Oznacza to, że jeden wątek nie może uzyskać dostępu obiekty opakowaniowe C++ innego wątku, niezależnie od tego, czy jest czasowe lub stałe.
Aby przekazać tych obiektów z jednego wątku na inny, zawsze wysyłanie ich jako ich macierzystego HANDLE typu.Przekazując obiekt otoki C++ z jednego wątku na inny często spowoduje nieoczekiwanych rezultatów.