TN003: Pencere İşleyicilerini Nesnelere Eşleme
Bu not, Windows nesne tanıtıcılarını C++ nesnelerine eşlemeyi destekleyen MFC yordamlarını açıklar.
Sorun
Windows nesneleri genellikle çeşitli HANDLE nesneleriyle temsil edilir MFC sınıfları, Windows nesne tanıtıcılarını C++ nesneleriyle sarmalar. MFC sınıf kitaplığının tanıtıcı sarmalama işlevleri, belirli bir tanıtıcıya sahip Windows nesnesini sarmalayan C++ nesnesini bulmanıza olanak sağlar. Ancak, bazen bir nesnenin C++ sarmalayıcı nesnesi yoktur ve bu zamanlarda sistem, C++ sarmalayıcısı gibi davranacak geçici bir nesne oluşturur.
Tanıtıcı eşlemeleri kullanan Windows nesneleri aşağıdaki gibidir:
HWND (CWnd ve
CWnd
-derived sınıfları)HDC (CDC ve
CDC
türetilmiş sınıflar)HMENU (CMenu)
HPEN (CGdiObject)
HBRUSH (
CGdiObject
)HFONT (
CGdiObject
)HBITMAP (
CGdiObject
)HPALETTE (
CGdiObject
)HRGN (
CGdiObject
)HIMAGELIST (CImageList)
SOCKET (CSocket)
Bu nesnelerden herhangi birine tanıtıcı verdiyseniz, statik yöntemini FromHandle
çağırarak tanıtıcıyı sarmalayan MFC nesnesini bulabilirsiniz. Örneğin, hWnd adlı bir HWND verüldüğünde, aşağıdaki satır hWnd'yiCWnd
sarmalayan işaretçiyi döndürür:
CWnd::FromHandle(hWnd)
hWnd belirli bir sarmalayıcı nesnesine sahip değilse, hWnd sarmalama için geçici CWnd
bir oluşturulur. Bu, herhangi bir tanıtıcıdan geçerli bir C++ nesnesi almayı mümkün kılar.
Sarmalayıcı nesnesine sahip olduktan sonra, sarmalayıcı sınıfının ortak üye değişkeninden tutamacını alabilirsiniz. durumunda CWnd
, m_hWnd bu nesnenin HWND'sini içerir.
MFC Nesnelerine Tutamaç Ekleme
Yeni oluşturulan tanıtıcı sarmalayıcı nesnesi ve Bir Windows nesnesi tanıtıcısı göz önünde bulundurulduğunda, işlevini şu örnekte olduğu gibi çağırarak Attach
ikisini ilişkilendirebilirsiniz:
CWnd myWnd;
myWnd.Attach(hWnd);
Bu, myWnd ve hWnd ile ilişkilendiren kalıcı haritada bir giriş yapar. Çağrısı CWnd::FromHandle(hWnd)
artık myWnd için bir işaretçi döndürür. myWnd silindiğinde, yıkıcı Windows DestroyWindow işlevini çağırarak hWnd'i otomatik olarak yok eder. Bu istenmiyorsa, myWnd yok edilmeden önce hWnd myWnd'den ayrılmalıdır (normalde myWnd'in tanımlandığı kapsam bırakılırken). Detach
yöntemi bunu yapar.
myWnd.Detach();
Geçici Nesneler Hakkında Daha Fazla Bilgi
Geçici nesneler, henüz sarmalayıcı nesnesi olmayan bir tanıtıcı verildiğinde oluşturulur FromHandle
. Bu geçici nesneler tanıtıcılarından ayrılır ve işlevler tarafından DeleteTempMap
silinir. Varsayılan olarak CWinThread::OnIdle , geçici tanıtıcı eşlemelerini destekleyen her sınıf için otomatik olarak çağrır DeleteTempMap
. Bu, geçici bir nesne işaretçisinin, işaretçinin alındığı işlevden çıkış noktasından sonra geçerli olacağını varsayamayacağınız anlamına gelir.
Sarmalayıcı Nesneleri ve Birden Çok İş Parçacığı
Hem geçici hem de kalıcı nesneler iş parçacığı başına temelinde tutulur. Başka bir ifadeyle, bir iş parçacığının geçici veya kalıcı olmasına bakılmaksızın başka bir iş parçacığının C++ sarmalayıcı nesnelerine erişemez.
Bu nesneleri bir iş parçacığından diğerine geçirmek için her zaman yerel HANDLE
türleri olarak gönderin. C++ sarmalayıcı nesnesinin bir iş parçacığından diğerine geçirilmesi genellikle beklenmeyen sonuçlara neden olur.