Microsoft KB Archive/168326

= How To Define the Display Size of an MFC ActiveX Control =

Article ID: 168326

Article Last Modified on 11/21/2006

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft Visual C++ 4.2 Enterprise Edition

 Microsoft Visual C++ 4.2 Enterprise Edition

 Microsoft Visual C++ 5.0 Enterprise Edition

 Microsoft Visual C++ 6.0 Enterprise Edition</li></ul>

 Microsoft Visual C++ 4.2 Professional Edition</li></ul>

 Microsoft Visual C++ 4.2 Professional Edition</li></ul>

 Microsoft Visual C++ 5.0 Professional Edition</li></ul>

 Microsoft Visual C++ 6.0 Professional Edition</li></ul>

 Microsoft Visual C++ 6.0 Standard Edition</li></ul>

 Microsoft Visual C++ .NET 2002 Standard Edition</li></ul> </li> Microsoft Visual C++ .NET 2003 Standard Edition</li></ul>

-

<div class="notice_section">

This article was previously published under Q168326

<div class="notice_section">

<div class="notice_section">

NOTE: Microsoft Visual C++ .NET (2002) supports both the managed code model that is provided by the .NET Framework and the unmanaged native Windows code model. Part or all of the information in this article applies to managed Visual C++ code and may be applied only by using the .NET Framework.

<div class="summary_section">

SUMMARY
Sometimes you need to limit an ActiveX control's minimum or maximum size at design time. This article explains how to do this by overriding the virtual COleControl::OnSetExtent method.

<div class="moreinformation_section">

MORE INFORMATION
The COleControl::OnSetExtent method is called by COleControl::XOleObject::SetExtent. COleControl::XOleObject is COleControl's IOleObject implementation. A container calls IOleObject::SetExtent when it needs to dictate to an embedded object the size at which it will be displayed.

COleControl::OnSetExtent takes one parameter, a pointer to a SizeL structure. The SizeL structure contains the new size that the container is requesting for the control in HIMETRIC units.

If a you need to limit a control to a certain size, you need to make it override COleControl::OnSetExtent and do the following:


 * 1) Make any necessary unit conversions on the SizeL structure passed in.
 * 2) Check the size in the SizeL structure that was passed in.
 * 3) If the control cannot accommodate the request, return false.
 * 4) Otherwise, pass the (unmodified) SizeL to the base class' implementation of OnSetExtent.

See the Sample Code section below for an example of how to override COleControl::OnSetExtent to limit the size of an ActiveX control.

Sample Code
The following code snippet shows how to override COleControl::OnSetExtent so that the height of the control will never be smaller than 20 pixels. BOOL CTestCtrl::OnSetExtent(LPSIZEL lpSizeL) {        // This function limits the height of a control to be at         // least 20 pixels.

// Use the desktop window to get a DC so we can use // CDC::HIMETRICtoDP and CDC::DPtoHIMETRIC CWnd *pWnd = CWnd::FromHandle(::GetDesktopWindow); CClientDC dc(pWnd);

CSize sz(lpSizeL->cx,lpSizeL->cy); dc.HIMETRICtoDP(&sz); //Convert the size to pixels

if (sz.cy < 20) return false;

return COleControl::OnSetExtent(lpSizeL); }

Note that the code is identical up to and including the line that says "if (sz.cy is greater than 20)". The new code also lacks the "TRACE" lines.

<div class="references_section">