65.9K
CodeProject 正在变化。 阅读更多。
Home

将 WTL MDI 窗口添加到 ATL 控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.77/5 (10投票s)

2003年9月12日

1分钟阅读

viewsIcon

70223

downloadIcon

1621

本文将展示如何通过一个实际示例将 WTL MDI 窗口嵌入到 ATL 控件中。

Sample Image - MdiControl.jpg

引言

本文将介绍如何轻松地将 WTL MDI 窗口添加到 ATL 控件中。

背景

我发现没有关于使用 ATL/WTL 在 ActiveX 中使用 MDI 的文章。在 VS.NET 中,我也找不到它的向导,所以我决定与大家分享我在 ActiveX 中使用 MDI 的想法。

操作步骤

步骤 1

创建 ATL 控件项目 - MdiControl 并创建 MdiEx 控件

第二步

创建 WTL MDI 应用程序 - MdiControlMdiWnd

步骤 3

MdiControlMdiWnd res 文件夹和您想要的文件复制到 MdiControl 文件夹


步骤 4

MdiControlMdiWnd MdiControlMdiWnd.rcResource.h 添加到 MdiControl 文件夹

步骤 5

将我的类 Yf_Control.h, YF_Module.cpp YF_Module.h 复制到 MdiControl 文件夹

步骤 6

打开 MdiControl 项目并将您复制的所有文件添加到 MdiControl 文件夹

步骤 7

打开 stdafx.h 并根据以下内容进行修改。

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

步骤 8

打开 MdiControl.cpp 并根据以下内容进行修改。

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

步骤 9

打开 MdiEx.h 并根据以下内容进行修改。

...
#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;
 }
...

第 10 步

创建 MdiEx 事件接口

[id(1), helpstring("method OnClose")] HRESULT OnClose(void);

第 11 步

打开 MainFrm.h 并在 OnCreate 方法中根据以下内容进行修改。

.....
 // register object for message filtering and idle updates
 //CMessageLoop* pLoop = _Module.GetMessageLoop();
 //ATLASSERT(pLoop != NULL);
 //pLoop->AddMessageFilter(this);
 //pLoop->AddIdleHandler(this);
....

完成!您已经拥有一个带有 MDI 的 ActiveX,可以在 IE 中显示。

© . All rights reserved.