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


浙公网安备 33010602011771号