TN003: Mapowanie systemu Windows obsługuje do obiektów

Uwaga ta opisuje urządzenie MFC procedur, które obsługują mapowanie systemu Windows obiektu dojścia do C++ obiektów.

Problem

Obiekty systemu Windows zwykle są reprezentowane przez uchwyts. Klas MFC oblewanie Windows uchwyty z obiektami C++. Funkcji zawijania uchwyt Biblioteka klas MFC umożliwiają znaleźć obiekt C++, który jest otaczanie obiektu Windows z określonego dojścia. W sytuacjach, gdy obiekt systemu Windows nie ma obiektu opakowującego C++, jednak i tych porach, utworzone tymczasowy obiekt do działania jako otoka C++.

Obiektów systemu Windows, które używają uchwyt mapy są:

Biorąc pod uwagę dojścia do dowolnego z tych obiektów, można znaleźć obiekt MFC, który otacza uchwyt, wywołując funkcję członka statycznego FromHandle. Na przykład biorąc pod uwagę HWND o nazwie hWnd:

CWnd::FromHandle(hWnd)

zwróci wskaźnik do CWnd , która otacza hWnd. Jeśli ten hWnd nie ma obiektu opakowującego szczególnych, tymczasowe CWnd jest tworzony zawijany hWnd. Dzięki temu można uzyskać prawidłowy obiekt C++ z dowolnego uchwytu.

Gdy obiekt opakowujący, można uzyskać z jego uchwyt za pośrednictwem zmiennej publicznej Państwa. W przypadku CWnd m_hWnd zawiera HWND dla tego obiektu.

Dołączanie uchwyty do obiektów MFC

Podany obiekt nowo utworzonego dojścia otoki i uchwytem do obiektów systemu Windows, można skojarzyć dwa wywołując Dołącz. Na przykład:

CWnd myWnd;
myWnd.Attach(hWnd)

Dzięki temu wpis w planie trwałe skojarzenie myWnd i hWnd. Wywołanie CWnd::FromHandle(hWnd) teraz zwraca wskaźnik do myWnd. Po usunięciu myWnd zostanie automatycznie zniszczy hWnd wywołując funkcję Windows DestroyWindow . Jeśli to nie jest wymagana, hWnd musi być zdjęte z myWnd , zanim niszczony jest obiekt myWnd (zwykle podczas opuszczania zakresu, w którym myWnd został zdefiniowany). Funkcja Członkowskie Odłącz robi to.

myWnd.Detach()

Więcej informacji na temat tymczasowych obiektów

Tymczasowych obiektów są tworzone przy każdym FromHandle podano uchwyt, który nie ma już obiekt opakowujący. Te tymczasowe obiekty są odłączone od ich uchwyt i usuwane przez funkcje DeleteTempMap . Przetwarzanie OnIdle domyślne w CWinThread 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ć w przeszłości punktem wyjścia z funkcji Jeżeli otrzymano wskaźnik, jako tymczasowy obiekt zostaną usunięte w czasie bezczynności, pętla komunikatów systemu Windows.

Obiekty opakowaniowe i wiele wątków

Tymczasowe lub stałe obiekty są utrzymywane na zasadzie na wątku. Oznacza to, że jeden wątek nie może uzyskać dostępu innym wątków obiekty otoki C++, niezależnie od tego, czy jest on tymczasowo lub na stałe. Jak stwierdzono powyżej, tymczasowych obiektów są usuwane, gdy wątek, który należy ten tymczasowy obiekt wejścia OnIdle.

Aby przekazać te obiekty z jednego wątku na inny, zawsze wyślij je jako ich macierzystej obsługi wpisz. Przekazując obiekt opakowujący C++ z jednego wątku na inny często będzie skutkować nieoczekiwane wyniki.

Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii

Index