KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q280801: INFO: Avoid WS_CLIPCHILDREN and ActiveX Control Painting Problem

Article: Q280801
Product(s): Microsoft C Compiler
Version(s): 3.0
Operating System(s): 
Keyword(s): kbATL kbMFC kbDSupport
Last Modified: 26-JUN-2001

-------------------------------------------------------------------------------
The information in this article applies to:

- The Microsoft Active Template Library (ATL) 3.0 
- The Microsoft Foundation Classes (MFC) 
-------------------------------------------------------------------------------

SUMMARY
=======

An in-place container must use the WS_CLIPCHILDREN window style for the window
that it uses as the parent for an ActiveX Control in order to avoid repainting
problems.

MORE INFORMATION
================

The WS_CLIPCHILDREN style excludes the area occupied by child windows when you
draw within the parent window:

  http://msdn.microsoft.com/library/psdk/winui/windows_2v90.htm

To avoid repainting over an in-place object's output, the style must be applied
to the parent window of the object.

For Microsoft Foundation Classes (MFC) OLE (and Active) Document Containers, the
framework implicitly sets this style during in-place activation. However, the
style must be explicitly added for other situations in which in-place activation
is involved. From the point of view of MFC and Active Template Library (ATL)
containers, this is typically when hosting ActiveX controls.

Approaches for MFC Containers
-----------------------------

- For MFC CWnd (including CView and CDialog) derived classes that host ActiveX
  controls, the style can be added by adding an override for the virtual
  PreCreateWindow() function and modifying cs.style. For instance, here's how
  PreCreateWindow would look in a CView-derived class:

  BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
  {
  	// Add the WS_CLIPCHILDREN style to avoid repaint problems:
  	cs.style |= WS_CLIPCHILDREN;

  	return CView::PreCreateWindow(cs);
  }

- Another way of adding the WS_CLIPCHILDREN style to a CDialog-derived class is
  through the Dialog editor, Styles tab, by selecting Clip children.

Approaches for ATL Containers
-----------------------------

- For ATL-based container windows derived from CWindowImpl, the WS_CLIPCHILDREN
  style can be specified through Window Traits. For CWindowImpl-derived
  classes, the default traits are specified in the CControlWinTraits class,
  which does include the WS_CLIPCHILDREN style by default. For more information
  on ATL windowing classes and window traits, see the following Microsoft Web
  page:

  ATL 3.0 Window Classes: An Introduction (SubTopic: Using Window Traits to
  Specify Styles)
  http://msdn.microsoft.com/library/techart/atlwindow.htm#atlwindow_topic13

- For ATL-based dialog boxes, the base class CAxDialogImpl does not derive from
  CWindowImpl, and hence does not have these traits. Custom CWinTraits cannot
  be specified for CAxDialogImpl either. The WS_CLIPCHILDREN style can be added
  through the Dialog editor, Styles tab, by selecting Clip children.

Approaches Common to MFC and ATL
--------------------------------

- If the windows are being created explicitly through either CWnd::Create (for
  MFC) or CWindow::Create (for ATL), the WS_CLIPCHILDREN style can be specified
  through the dwStyle parameter.

- A way of dynamically modifying the style, once the window has been created
  and has a valid HWND, is through CWnd::ModifyStyle for MFC windows, or
  CWindow::ModifyStyle for ATL windows.

REFERENCES
==========

CWnd::PreCreateWindow
http://msdn.microsoft.com/library/devprods/vs6/visualc/vcmfc/_mfc_cwnd.3a3a.precreatewindow.htm

CWnd::Create
http://msdn.microsoft.com/library/devprods/vs6/visualc/vcmfc/_mfc_cwnd.3a3a.create.htm

CWindow::Create
http://msdn.microsoft.com/library/devprods/vs6/visualc/vcmfc/vcrefcwindowcreate.htm

CWnd::ModifyStyle
http://msdn.microsoft.com/library/devprods/vs6/visualc/vcmfc/_mfc_cwnd.3a3a.modifystyle.htm

CWindow::ModifyStyle
http://msdn.microsoft.com/library/devprods/vs6/visualc/vcmfc/_atl_cwindow.3a3a.modifystyle.htm

For a specific example of incorrect repainting, see the following Microsoft
Knowledge Base article:

  Q220021 BUG: CHtmlView Does Not Repaint Correctly in AppWizard MDI APP

CHtmlView acts as a container window for the Microsoft WebBrowser Control:

  http://msdn.microsoft.com/workshop/browser/webbrowser/WebBrowser.asp

(c) Microsoft Corporation 2000, All Rights Reserved. Contributions by S. Ganesh,
Microsoft Corporation.


Additional query words:

======================================================================
Keywords          : kbATL kbMFC kbDSupport 
Technology        : kbAudDeveloper kbMFC kbATLsearch kbATL300
Version           : :3.0
Issue type        : kbinfo

=============================================================================

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.

Copyright Microsoft Corporation 1986-2002.