The information in this article applies to:
- Microsoft Visual C++, 32-bit Edition, versions 4.0, 5.0
SUMMARY
ActiveX controls are most often used in CDialog- or CFormView-derived
classes. There are occasions that call for an ActiveX Control to be a child
of a window that is not associated with a dialog template, such as a CWnd.
Adding event handlers for a control created as a child of a CWnd requires a
slightly different approach than adding the same handlers for the control
when placed on a dialog. This article provides step-by-step instructions
for adding event handlers to the CWnd-derived class that parents the
control.
MORE INFORMATION
Step-by-Step Example
Use the following steps to create an ActiveX control dynamically in a CWnd-
derived window. The control used here is the Circ3 control from the Circle
Tutorial, but the approach is valid for any OLE control. After creating the
control, handlers are created for Circ3's ClickIn and ClickOut events.
- Create the application that is to contain the ActiveX control. This
application must include support for ActiveX controls. Select the window
that is to be the parent of the ActiveX control. This window could be an
SDI or MDI view or any window of a CWnd-derived class.
- Insert the Circ3 control from the Component Gallery. At this point,
ClassWizard will add a wrapper class for the Circ3 control and will add
Circ3 to the toolbar in the dialog editor.
- On the Insert menu, click Resource, and then click Dialog to insert a
new dialog resource into the project. Select Circ3 from the toolbar, and
add it to your dialog. Note the control ID will be something like
IDC_CIRC3CTRL1.
- With the dialog still open in the editor, press CTRL+W to bring up
ClassWizard. At this point, you will see the "Adding a Class" dialog
box. Choose "Select an existing class," and specify the CWnd-derived
class. Click Yes to confirm that this is not a dialog class.
- In ClassWizard, select the object ID of the Circ3 control in the "Object
ID's" Pane. You will see the control's events listed in the messages
window. Select ClickIn, and click ADD FUNCTION. Then select ClickOut,
and click ADD FUNCTION. ClassWizard adds the appropriate EVENTSINK_MAP,
ON_EVENT macros, and event handlers to the class specified in Step 4.
NOTE: Add all necessary handlers at this time. In order to add more
handlers later, you must delete the dialog resource and repeat this
process.
- Add a CCirc3 member variable named m_circ to the CWnd-derived class
declaration as shown below. You must include the header file of the
CCirc3 wrapper class for this declaration:
CCirc3 m_circ;
- Use ClassWizard to override the Create() virtual function for the CWnd-
derived class. In the handler, call Create() to create the Circ3 child
control as shown below.
NOTE: If you are creating the ActiveX control in a view, you may
override OnInitialUpdate() instead of Create().
BOOL MyCWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID,
CCreateContext* pContext)
{
BOOL result = CWnd::Create(lpszClassName, lpszWindowName, dwStyle,
rect, pParentWnd, nID, pContext);
if(result != 0) //Create the Circ3 ActiveX control.
result = m_circ.Create("Test", WS_VISIBLE, CRect(1,1,130, 120),
this, IDC_CIRC3CTRL1);
return result;
}
IMPORTANT: Parameter 5 is the ID for the control. This ID must match the
ID used in the ON_EVENT macro created by ClassWizard. This is the ID of
the Circ3 control created in Step 3.
- After adding the necessary event handlers, you may delete the temporary
dialog resource from the project. After you delete the dialog resource,
you will need to add the m_circ member variable and a #define for
IDC_CIRC3CTRL1, the ID of the Circ3 control.
Optional: Another approach often used to add event handlers to CWnd-derived
classes is to add controls and event handlers to a dialog class, and then
cut and paste the appropriate code into the View.h and View.cpp files
making modifications as necessary. Note, however, that the previous method
is less prone to errors.
REFERENCES
"MFC 4.0 Helps You Contain Your OLE Controls," MSDN Nov/Dec 1995.
OLE Control Containers: Using AppWizard to Create a Container Application
OLE Control Containers: Programming OLE Controls in an OLE Control
Container - Visual C++ Books Online, MFC Encyclopedia
|