|
|
1.1 ! root 1: Microsoft Foundation Classes Microsoft Corporation ! 2: Technical Notes ! 3: ! 4: #3 : Handle Maps ! 5: ! 6: This note describes the MFC routines for supporting mapping Windows object ! 7: handles to C++ objects. ! 8: ! 9: ============================================================================= ! 10: ! 11: The Problem ! 12: =========== ! 13: ! 14: Windows objects are normally represented by HANDLEs. The Foundation ! 15: classes wrap Windows object handles with C++ objects. The handle wrapping ! 16: functions of the Foundation class library provide a way to find the C++ ! 17: object that is wrapping the Windows object with a particular handle. There ! 18: are times when a Windows object does not have a C++ wrapper object, however, ! 19: and at these times a temporary object is created to act as the C++ wrapper. ! 20: ! 21: ! 22: The Windows objects that use handle maps are: ! 23: ! 24: HWND ! 25: HDC ! 26: HMENU ! 27: HPEN ! 28: HBRUSH ! 29: HFONT ! 30: HBITMAP ! 31: HPALETTE ! 32: HRGN ! 33: ! 34: Given a handle to any of these objects, you can find the Foundation object ! 35: that wraps the handle by calling the class static function FromHandle. For ! 36: example, given an HWND called hWnd ! 37: ! 38: CWnd::FromHandle(hWnd) ! 39: ! 40: will return a pointer to the CWnd that wraps the hWnd. If that hWnd ! 41: does not have a specific wrapper object, then a temporary CWnd is ! 42: created to wrap the hWnd. This makes it possible to get a valid C++ ! 43: object from any handle. ! 44: ! 45: ============================================================================= ! 46: Attaching Handles to Foundation Objects ! 47: ======================================= ! 48: ! 49: Given a newly created handle wrapper object and a handle to a Windows object, ! 50: you can associate the two by calling Attach. For example: ! 51: ! 52: CWnd myWnd; ! 53: myWnd.Attach(hWnd); ! 54: ! 55: This makes an entry in the permanent map associating myWnd and hWnd. ! 56: Calling CWnd::FromHandle(hWnd) will now return a pointer to myWnd. ! 57: ! 58: Extending this example, when myWnd is deleted the destructor will ! 59: automatically destroy the hWnd, by calling the *Windows* ! 60: DestroyWindow function. If this is not desired, the hWnd must be ! 61: detached from myWnd before the myWnd object is destroyed (normally ! 62: when leaving the scope at which myWnd was defined. The Detach ! 63: function does this. ! 64: ! 65: myWnd.Detach(); ! 66: ! 67: ! 68: ! 69: ============================================================================= ! 70: More About Temporary Objects ! 71: ============================ ! 72: ! 73: Temporary objects are created whenever FromHandle is given a handle ! 74: that does not already have a wrapper object. These temporary objects ! 75: are detached from their handle and deleted by the DeleteTempMap ! 76: functions. The default OnIdle processing in CWinApp automatically ! 77: calls DeleteTempMap for each class that supports temporary handle ! 78: maps. This means that you cannot assume a pointer to a temporary ! 79: object will be valid past the point of exit from the function where ! 80: the pointer was obtained, as the temporary object will be deleted during ! 81: the Windows message loop idle time.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.