Annotation of mstools/mfc/samples/oclient/itemwnd.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: // user interface to OLE embedded objects
        !            12: //
        !            13: // Each OLE embedded object is given it's own window to draw in
        !            14: // We use the windows thick frame to provide sizing (NOTE: this is not
        !            15: //      UISG conformant!)
        !            16: 
        !            17: #include "oclient.h"
        !            18: 
        !            19: #include "mainwnd.h"
        !            20: #include "itemwnd.h"
        !            21: 
        !            22: /////////////////////////////////////////////////////////////////////////////
        !            23: // Static members for dragging state
        !            24: 
        !            25: CRect CItemWnd::dragRect;
        !            26: CPoint CItemWnd::dragPt;
        !            27: 
        !            28: /////////////////////////////////////////////////////////////////////////////
        !            29: // Message map for ItemWnd
        !            30: 
        !            31: BEGIN_MESSAGE_MAP(CItemWnd, CWnd)
        !            32:        // windows messages
        !            33:        ON_WM_PAINT()
        !            34:        ON_WM_SIZE()
        !            35:        ON_WM_LBUTTONDBLCLK()
        !            36:        ON_WM_LBUTTONDOWN()
        !            37:        ON_WM_LBUTTONUP()
        !            38:        ON_WM_MOUSEMOVE()
        !            39:        ON_WM_ERASEBKGND()
        !            40: END_MESSAGE_MAP()
        !            41: 
        !            42: 
        !            43: /////////////////////////////////////////////////////////////////////////////
        !            44: // Creation
        !            45: 
        !            46: #pragma warning(disable:4355)
        !            47: // C4355 is "'this' used in base initializer list" warning
        !            48: 
        !            49: CItemWnd::CItemWnd(CMainWnd* pContainer)
        !            50:        : m_embedded(pContainer->GetDocument(), this)
        !            51: {
        !            52:        m_pContainer = pContainer;
        !            53:        m_fVisible = m_fTrackSize = FALSE;
        !            54:        m_fCaptured = FALSE;
        !            55: }
        !            56: 
        !            57: #pragma warning(default:4355)
        !            58: 
        !            59: 
        !            60: BOOL CItemWnd::CreateItemWindow(BOOL fShow)
        !            61: {
        !            62:        ASSERT(m_pContainer != NULL);
        !            63:        CRect   rectBounds;
        !            64: 
        !            65:        if (!GetEmbedded()->GetBounds(&rectBounds))
        !            66:                rectBounds.SetRectEmpty(); // server doesn't know about the bounds
        !            67: 
        !            68:        FixObjectBounds(rectBounds);
        !            69: 
        !            70:        rectBounds.OffsetRect(2 * GetSystemMetrics(SM_CXFRAME),
        !            71:                                        2 * GetSystemMetrics(SM_CYFRAME));
        !            72: 
        !            73:        if (!CWnd::Create(NULL, NULL /* no title */,
        !            74:                WS_BORDER | WS_CHILD | WS_CLIPSIBLINGS | WS_THICKFRAME,
        !            75:                rectBounds, m_pContainer, 0))
        !            76:        {
        !            77:                return FALSE;
        !            78:        }
        !            79: 
        !            80:        m_fVisible = fShow;
        !            81:        m_fTrackSize = TRUE;
        !            82: 
        !            83:        GetEmbedded()->SetNames();
        !            84:        /* Make the object visible, and paint it if fShow == TRUE */
        !            85:        if (fShow)
        !            86:        {
        !            87:                ShowWindow(SW_SHOW);
        !            88:                m_pContainer->SetSelection(this);
        !            89:        }
        !            90: 
        !            91:        return TRUE;
        !            92: }
        !            93: 
        !            94: BOOL CItemWnd::RestoreItemWindow(const RECT& rect)
        !            95: {
        !            96:        ASSERT(m_pContainer != NULL);
        !            97:        CRect rectBounds = rect;
        !            98: 
        !            99:        rectBounds.OffsetRect(2 * GetSystemMetrics(SM_CXFRAME),
        !           100:                                        2 * GetSystemMetrics(SM_CYFRAME));
        !           101: 
        !           102:        if (!CWnd::Create(NULL, NULL /* no title */,
        !           103:                WS_BORDER | WS_CHILD | WS_CLIPSIBLINGS | WS_THICKFRAME,
        !           104:                rectBounds, m_pContainer, 0))
        !           105:        {
        !           106:                return FALSE;
        !           107:        }
        !           108: 
        !           109:        GetEmbedded()->SetNames();
        !           110: 
        !           111:        if (m_fVisible)
        !           112:                ShowWindow(SW_SHOW);
        !           113:        return TRUE;
        !           114: }
        !           115: 
        !           116: 
        !           117: 
        !           118: /////////////////////////////////////////////////////////////////////////////
        !           119: 
        !           120: void CItemWnd::PostNcDestroy()
        !           121: {
        !           122:        ASSERT(m_hWnd == NULL);     // must be detached
        !           123: 
        !           124:        if (m_pContainer->GetSelection() == this)
        !           125:                m_pContainer->SetSelection(NULL);
        !           126: 
        !           127:        // finally free up the C++ object and memory
        !           128:                // (will destroy embedded object as needed)
        !           129:        delete this;
        !           130: }
        !           131: 
        !           132: 
        !           133: BOOL CItemWnd::OnEraseBkgnd(CDC* pDC)
        !           134: {
        !           135:        CBrush myBrush(GetSysColor(COLOR_WINDOW));
        !           136:        CRect rect;
        !           137:        GetClientRect(&rect);
        !           138:        pDC->FillRect(rect, &myBrush);
        !           139:        return TRUE;        // we handled it
        !           140: }
        !           141: 
        !           142: 
        !           143: void CItemWnd::OnPaint()
        !           144: {
        !           145:        CPaintDC dc(this);
        !           146:        CRect   rect;
        !           147: 
        !           148:        // set up a reasonable default context
        !           149:        dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
        !           150:        dc.SetBkColor(::GetSysColor(COLOR_WINDOW));
        !           151: 
        !           152:        // Draw the item
        !           153:        GetClientRect(&rect);
        !           154:        GetEmbedded()->Draw(&dc, &rect, NULL, &dc);
        !           155:                // ignore if can't draw
        !           156: }
        !           157: 
        !           158: 
        !           159: void CItemWnd::OnSize(UINT, int, int)
        !           160: {
        !           161:        Dirty();
        !           162: 
        !           163:        // Stop tracking size.  If user didn't change size, the flag
        !           164:        // will be reset later.
        !           165:        m_fTrackSize = FALSE;
        !           166: }
        !           167: 
        !           168: 
        !           169: void CItemWnd::DoVerb(UINT nVerb)
        !           170:        // "run" the object
        !           171: {
        !           172:        if (GetEmbedded()->GetType() == OT_STATIC)
        !           173:                return;
        !           174:        CRect   rect;
        !           175:        GetClientRect(&rect);
        !           176: 
        !           177:        TRY
        !           178:        {
        !           179:                GetEmbedded()->Activate(nVerb, TRUE, TRUE, this, &rect);
        !           180:        }
        !           181:        CATCH (COleException, e)
        !           182:        {
        !           183:                GetEmbedded()->ReportError(e->m_status);
        !           184:        }
        !           185:        AND_CATCH (CException, e)
        !           186:        {
        !           187:                // general error when playing
        !           188:                m_pContainer->ErrorMessage(E_FAILED_TO_LAUNCH);
        !           189:        }
        !           190:        END_CATCH
        !           191: }
        !           192: 
        !           193: /////////////////////////////////////////////////////////////////////////////
        !           194: // Mouse messages
        !           195: 
        !           196: void CItemWnd::OnLButtonDblClk(UINT, CPoint)
        !           197: {
        !           198:        DoVerb(OLEVERB_PRIMARY);
        !           199: }
        !           200: 
        !           201: void CItemWnd::OnLButtonDown(UINT, CPoint point)
        !           202: {
        !           203:        m_pContainer->SetSelection(this);
        !           204: 
        !           205:        GetWindowRect(&dragRect);
        !           206:        GetParent()->ScreenToClient(&dragRect);
        !           207: 
        !           208:        dragPt = point;
        !           209: 
        !           210:        ClientToScreen(&dragPt);
        !           211:        GetParent()->ScreenToClient(&dragPt);
        !           212: 
        !           213:        SetCapture();
        !           214:        m_fCaptured = TRUE;
        !           215: }
        !           216: 
        !           217: void CItemWnd::OnLButtonUp(UINT, CPoint)
        !           218: {
        !           219:        if (!m_fCaptured)
        !           220:                return;
        !           221: 
        !           222:        ReleaseCapture();
        !           223:        m_fCaptured = FALSE;
        !           224: 
        !           225:        /* The object moved */
        !           226:        Dirty();
        !           227: }
        !           228: 
        !           229: void CItemWnd::OnMouseMove(UINT, CPoint point)
        !           230: {
        !           231:        if (!m_fCaptured)
        !           232:                return;
        !           233: 
        !           234:        ClientToScreen(&point);
        !           235:        GetParent()->ScreenToClient(&point);
        !           236: 
        !           237:        dragRect.OffsetRect(point.x - dragPt.x, point.y - dragPt.y);
        !           238:        MoveWindow(dragRect);
        !           239:        dragPt = point;
        !           240: }
        !           241: 
        !           242: /////////////////////////////////////////////////////////////////////////////
        !           243: // Serialization
        !           244: 
        !           245: // first WORD in stream is 0x5500 + extra bits
        !           246: 
        !           247: void CItemWnd::Serialize(CArchive& ar)
        !           248: {
        !           249:        // save the window information + embedded
        !           250:        CRect   rect;
        !           251: 
        !           252:        if (ar.IsStoring())
        !           253:        {
        !           254:                // First save our window part
        !           255:                ASSERT(m_fVisible);     // only serialize visible window
        !           256:                WORD w = 0x5500;        // magic value
        !           257:                if (m_fTrackSize)
        !           258:                        w += 1;
        !           259:                ar << w;
        !           260: 
        !           261:                // get window position (parent relative)
        !           262:                GetClientRect(&rect);
        !           263:                ClientToScreen(&rect);
        !           264:                GetParent()->ScreenToClient(&rect);
        !           265:                rect -= CPoint(GetSystemMetrics(SM_CXFRAME),
        !           266:                         GetSystemMetrics(SM_CYFRAME));
        !           267:                ar << rect;
        !           268:        }
        !           269:        else // loading
        !           270:        {
        !           271:                WORD w;
        !           272:                ar >> w;
        !           273: 
        !           274:                // First load our window part
        !           275:                if (HIBYTE(w) != 0x55)
        !           276:                {
        !           277:                        TRACE("Bad magic number in front of an item wnd\n");
        !           278:                        AfxThrowArchiveException(CArchiveException::generic);
        !           279:                }
        !           280:                m_fVisible = TRUE;
        !           281:                m_fTrackSize = (w & 1) != 0;
        !           282:                ar >> rect;
        !           283:        }
        !           284: 
        !           285:        // now do the OLE Embedded part
        !           286:        GetEmbedded()->Serialize(ar);
        !           287: 
        !           288:        if (ar.IsLoading())
        !           289:        {
        !           290:                // Wrap-up loading - create an ItemWnd as appropriate
        !           291:                if (!RestoreItemWindow(rect))
        !           292:                        AfxThrowArchiveException(CArchiveException::generic);
        !           293:        }
        !           294: }
        !           295: 
        !           296: /////////////////////////////////////////////////////////////////////////////
        !           297: // Special handling for OLE Client notification
        !           298: 
        !           299: void CEmbeddedItem::SetNames()
        !           300: {
        !           301:        if (GetType() == OT_EMBEDDED)
        !           302:                SetHostNames(AfxGetAppName(), GetName());
        !           303: }
        !           304: 
        !           305: // turn on hourglass when waiting for server
        !           306: 
        !           307: void CEmbeddedItem::WaitForServer()
        !           308: {
        !           309:        m_pView->m_pContainer->Hourglass(TRUE);
        !           310:        COleClientItem::WaitForServer();
        !           311:        m_pView->m_pContainer->Hourglass(FALSE);
        !           312: }
        !           313: 
        !           314: void CEmbeddedItem::OnChange(OLE_NOTIFICATION wNotification)
        !           315: {
        !           316:        /* Item just created or we are updating size */
        !           317:        if (m_pView->m_hWnd == NULL)
        !           318:                return;         // no window created yet
        !           319: 
        !           320:        if (m_pView->CanChangeBounds())
        !           321:        {
        !           322:                CRect rect;
        !           323: 
        !           324:                if (GetBounds(&rect))
        !           325:                {
        !           326:                        FixObjectBounds(rect);
        !           327:                        m_pView->SetInitialBounds(rect);
        !           328:                }
        !           329:                else
        !           330:                {
        !           331:                        // Blank object
        !           332:                        if (wNotification == OLE_CLOSED)
        !           333:                        {
        !           334:                                // no data received for the object - destroy it
        !           335:                                // we can't call destroy window here since we are
        !           336:                                //   and OLE callback - so we post a close message instead
        !           337:                                m_pView->PostMessage(WM_CLOSE);
        !           338:                                return;
        !           339:                        }
        !           340:                }
        !           341:        }
        !           342: 
        !           343:        m_pView->InvalidateRect(NULL, TRUE);    // erase it
        !           344:        m_pView->Dirty();
        !           345: }
        !           346: 
        !           347: void CItemWnd::SetInitialBounds(const CRect& rect)
        !           348: {
        !           349:        BOOL fTrackSizeSave = m_fTrackSize; // save since OnSize will change it
        !           350:        SetWindowPos(NULL, 0, 0,
        !           351:                rect.right - rect.left + 2*GetSystemMetrics(SM_CXFRAME),
        !           352:                rect.bottom - rect.top + 2*GetSystemMetrics(SM_CYFRAME),
        !           353:                SWP_NOZORDER | SWP_NOMOVE | SWP_DRAWFRAME);
        !           354:        m_fTrackSize = fTrackSizeSave;
        !           355: 
        !           356:        // show it
        !           357:        m_fVisible = TRUE;
        !           358:        ShowWindow(SW_SHOW);
        !           359:        m_pContainer->SetSelection(this);
        !           360: }
        !           361: 
        !           362: /////////////////////////////////////////////////////////////////////////////
        !           363: // A way to get the thick frame window to look good
        !           364:        // not a generally useful trick
        !           365: 
        !           366: void CItemWnd::Select(BOOL bOn)
        !           367: {
        !           368:        if (m_hWnd != NULL)
        !           369:                SendMessage(WM_NCACTIVATE, bOn);
        !           370: }
        !           371: 
        !           372: /////////////////////////////////////////////////////////////////////////////
        !           373: // Diagnostics
        !           374: 
        !           375: #ifdef _DEBUG
        !           376: void CItemWnd::AssertValid() const
        !           377: {
        !           378:        ASSERT(m_pContainer != NULL);
        !           379: }
        !           380: #endif
        !           381: 
        !           382: /////////////////////////////////////////////////////////////////////////////

unix.superglobalmegacorp.com

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