Sdílet prostřednictvím


TN003Mapování obslužných rutin Windows na objekty

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

Problém

Objekty Windows jsou obvykle reprezentovány různými zpracování objekty knihovny MFC třídy obtékání úchyty objektu systému Windows pomocí objektů jazyka C++.Popisovač přepisování funkcí třídy knihovny MFC umožňuje najít objekt jazyka C++, který obtéká objekt systému Windows, který má určitý popisovač.Nicméně někdy objekt neobsahuje objekt obálky C++ a v těchto časech systém vytvoří dočasný objekt jako obálka C++.

Objekty systému Windows, které používají mapování zpracování jsou následující:

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

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

  • HMENU (CMenu)

  • HPEN (CGdiObject)

  • HBRUSH (CGdiObject)

  • HFONT (CGdiObject)

  • HBITMAP (CGdiObject)

  • HPALETTE (CGdiObject)

  • HRGN (CGdiObject)

  • HIMAGELIST (CImageList)

  • SOKET (CSocket)

Popisovač věnovat některý z těchto objektů, lze najít objektu knihovny MFC, která obaluje popisovače voláním statické metody FromHandle.Například uděleno HWND nazývá hWnd, vrátí ukazatel na následující řádek CWnd , která obaluje hWnd:

CWnd::FromHandle(hWnd)

Pokud hWnd nemá objekt konkrétní obálky, dočasný CWnd je vytvořen zalomení hWnd.Díky tomu je možné získat od libovolného úchytu na platný objekt jazyka C++.

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

Připojení táhla k objektům knihovny MFC

Vzhledem k nově vytvořené táhlo obálky objektu a popisovač objektu 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í dočasné mapy myWnd a hWnd.Volání CWnd::FromHandle(hWnd) nyní vrátí ukazatel na myWnd.Při myWnd je odstraněn, je destruktor automaticky zničí hWnd voláním systému Windows DestroyWindow funkce.Pokud k tomu, hWnd musí být odpojena z myWnd před myWnd zničen (obvykle při opuštění rozsahu, ve kterém myWnd byla definována).Detach Metoda provádí.

myWnd.Detach();

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

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

Objekty obalu a více vláken

Dočasné nebo trvalé objekty jsou udržovány na základě vlákna.Jednoho podprocesu nelze získat přístup jiným vláknem objektů C++ wrapper, bez ohledu na to, zda je dočasné nebo trvalé.

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

Viz také

Další zdroje

Technické poznámky podle čísel

Technické poznámky podle kategorií