Annotation of mstools/mfc/src/wingdi.cpp, revision 1.1

1.1     ! root        1: // This is a part of the Microsoft Foundation Classes C++ library. 
        !             2: // Copyright (C) 1992 Microsoft Corporation 
        !             3: // All rights reserved. 
        !             4: //  
        !             5: // This source code is only intended as a supplement to the 
        !             6: // Microsoft Foundation Classes Reference and Microsoft 
        !             7: // QuickHelp documentation provided with the library. 
        !             8: // See these sources for detailed information regarding the 
        !             9: // Microsoft Foundation Classes product. 
        !            10: 
        !            11: 
        !            12: #include "afxwin.h"
        !            13: #pragma hdrstop
        !            14: 
        !            15: #include "winhand_.h"
        !            16: 
        !            17: #ifdef AFX_CORE_SEG
        !            18: #pragma code_seg(AFX_CORE_SEG)
        !            19: #endif
        !            20: 
        !            21: #ifdef _DEBUG
        !            22: #undef THIS_FILE
        !            23: static char BASED_CODE THIS_FILE[] = __FILE__;
        !            24: #define new DEBUG_NEW
        !            25: #endif
        !            26: 
        !            27: /////////////////////////////////////////////////////////////////////////////
        !            28: // Standard exception processing
        !            29: 
        !            30: IMPLEMENT_DYNAMIC(CResourceException, CException)
        !            31: static  CResourceException NEAR simpleResourceException; 
        !            32: void AfxThrowResourceException()                            
        !            33:        { afxExceptionContext.Throw(&simpleResourceException, TRUE); }
        !            34: 
        !            35: 
        !            36: /////////////////////////////////////////////////////////////////////////////
        !            37: // Diagnostic Output
        !            38: #ifdef _DEBUG
        !            39: CDumpContext& operator<<(CDumpContext& dc, SIZE size)
        !            40: {
        !            41:        return dc << "(" << size.cx << " x " << size.cy << ")";
        !            42: }
        !            43: 
        !            44: CDumpContext& operator<<(CDumpContext& dc, POINT point)
        !            45: {
        !            46:        return dc << "(" << point.x << ", " << point.y << ")";
        !            47: }
        !            48: 
        !            49: CDumpContext& operator<<(CDumpContext& dc, const RECT& rect)
        !            50: {
        !            51:        return dc << "(L " << rect.left << ", T " << rect.top << ", R " <<
        !            52:                rect.right << ", B " << rect.bottom << ")";
        !            53: }
        !            54: #endif //_DEBUG
        !            55: 
        !            56: 
        !            57: 
        !            58: /////////////////////////////////////////////////////////////////////////////
        !            59: // CDC
        !            60: 
        !            61: IMPLEMENT_DYNAMIC(CDC, CObject)
        !            62: 
        !            63: // Map from HDC to CDC*
        !            64: class NEAR CDCHandleMap : public CHandleMap
        !            65: {
        !            66: public:
        !            67:        CObject* NewTempObject(HANDLE h)
        !            68:                                {
        !            69:                                        // don't add in permanent
        !            70:                                        CDC* p = new CDC();
        !            71:                                        p->m_hDC = (HDC)h;       // set after constructed
        !            72:                                        return p;
        !            73:                                }
        !            74:        void DeleteTempObject(CObject* ob)
        !            75:                                {
        !            76:                                        // destructor doesn't do anything
        !            77:                                        ASSERT(ob->IsKindOf(RUNTIME_CLASS(CDC)));
        !            78:                                        ((CDC*)ob)->m_hDC = NULL;
        !            79:                                        delete ob;
        !            80:                                }
        !            81: };
        !            82: static CDCHandleMap NEAR deviceMap;
        !            83: 
        !            84: #ifdef _DEBUG
        !            85: void CDC::AssertValid() const
        !            86: {
        !            87:        CObject::AssertValid();
        !            88: }
        !            89: 
        !            90: void CDC::Dump(CDumpContext& dc) const
        !            91: {
        !            92:        CObject::Dump(dc);
        !            93:        dc << "m_hDC = " << m_hDC;
        !            94: }
        !            95: #endif
        !            96: 
        !            97: CDC*
        !            98: CDC::FromHandle(HDC hDC)
        !            99: {
        !           100:        return (CDC*)deviceMap.FromHandle(hDC);
        !           101: }
        !           102: 
        !           103: void
        !           104: CDC::DeleteTempMap()
        !           105: {
        !           106:        deviceMap.DeleteTemp();
        !           107: }
        !           108: 
        !           109: BOOL
        !           110: CDC::Attach(HDC hDC)
        !           111: {
        !           112:        ASSERT(m_hDC == NULL);      // only attach once, detach on destroy
        !           113:        if (hDC == NULL)
        !           114:                return FALSE;
        !           115:        deviceMap.SetPermanent(m_hDC = hDC, this);
        !           116:        return TRUE;
        !           117: }
        !           118: 
        !           119: HDC CDC::Detach()
        !           120: {
        !           121:        HDC hDC;
        !           122:        if ((hDC = m_hDC) != NULL)
        !           123:                deviceMap.RemovePermanent(m_hDC);
        !           124:        m_hDC = NULL;
        !           125:        return hDC;
        !           126: }
        !           127: 
        !           128: BOOL CDC::DeleteDC()
        !           129: {
        !           130:        if (m_hDC == NULL)
        !           131:                return FALSE;
        !           132:         return ::DeleteDC(Detach());
        !           133: }
        !           134: 
        !           135: CDC::~CDC()
        !           136: {
        !           137:        if (m_hDC != NULL)
        !           138:                ::DeleteDC(Detach());
        !           139: }
        !           140: 
        !           141: /////////////////////////////////////////////////////////////////////////////
        !           142: // Out-of-line routines
        !           143: 
        !           144: CGdiObject*
        !           145: CDC::SelectGdiObject(HDC hDC, HANDLE h)
        !           146: {
        !           147:        return CGdiObject::FromHandle(::SelectObject(hDC, h));
        !           148: }
        !           149: 
        !           150: CPalette*
        !           151: CDC::SelectPalette(CPalette* pPalette, BOOL bForceBackground)
        !           152: {
        !           153:        return (CPalette*) CGdiObject::FromHandle(
        !           154:                ::SelectPalette(m_hDC, (HPALETTE)pPalette->m_hObject, bForceBackground));
        !           155: }
        !           156: 
        !           157: /////////////////////////////////////////////////////////////////////////////
        !           158: // Helper DCs
        !           159: 
        !           160: IMPLEMENT_DYNAMIC(CClientDC, CDC)
        !           161: IMPLEMENT_DYNAMIC(CWindowDC, CDC)
        !           162: IMPLEMENT_DYNAMIC(CPaintDC, CDC)
        !           163: IMPLEMENT_DYNAMIC(CMetaFileDC, CDC)
        !           164: 
        !           165: #ifdef _DEBUG
        !           166: void CClientDC::AssertValid() const
        !           167: {
        !           168:        CDC::AssertValid();
        !           169:        ASSERT(IsWindow(m_hWnd));
        !           170: }
        !           171: 
        !           172: void CClientDC::Dump(CDumpContext& dc) const
        !           173: {
        !           174:        CDC::Dump(dc);
        !           175:        dc << " m_hWnd = " << (UINT)m_hWnd;
        !           176: }
        !           177: #endif
        !           178: 
        !           179: CClientDC::CClientDC(CWnd* pWnd)
        !           180: {
        !           181:        if (!Attach(::GetDC(m_hWnd = pWnd->GetSafeHwnd())))
        !           182:                AfxThrowResourceException();
        !           183: }
        !           184: 
        !           185: CClientDC::~CClientDC()
        !           186: {
        !           187:        ASSERT(m_hDC != NULL);
        !           188:        ::ReleaseDC(m_hWnd, Detach());
        !           189: }
        !           190: 
        !           191: 
        !           192: #ifdef _DEBUG
        !           193: void CWindowDC::AssertValid() const
        !           194: {
        !           195:        CDC::AssertValid();
        !           196:        ASSERT(::IsWindow(m_hWnd));
        !           197: }
        !           198: 
        !           199: void CWindowDC::Dump(CDumpContext& dc) const
        !           200: {
        !           201:        CDC::Dump(dc);
        !           202:        dc << " m_hWnd = " << (UINT)m_hWnd;
        !           203: }
        !           204: #endif
        !           205: 
        !           206: CWindowDC::CWindowDC(CWnd* pWnd)
        !           207: {
        !           208:        if (!Attach(::GetWindowDC(m_hWnd = pWnd->GetSafeHwnd())))
        !           209:                AfxThrowResourceException();
        !           210: }
        !           211: 
        !           212: CWindowDC::~CWindowDC()
        !           213: {
        !           214:        ASSERT(m_hDC != NULL);
        !           215:        ::ReleaseDC(m_hWnd, Detach());
        !           216: }
        !           217: 
        !           218: #ifdef _DEBUG
        !           219: void CPaintDC::AssertValid() const
        !           220: {
        !           221:        CDC::AssertValid();
        !           222:        ASSERT(::IsWindow(m_hWnd));
        !           223: }
        !           224: 
        !           225: void CPaintDC::Dump(CDumpContext& dc) const
        !           226: {
        !           227:        CDC::Dump(dc);
        !           228:        dc << "\nm_hWnd = " << (UINT)m_hWnd;
        !           229:        dc << "\nm_ps.hdc = " << (UINT)m_ps.hdc;
        !           230:        dc << "\nm_ps.fErase = " << m_ps.fErase;
        !           231:        dc << "\nm_ps.rcPaint = " << (CRect)m_ps.rcPaint;
        !           232: }
        !           233: #endif
        !           234: 
        !           235: CPaintDC::CPaintDC(CWnd* pWnd)
        !           236: {
        !           237:        ASSERT_VALID(pWnd);
        !           238:        if (!Attach(::BeginPaint(m_hWnd = pWnd->m_hWnd, &m_ps)))
        !           239:                AfxThrowResourceException();
        !           240: }
        !           241: 
        !           242: CPaintDC::~CPaintDC()
        !           243: {
        !           244:        ASSERT(m_hDC != NULL);
        !           245:        ::EndPaint(m_hWnd, &m_ps);
        !           246:        Detach();
        !           247: }
        !           248: 
        !           249: /////////////////////////////////////////////////////////////////////////////
        !           250: // CGdiObject
        !           251: 
        !           252: IMPLEMENT_DYNAMIC(CGdiObject, CObject)
        !           253: 
        !           254: // Map from H??? to CGdiObject*
        !           255: 
        !           256: class NEAR CGdiHandleMap : public CHandleMap
        !           257: {
        !           258: public:
        !           259:        CObject* NewTempObject(HANDLE hObject)
        !           260:                                {
        !           261:                                        // don't add in permanent
        !           262:                                        CGdiObject* p = new CGdiObject;
        !           263:                                        p->m_hObject = hObject;     // set after constructed
        !           264:                                        return p;
        !           265:                                }
        !           266:        void DeleteTempObject(CObject* ob)
        !           267:                                {
        !           268:                                        ASSERT(ob->IsKindOf(RUNTIME_CLASS(CGdiObject)));
        !           269:                                        ((CGdiObject*)ob)->m_hObject = NULL;
        !           270:                                                                        // clear before destructed
        !           271:                                        delete ob;
        !           272:                                }
        !           273: };
        !           274: static CGdiHandleMap NEAR gdiMap;
        !           275: 
        !           276: #ifdef _DEBUG
        !           277: void CGdiObject::Dump(CDumpContext& dc) const
        !           278: {
        !           279:        CObject::Dump(dc);
        !           280:        dc << " m_hObject = " << (UINT)m_hObject;
        !           281: }
        !           282: #endif
        !           283: 
        !           284: CGdiObject* 
        !           285: CGdiObject::FromHandle(HANDLE h)
        !           286: {
        !           287:        return (CGdiObject*)gdiMap.FromHandle(h);
        !           288: }
        !           289: 
        !           290: void
        !           291: CGdiObject::DeleteTempMap()
        !           292: {
        !           293:        gdiMap.DeleteTemp();
        !           294: }
        !           295: 
        !           296: BOOL
        !           297: CGdiObject::Attach(HANDLE hObject)
        !           298: {
        !           299:        ASSERT(m_hObject == NULL);      // only attach once, detach on destroy
        !           300:        if (hObject == NULL)
        !           301:                return FALSE;
        !           302:        gdiMap.SetPermanent(m_hObject = hObject, this);
        !           303:        return TRUE;
        !           304: }
        !           305: 
        !           306: HANDLE CGdiObject::Detach()
        !           307: {
        !           308:        HANDLE hObject;
        !           309:        if ((hObject = m_hObject) != NULL)
        !           310:        {
        !           311:                gdiMap.RemovePermanent(m_hObject);
        !           312:                // because of stock objects, it may be in temporary map too
        !           313:                gdiMap.RemoveTemporary(m_hObject);
        !           314:        }
        !           315:        m_hObject = NULL;
        !           316:        return hObject;
        !           317: }
        !           318: 
        !           319: BOOL CGdiObject::DeleteObject()
        !           320: {
        !           321:        if (m_hObject == NULL)
        !           322:                return FALSE;
        !           323:        return ::DeleteObject(Detach());
        !           324: }
        !           325: 
        !           326: CGdiObject::~CGdiObject()
        !           327: {
        !           328:        DeleteObject();
        !           329: }
        !           330: 
        !           331: /////////////////////////////////////////////////////////////////////////////
        !           332: // Standard GDI objects
        !           333: 
        !           334: IMPLEMENT_DYNAMIC(CPen, CGdiObject)
        !           335: IMPLEMENT_DYNAMIC(CBrush, CGdiObject)
        !           336: IMPLEMENT_DYNAMIC(CFont, CGdiObject)
        !           337: IMPLEMENT_DYNAMIC(CBitmap, CGdiObject)
        !           338: IMPLEMENT_DYNAMIC(CPalette, CGdiObject)
        !           339: IMPLEMENT_DYNAMIC(CRgn, CGdiObject)
        !           340: 
        !           341: /////////////////////////////////////////////////////////////////////////////
        !           342: // Out-of-line constructors
        !           343: 
        !           344: ////////////////////////////////////////////
        !           345: // CPen
        !           346: 
        !           347: CPen::CPen(int nPenStyle, int nWidth, DWORD crColor)
        !           348: {
        !           349:        if (!Attach(::CreatePen(nPenStyle, nWidth, crColor)))
        !           350:                AfxThrowResourceException();
        !           351: }
        !           352: 
        !           353: ////////////////////////////////////////////
        !           354: // CBrush
        !           355: 
        !           356: CBrush::CBrush(DWORD crColor)
        !           357: {
        !           358:        if (!Attach(::CreateSolidBrush(crColor)))
        !           359:                AfxThrowResourceException();
        !           360: }
        !           361: 
        !           362: CBrush::CBrush(int nIndex, DWORD crColor)
        !           363: {
        !           364:        if (!Attach(::CreateHatchBrush(nIndex, crColor)))
        !           365:                AfxThrowResourceException();
        !           366: }
        !           367: 
        !           368: CBrush::CBrush(CBitmap* pBitmap)
        !           369: {
        !           370:        if (!Attach(::CreatePatternBrush((HBITMAP)pBitmap->m_hObject)))
        !           371:                AfxThrowResourceException();
        !           372: }
        !           373: 
        !           374: /////////////////////////////////////////////////////////////////////////////

unix.superglobalmegacorp.com

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