Annotation of mstools/mfc/doc/tn003.txt, revision 1.1.1.1

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.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.