Sdílet prostřednictvím


TN003: Mapování systému Windows zpracovává objekty

Tato poznámka popisuje jednotka MFC rutin, které podporují Windows mapování objekt popisovače objektů jazyka C++.

Problém

Objekty systému Windows obvykle představují různé zpracování objektů tříd MFC obtékání Windows úchyty objektu s C++ objekty.Popisovač obtékání funkce knihovny MFC třídy umožňují najít objekt jazyka C++, který obtéká objekt systému Windows, který obsahuje určitý popisovač.V těchto časech systém vytvoří dočasný objekt jako C++ wrapper a však někdy objekt neobsahuje objekt obálky C++.

Windows objekty, které používají popisovač mapy jsou následující:

  • HWND (CWnd a CWnd-odvozené třídy)

  • HDC (CDC a CDC-odvozené třídy)

  • HMENU (CMenu)

  • HPEN (CGdiObject)

  • HBRUSH (CGdiObject)

  • HFONT (CGdiObject)

  • HBITMAP (CGdiObject)

  • HPALETTE (CGdiObject)

  • HRGN (CGdiObject)

  • HIMAGELIST (CImageList)

  • SOKET (CSocket)

Popisovač vzhledem k některé z těchto objektů, můžete najít objekt MFC, který obtéká popisovač statické metody FromHandle.Například vzhledem HWND nazývá hWnd, vrací ukazatel na následující řádek CWnd , obtéká hWnd:

CWnd::FromHandle(hWnd)

Pokud hWnd nemá objekt zvláštní obálky, dočasně CWnd je vytvořen obtékání hWnd.Umožňuje získat platný objekt C++ z libovolné táhlo.

Jakmile objekt obálky můžete načíst z veřejné členské proměnné třídy obálky její úchyt.V souvislosti CWnd, m_hWnd HWND pro daný objekt obsahuje.

Připojování táhla k objektům MFC

Věnována objekt nově vytvořeným táhlo obálky a táhlo objekt systému Windows, můžete spojit dvě voláním Attach funkce jako v následujícím příkladu:

CWnd myWnd;
myWnd.Attach(hWnd);

To vytvoří položku v přidružení trvalé mapa myWnd a hWnd.Volání CWnd::FromHandle(hWnd) bude nyní vracet ukazatel na myWnd.Při myWnd je odstraněn, se objekt automaticky zničí hWnd voláním systému Windows DestroyWindow funkce.Pokud není požadováno, hWnd se odmontuje od myWnd před myWnd zničen (obvykle při opuštění obor, na který myWnd byla definována).Detach Metoda provádí.

myWnd.Detach();

Další informace o dočasných objektů

Dočasné objekty jsou vytvářeny při každém FromHandle je dán úchyt, který již nemá objekt obálky.Tyto dočasné objekty jsou odděleny od jejich zpracování a odstraněn DeleteTempMap funkcí.Ve výchozím nastavení CWinThread::OnIdle volání automaticky DeleteTempMap pro každou třídu, který podporuje dočasný popisovač mapy.To znamená, že nelze předpokládají, že ukazatel na dočasný objekt bude platit za bod výstupu z funkce kde byla získána ukazatel.

Objekty obalu a více podprocesů

Trvalých i dočasných objektů jsou udržovány na základě podprocesu.Jeden podproces, nemůže přístup k jiným podprocesem C++ wrapper objekty bez ohledu na to, zda je dočasné nebo trvalé.

Chcete-li předat tyto objekty z jednoho podprocesu do jiného, vždy je odeslat jako jejich nativním HANDLE typu.Předáním objektu C++ wrapper z jednoho podprocesu často způsobí neočekávané výsledky.

Viz také

Další zdroje

Technické poznámky podle čísla

Technické poznámky podle kategorie