Introduction
The acticle will tell you how to easily add a WTL MDI window into an ATL Control.
Background
I found that there are no articles about MDI in ActiveX using ATL/WTL. In VS.NET , I also could not find a Wizard for it, so I decided to share my idea about MDI in ActiveX with you.
How to Do it
Step 1
Create ATL Control Project - MdiControl and Create
MdiEx
Control
Step 2
Create WTL MDI Application - MdiControlMdiWnd
Step 3
Copy MdiControlMdiWnd
res folder and the files what you want to MdiControl
folder
Step 4
Add MdiControlMdiWnd.rc and Resource.h of MdiControlMdiWnd
into the MdiControl folder
Step 5
Copy my classes Yf_Control.h, YF_Module.cpp and YF_Module.h into MdiControl folder
Step 6
Open MdiControl project and add all of files that you copied into MdiControl folder
Step 7
Open stdafx.h and modify based on the following.
...
#include "resource.h"
#include <atlbase.h>
#include "YF_Module.h"
#include <atlcom.h>
#include <atlhost.h>
#include <atlwin.h>
#include <atlctl.h>
#include <atlapp.h>
#include <atlframe.h>
#include <atlctrls.h>
#include <atlctrlw.h>
#include <mshtml.h>
#include <exdisp.h>
#include <shlguid.h>
...
Step 8
Open MdiControl.cpp and modify based on the following.
...
YF_DECLARE_LIBID(LIBID_MdiControlLib)
YF_DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MDICONTROL,
"{DA155D37-087A-4865-BD60-A88A95F21C4B}")
#define _AtlModule _Module
...
Step 9
Open MdiEx.h and modify based on the following.
...
#include "YF_Control.h"
...
class ATL_NO_VTABLE CMdiEx :
...
public IOleObjectImpl_YF<CMdiEx>,
...
public CComControl_YF<CMdiEx>,
...
...
CMdiEx()
{
m_bWindowOnly = TRUE;
}
...
BEGIN_MSG_MAP(CMdiEx)
...
CHAIN_MSG_MAP(CComControl_YF<CMdiEx>)
...
END_MSG_MAP()
.....
STDMETHOD(TranslateAccelerator)(LPMSG pMsg)
{
CComControl_YF<CMdiEx>::PreTranslateMessage(pMsg);
return S_OK;
}
...
Step 10
Create MdiEx
Event Interface
[id(1), helpstring("method OnClose")] HRESULT OnClose(void);
Step 11
Open MainFrm.h and modify based on the following in OnCreate
Method.
.....
....
Done! You had an ActiveX with MDI, that can be shown in IE.