Help and Support
 

powered byLive Search

How to retrieve the actual parent window of an ActiveX control

Article ID:150204
Last Review:November 21, 2006
Revision:4.1
This article was previously published under Q150204
On This Page

SUMMARY

An ActiveX control is created as a child of the window of the container most closely associated with the site object. This article describes how to obtain the parent window of an ActiveX control, and why calling GetParent or CWnd::GetParent for an ActiveX control may not return its actual parent window.

Back to the top

MORE INFORMATION

An ActiveX control typically gains access to the following container windows:
Frame window: the outer-most container window where the container's main menu resides. An ActiveX control retrieves this window handle by calling either IOleInPlaceFrame::GetWindow or IOleInPlaceSite::GetWindowContext.
Site window: the container window that contains the ActiveX control's view. An ActiveX control retrieves this container window by calling IOleInPlaceSite::GetWindow.
However, ActiveX control containers generated using MFC and Microsoft Visual Basic 4.0 or 5.0 use the same window for the frame and the site object.

When the MFC framework creates an ActiveX control's window, it retrieves the window associated with the container's site object by calling IOleInPlaceSite::GetWindow. The returned window is made the parent of the ActiveX control, except in the following two cases, where the framework creates a reflector window that reflects the notification messages:
The ActiveX control subclasses a Windows control, and the container does not support message reflection.
The control container does not support automatic clipping of its controls.
In these two scenarios, the ActiveX control is made a child of the reflector window whose parent is the window returned from IOleInPlaceSite::GetWindow.

Note If IOleObject::DoVerb with OLEIVERB_OPEN is invoked on an ActiveX control, and if in-place activation is not possible, an outer frame window is created and becomes the parent of the ActiveX control.

Back to the top

Sample code

   // The following code should return the
   // actual parent window of the ActiveX control.
   HWND CMyOleControl::GetActualParent()
   {
       HWND hwndParent = 0;

       // Get the window associated with the in-place site object,
       // which is connected to this ActiveX control.
       if (m_pInPlaceSite != NULL)
           m_pInPlaceSite->GetWindow(&hwndParent);

       return hwndParent;     // Return the in-place site window handle.
   }
				

Back to the top

REFERENCES

Online Documentation for IOleWindow::GetWindow
MFC source code for COleControl::OnActivateInPlace and COleControl::CreateControlWindow.

Back to the top


APPLIES TO
Microsoft Foundation Class Library 4.2, when used with:
  Microsoft Visual C++ 1.5 Professional Edition
  Microsoft Visual C++ 1.51
  Microsoft Visual C++ 1.52 Professional Edition
  Microsoft Visual C++ 2.0 Professional Edition
  Microsoft Visual C++ 2.1
  Microsoft Visual C++ 2.2
  Microsoft Visual C++ 4.0 Standard Edition
  Microsoft Visual C++ 4.1 Subscription
  Microsoft Visual C++ 5.0 Enterprise Edition
  Microsoft Visual C++ 5.0 Professional Edition
  Microsoft Visual C++ 6.0 Enterprise Edition
  Microsoft Visual C++ 6.0 Professional Edition
  Microsoft Visual C++, 32-bit Learning Edition 6.0

Back to the top

Keywords: 
kbhowto kbproperties kbdlg kbctrl KB150204

Back to the top

Article Translations

 

Other Support Options

  • Need More Help?
    Contact a Support professional by Email, Online or Phone.
  • Customer Service
    For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
  • Newsgroups
    Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.