不带doc/view结构的窗口分割,在CMainFrame::OnCreateClient()函数中实现时会有一些问题:窗口已经分割了,但是看不见,拖动分隔条可以看见,刷新窗口后又看不见了...
在这里给出的解决方法是:在视图的OnCreate函数中进行窗口的分割。
1、利用向导创建两个视图类,作为分割后左右两个视图:
class CLeftView : public CTreeView
class CRightView : public CListView
2、在OnCreate()函数中进行窗口分割:
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_split.CreateStatic(this,1,2)) return FALSE;
CCreateContext *pContext = (CCreateContext *)lpCreateStruct->lpCreateParams;
if(!m_split.CreateView(0,0,RUNTIME_CLASS(CLeftView),CSize(500,0),pContext))
{
m_split.DestroyWindow();
return 0;
}
//第一列设置了大小,第二列默认使用剩下的大小
if(!m_split.CreateView(0,1,RUNTIME_CLASS(CRightView),CSize(0,0),pContext))
{
m_split.DestroyWindow();
return 0;
}
return 1;
}
在OnSize()函数中添加如下代码:
void CChildView::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
int width = cx/4;
m_split.MoveWindow(0, 0, cx, cy);
m_split.SetColumnInfo(0, width, 0);
m_split.SetColumnInfo(1, cx-width, 0);
m_split.RecalcLayout();
}
OnSize()函数的作用:视图创建的时候就会走 OnSize,所以要在里面做处理,不然即使创建成功了,每个分割窗口什么的也会很小甚至看不见。
以上已经完成了窗口分割,为了显示需要,添加如下测试代码,在LeftView.cpp中添加:
BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT;
return CTreeView::PreCreateWindow(cs);
}
void CLeftView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
static int i = 0;
if(i++) return;
GetTreeCtrl().InsertItem(_T("分组信息"));
HTREEITEM hDefault = GetTreeCtrl().InsertItem(_T("默认"), GetTreeCtrl().GetRootItem());
GetTreeCtrl().Expand(GetTreeCtrl().GetRootItem(), TVE_EXPAND);
}
在RightView中添加如下测试代码:
void CRightView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
static int i = 0;
if(i++) return;
//ModifyStyle的作用和PreCreateWindow的作用一样,设置列表框的类型
//GetListCtrl().ModifyStyle(0,LVS_REPORT);
GetListCtrl().SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES);
GetListCtrl().InsertColumn(0, _T("IP地址"), 0, 100);
GetListCtrl().InsertColumn(1, _T("计算机名"), 0, 100);
GetListCtrl().InsertColumn(2, _T("操作系统"), 0, 100);
GetListCtrl().InsertColumn(3, _T("CPU"), 0, 100);
GetListCtrl().InsertColumn(4, _T("内存"), 0, 100);
GetListCtrl().InsertColumn(5, _T("地理位置"), 0, 100);
}
BOOL CRightView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= LVS_SHOWSELALWAYS | LVS_REPORT |LVS_EX_FULLROWSELECT ;
return CListView::PreCreateWindow(cs);
}
分割图: