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
- Create a default control using the ControlWizard.
- 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:
BOOL CTransCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
// Add the Transparent style to the control
cs.dwExStyle |= WS_EX_TRANSPARENT;
return COleControl::PreCreateWindow(cs);
}
- 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:
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;
}
- 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.
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);
}
- 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:
void CTransCtrl::OnSetClientSite()
{
m_bAutoClip = TRUE;
COleControl::OnSetClientSite();
}
Keywords : MfcOLE kbgraphic kbtool kbinf
Technology : kbole kbMfc
Version : Winnet:4.2,5.0
Platform : NT WINDOWS
|