activex控件与窗口分割

第一步:新建一个MFC的activex工程,工程名为TestATX;

第二步:添加一个新类,取名为CMainFrame,以CFrameWnd为基类;

第三步:在CTestATXtCtrl中添加成员变量:CMainFrame* m_pMainFrame;在构造函数中添加如下代码:

CTestATXCtrl::CTestATXCtrl()

{

 InitializeIIDs(&IID_DTestATX, &IID_DTestATXEvents);

  m_pMainFrame= new CMainFrame;

}


第四步:在CTestATXtCtrl中添加WM_CREATE的消息响应,并添加如下代码:

int CTestATXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

      if (COleControl::OnCreate(lpCreateStruct) == -1)

         return -1;

      // 创建框架窗口

       m_pMainFrame->Create(NULL,NULL,WS_CHILD | WS_VISIBLE,CRect(0, 0, 0, 0), this);

      m_pMainFrame->ShowWindow(SW_SHOW);

      m_pMainFrame->UpdateWindow();

      return 0;

}

第五步:在CTestATXtCtrl中添加WM_SIZE的消息响应,并添加如下代码:

void CTestATXCtrl::OnSize(UINT nType, int cx, int cy)

{

 COleControl::OnSize(nType, cx, cy);

 //传入控件大小,并设置框架窗口大小与控件大小相同

 m_pMainFrame->MoveWindow( 0,0,cx,cy,false );

 }

第六步:将CMainFrame的构造函数和析构函数改为public:

public:

      CMainFrame();           // 动态创建所使用的受保护的构造函数

      virtual ~CMainFrame();


经过以上几步,控件已经具备了一个框架窗口,接下来就要对这个框架窗口进行拆分了:

 第七步:添加一个新类CSplitWindow,以CWnd为基类;创建成功后,将基类改为CSplitterWnd;

第八步:添加两个新类CLeftView和CRightView,这里分别以CTreeView和CScrollView为基类;

第九步:在CMainFrame中添加成员变量:

public:

     CSplitWindow m_split;

     CLeftView* m_pLeftView;

     CRightView* m_pRightView;


第十步:重写CMainFrame的虚函数OnCreateClient,添加如下代码:

 

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

{

 //分割窗口

 if (!m_split.CreateStatic(this,1,2))

 {

  return false;

 }

 m_split.CreateView(0,0,RUNTIME_CLASS(CLeftView),CSize(0,0),pContext);

 m_split.CreateView(0,1,RUNTIME_CLASS(CRightView),CSize(0,0),pContext);

 m_pLeftView=(CLeftView*)m_split.GetPane(0,0);

 m_pRightView=(CRightView*)m_split.GetPane(0,1);

 //return CFrameWnd::OnCreateClient(lpcs, pContext);

 return true;//不再调用父类的函数

}

第十一步:在CTestATXCtrl::OnSize中增加如下代码:

 

void CTestATXCtrl::OnSize(UINT nType, int cx, int cy)

{

 COleControl::OnSize(nType, cx, cy);

 //传入控件大小,并设置框架窗口大小与控件大小相同

 m_pMainFrame->MoveWindow( 0,0,cx,cy,false );

 //设置栏宽

 CRect rect;

 GetWindowRect(rect);

 m_pMainFrame->m_split.SetColumnInfo(0,rect.Width()/4,10);

 m_pMainFrame->m_split.SetColumnInfo(1,rect.Width()*3/4,10);

 m_pMainFrame->m_split.RecalcLayout();

}

第十二步:最后,记得在使用各个类的时候,添加它们相应的头文件。OK,效果图如下:

 

posted @ 2011-06-09 09:13  古老的陶罐  阅读(311)  评论(0编辑  收藏  举报