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,效果图如下: