1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

transparent MFC activeX control

Discussion in 'MFC' started by praxisist, May 7, 2008.

  1. praxisist

    praxisist New Member

    Joined:
    May 7, 2008
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    Occupation:
    通过社会主义实现自由Freedom through Soci
    Location:
    中国共产党人党
    Home Page:
    INFO: Making Transparent Controls with MFC
    Last reviewed: February 17, 1998
    Article ID: Q165073
    The information in this article applies to:

    * Microsoft Visual C++, 32-bit Editions, versions 4.2, 5.0

    SUMMARY

    The OLE Control '96 Specification defines transparent controls and Visual C++ 4.2 will create controls that conform to this new specification. However, most available containers, including Internet Explorer 3.0, do not support this feature. This article demonstrates the process required to convert a standard Visual C++ ControlWizard control to be transparent in Internet Explorer 3.0.

    MORE INFORMATION

    Steps to Create a Transparent OLE Control

    1. Create a default control using the ControlWizard.

    2. Override PreCreateWindow for the control as shown below. You will need to add the prototype and handler manually because ClassWizard does not provide an override for PreCreateWindow in the case of controls:
    Code:
                BOOL CTransCtrl::PreCreateWindow(CREATESTRUCT& cs)
                {
    
                   // Add the Transparent style to the control
                   cs.dwExStyle |= WS_EX_TRANSPARENT;
    
                   return COleControl::PreCreateWindow(cs);
                }
    
    3. To get the control to show what is behind it, use the trick shown below, which sends a WM_ERASEBKGND message to the parent with the handle to the control's device context. Use ClassWizard to add a handler for WM_ERASEBKGND and add the following code:
    Code:
                BOOL CTransCtrl::OnEraseBkgnd(CDC* pDC)
                {
    
                   // This is needed for transparency and the correct drawing...
                   CWnd*  pWndParent;       // handle of our parent window
                   POINT  pt;
    
                   pWndParent = GetParent();
                   pt.x       = 0;
                   pt.y       = 0;
    
                   MapWindowPoints(pWndParent, &pt, 1);
                   OffsetWindowOrgEx(pDC->m_hDC, pt.x, pt.y, &pt);
                   ::SendMessage(pWndParent->m_hWnd, WM_ERASEBKGND,
                                (WPARAM)pDC->m_hDC, 0);
                   SetWindowOrgEx(pDC->m_hDC, pt.x, pt.y, NULL);
    
                   return 1;
                }
    
    4. Modify the OnDraw() function to display the desired image for the control. The example below draws an ellipse. If you do not select the NULL_BRUSH before drawing, the inside of the ellipse is filled in using the current brush.

    NOTE: If you do not select your own pens and brushes, the resulting behavior is unpredictable and depends on the GDI objects passed by the control container.
    Code:
                void CTransCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const
    
                                        CRect& rcInvalid)
                {
                   CPen* oldpen;  CBrush* oldbrush;
    
                   oldpen = (CPen*) pdc->SelectStockObject(BLACK_PEN);
                   oldbrush = (CBrush*) pdc->SelectStockObject(NULL_BRUSH);
    
                   pdc->Ellipse(rcBounds);
    
                   pdc->SelectObject(oldpen);
                   pdc->SelectObject(oldbrush);
                }
    
    5. Override the OnSetClientSite() function to set the m_bAutoClip member variable to TRUE. The COleControl::m_bAutoClip variable is an undocumented variable that is used to maintain a window that clips the contents of the control to its design-time size:
    Code:
                void CTransCtrl::OnSetClientSite()
                {
    
                   m_bAutoClip = TRUE;
    
                   COleControl::OnSetClientSite();
                }
    
     
  2. NewsBot

    NewsBot New Member

    Joined:
    Dec 2, 2008
    Messages:
    1,267
    Likes Received:
    2
    Trophy Points:
    0
    Nice one. You can submit the articles into our other forum - www.go4expert.com where you can win prizes if your article wins the Article of the Month award.
     

Share This Page