65.9K
CodeProject is changing. Read more.
Home

Add a WTL MDI window into an ATL Control

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.77/5 (10 votes)

Sep 12, 2003

1 min read

viewsIcon

69516

downloadIcon

1621

This article will show you how to make MDI window of WTL into ATL control by using a real world example.

Sample Image - MdiControl.jpg

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.

//#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.