使用CSplitterWnd分割窗口(一)
1.1、基本的CSplitterWnd的使用
1.1.1 在CMainFrame中添加一个CSplitterWnd成员:
CSplitterWnd m_splitterwnd1;
1.1.2 基于CView创建两个新的视图类,CViewLeft和CViewRight,一个用于在左边显示,一个用于在右边显示。
1.1.3 重载CMainFrame的OnCreateClient函数,在并其中调用CSplitterWndr的CreateStatic函数创建该分割窗口,CreateView函数创建左右两个视图,SetColumnInfo设定分割窗口的列的宽度:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext*pContext)
{
// TODO:
在此添加专用代码和
/
或调用基类
m_mysplitter1.CreateStatic(this, 1, 2);
//
创建一个一行二列的分割窗口
m_mysplitter1.CreateView(0, 0, RUNTIME_CLASS(CViewLeft),CSize(0, 0),
pContext);
//
建立第
0
行第
0
列的视图
m_mysplitter1.CreateView(0, 1,RUNTIME_CLASS(CViewRight), CSize(0, 0),
pContext);
//
建立第
0
行第
1
列的视图
m_mysplitter1.SetColumnInfo(0,250, 10); //设定某列的宽度,这里表示设定第0列的理想宽度为250像素,最小宽度为10像素(什么是最小宽度?没弄明白)
return TRUE;
//returnCFrameWnd::OnCreateClient(lpcs, pContext);
}
运行后就可以看到生成了分割为左右两个视图的窗口。
1.2、为分割窗添加一些自己需要的功能
从系统的CSplitterWnd类派生一个新类。
在类视图中右键,选择“添加”->“类”,在弹出窗口中选择MFC类,输入新类的名字CMySplitter,基类选择为CWnd(这里基类的选项里面没有CSplitterWnd,所以要先选择Cwnd)。然后把生成的MySplitter.h和MySplitter.cpp里面的三个地方的“Cwnd”改成“CSplitterWnd”。
MySplitter.h中:
class CMySplitter : public CSplitterWnd
Mysplitter.cpp中:
IMPLEMENT_DYNAMIC(CMySplitter, CSplitterWnd)
BEGIN_MESSAGE_MAP(CMySplitter, CSplitterWnd)
1.2.1 双击分隔栏展开或者收起左边的一栏
重载OnLButtonDblClk函数:
void CMySplitterWnd::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO:
在此添加消息处理程序代码和
/
或调用默认值
//CSplitterWnd::OnLButtonDblClk(nFlags,point);
int left, min;
GetColumnInfo(0, left, min);
//
得到第
0
栏(即左边的一栏)的宽度
if(left == 0 || left == min)
//
如果当前已经是收起的状态
{
SetColumnInfo(0, 250, 10);
//
重新设置左边一栏的宽度,这里设置为
250
,即展开
}
else
{
SetColumnInfo(0, 0, 10);
//
重新设置左边一栏的宽度,这里设置为
0
,即收起
}
RecalcLayout();
//
重新构建窗口布局
}
1.2.2 设置分隔栏的宽度
在CMySplitter的构造函数中(这里是把宽度设为11像素):
m_cxSplitterGap = 11;
m_cxSplitter = 11;
几个相关变量的意义:
//int m_cxSplitter, m_cySplitter; // size of splitter bar
//int m_cxBorderShare, m_cyBorderShare; // space on either side of splitter
//int m_cxSplitterGap, m_cySplitterGap; // amount of space between panes
//int m_cxBorder, m_cyBorder; // borders in client area
1.2.3 禁止拖动分隔栏的位置
(1)重载OnLButtonDown函数,改成什么都不做:
void CMySplitter::OnLButtonDown(UINT nFlags, CPoint point)
{
//TODO: 在此添加消息处理程序代码和/或调用默认值
//CSplitterWnd::OnLButtonDown(nFlags,point);
}
(2)重载OnMouseMove函数,也改成什么都不做:
void CMySplitter::OnMouseMove(UINT nFlags, CPoint point)
{
//TODO: 在此添加消息处理程序代码和/或调用默认值
设置窗口为对话框,添加控件(二)
2. 添加CFormView类作为视图类
在(一)中学会了如何分割窗口,但是在1.2中如果窗口的CEditView, CTreeView,CView类,这些类是不支持添加对话框的,只有在1.2中设置添加CFormView类才可以。
CFormView
是
CView
类的派生类
,
在
CFormView
类里可以放很多控件
,
即
“
带有菜单并可以添加控件的工程
”
。
在ClassWizard里添加新的类,基类选为CFormView类。在此之前必须新建一个对话框资源,在对话框的设置里面,把style的popup 弹出改成child 下层,不然的话会出现错误:
Debug Assertion Failed! FILE viewform.cpp , line 69。
2.1 新建一个对话框资源,在对话框的设置里面,把style的popup 弹出改成child 下层
2.2 在ClassWizard里添加新的类,基类选为CFormView类