TN003: mapowanie uchwytów okien na obiekty

Uwaga ta opisuje MFC procedur, które obsługuje mapowanie systemu Windows obiekt dojścia do obiektów języka C++.

Problem

Obiekty systemu Windows zazwyczaj są reprezentowane przez różne obsługi obiekty klas MFC Zawijaj uchwytów obiektów systemu Windows z obiektami C++.Uchwyt otaczania funkcji Biblioteka klas MFC pozwalają znaleźć obiekt C++, który jest zawijany obiekt systemu Windows, który ma określonego dojścia.Jednak czasami obiektu nie ma obiektu C++ i w tych godzinach system tworzy tymczasowy obiekt do działania jako otoka C++.

Obiekty systemu Windows, które służy map uchwyt są następujące:

Biorąc pod uwagę dojścia do jednej z tych obiektów, można znaleźć obiekt MFC, który otacza dojście przez wywołanie metody statycznej FromHandle.Na przykład, biorąc pod uwagę HWND o nazwie hWnd, następujący wiersz zwróci wskaźnik do CWnd który otacza hWnd:

CWnd::FromHandle(hWnd)

Jeśli hWnd nie ma określonego obiektu, tymczasowego CWnd jest tworzony na zawijanie hWnd.Dzięki temu można uzyskać prawidłowy obiekt C++ z dowolnego uchwytu.

Po utworzeniu obiektu można pobrać uchwytu ze zmiennej publicznego członka klasy otoki.W odniesieniu do CWnd, m_hWnd zawiera HWND dla tego obiektu.

Dołączanie dojścia do obiektów MFC

Biorąc pod uwagę nowo utworzonego dojścia-obiektu i dojścia do obiektów systemu Windows, można skojarzyć dwa przez wywołanie Attach działać jak w poniższym przykładzie:

CWnd myWnd;
myWnd.Attach(hWnd);

To sprawia, że wpis podczas kojarzenia mapę stałe myWnd i hWnd.Wywołanie CWnd::FromHandle(hWnd) zwróci teraz wskaźnik do myWnd.Gdy myWnd jest usunięty, zostanie on automatycznie niszczy hWnd przez wywołanie systemu Windows DestroyWindow funkcji.Jeśli jest to niepożądane, hWnd musi zostać odłączony od myWnd przed myWnd jest niszczony (normalnie, przy wychodzeniu z zakresu, w którym myWnd został zdefiniowany).Detach Metoda robi to.

myWnd.Detach();

Więcej informacji na temat obiektów tymczasowych.

Obiekty tymczasowe są tworzone przy każdym FromHandle jest podana dla dojścia, które jeszcze nie ma obiektu.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 jeżeli uzyskano wskaźnik.

Obiekty opakowaniowe i wiele wątków

Zarówno tymczasowe lub stałe obiekty są utrzymywane na zasadzie na wątek.Oznacza to, że jeden wątek nie może uzyskać dostępu obiekty opakowaniowe C++ innego wątku, niezależnie od tego, czy jest on tymczasowo lub na stałe.

Aby przekazać te obiekty z jednego wątku na inny, zawsze wysłać je jako ich macierzystym HANDLE typu.Przekazywanie obiektu C++ z jednego wątku na inny często spowoduje nieoczekiwanych rezultatów.

Zobacz też

Inne zasoby

Uwagi techniczne według numerów

Uwagi techniczne według kategorii