Aracılığıyla paylaş


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 CDCtü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.

Ayrıca bkz.

Sayıya Göre Teknik Notlar
Kategoriye Göre Teknik Notlar