HOWTO: Define the Display Size of an MFC ActiveX Control

Last reviewed: July 31, 1997
Article ID: Q168326
The information in this article applies to:
  • The Microsoft Foundation Classes (MFC) included with: - Microsoft Visual C++, 32-bit Editions, versions 4.2, 4.2b, 5.0

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.

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 and change it if necessary.

  3. If necessary, reconvert the SizeL structure to HIMETRIC units.

  4. Pass the SizeL structure 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)
      {
         TRACE("%ld\n",sz.cy);

         //size is less than 20, set it to 20
         sz.cy = 20;
         dc.DPtoHIMETRIC(&sz);//re-convert to HIMETRIC
         lpSizeL->cy = sz.cy;
      }
      else
      {
         TRACE("%ld\n",sz.cy);

         //no conversion necessary
      }

      return COleControl::OnSetExtent(lpSizeL);
   }

REFERENCES

An ActiveX control may be defined to be the size of the dialog template from which it was created. For additional information, please see the following article in the Microsoft Knowledge Base:

   ARTICLE-ID: Q155973
   TITLE     : SAMPLE: Create an ActiveX Control with a Dialog Resource


Additional query words: ocx
Keywords : MfcOLE kbfasttip
Technology : kbole kbmfc
Version : 4.2 4.2b 5.0
Platform : NT WINDOWS
Issue type : kbhowto


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: July 31, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.