Add a WTL MDI window into an ATL Control






4.77/5 (10 votes)
Sep 12, 2003
1 min read

69516

1621
This article will show you how to make MDI window of WTL into ATL control by using a real world example.
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 CreateMdiEx
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.
//#define _ATL_NO_AUTOMATIC_NAMESPACE ... #include "resource.h" #include <atlbase.h> //... // if you use VC7 //------------------------------------- #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.
... /* class CMdiControlModule : public CAtlDllModuleT< CMdiControlModule > { public : DECLARE_LIBID(LIBID_MdiControlLib) DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MDICONTROL, "{DA155D37-087A-4865-BD60-A88A95F21C4B}") }; CMdiControlModule _AtlModule; */ 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.
..... // register object for message filtering and idle updates //CMessageLoop* pLoop = _Module.GetMessageLoop(); //ATLASSERT(pLoop != NULL); //pLoop->AddMessageFilter(this); //pLoop->AddIdleHandler(this); ....
Done! You had an ActiveX with MDI, that can be shown in IE.