VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 429|回复: 0

VC++高级班之窗口篇-[20]单文档程序之窗口分割

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-3-12 16:10:01 | 显示全部楼层 |阅读模式
----------------------------------------------------------------------------------------
①、建一单文档工程;
===================================================
②、各个分割窗口类的添加:
CGroupTreeView:#include <afxcview.h>
CClientListView:#include <afxcview.h>
CLogListView:#include <afxcview.h>
===================================================
③、重载 CMainFrame::OnCreateClient 函数,进行分割窗口的创建:
  1. //先创建2行1列
  2. CSplitterWnd m_wndSplitter;
  3. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
  4. {
  5.         // TODO: Add your specialized code here and/or call the base class
  6.         if (!m_wndSplitter.CreateStatic(this, 2, 1))
  7.                 return FALSE;

  8.         if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSplitTestView), CSize(0, 260), pContext) ||
  9.                 !m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CLogListView), CSize(0, 0), pContext))
  10.         {
  11.                 m_wndSplitter.DestroyWindow();
  12.                 return FALSE;
  13.         }

  14.         return TRUE; //注意
  15.         //return CFrameWnd::OnCreateClient(lpcs, pContext);
  16. }
复制代码

===================================================
④、响应 CMainFrame 类的 WM_SIZE 消息,在其响应函数 OnSize 中进行窗口位置的调整:
  1. if (m_bSplitted && cx > 0 && cy > 0) {
  2.         int height = cy/3;
  3.         m_wndSplitter.SetRowInfo(0, cy-height, 0);
  4.         m_wndSplitter.SetRowInfo(1, height, 0);
  5.         m_wndSplitter.RecalcLayout();
  6. }
复制代码

===================================================
⑤、响应 CSplitTestView 类的 WM_CREATE 消息,在其响应函数 OnCreate 中继续分割窗口:
  1. int CSplitTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
  2. {
  3.         if (CView::OnCreate(lpCreateStruct) == -1)
  4.                 return -1;

  5.         // TODO:  Add your specialized creation code here
  6.         if (!m_wndSplitter.CreateStatic(this, 1, 2))
  7.                 return FALSE;

  8.         CCreateContext *pContext = (CCreateContext *)lpCreateStruct->lpCreateParams;
  9.         if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CGroupTreeView), CSize(100, 100), pContext) ||
  10.                 !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CClientListView), CSize(0, 0), pContext))
  11.         {
  12.                 m_wndSplitter.DestroyWindow();
  13.                 return FALSE;
  14.         }

  15.         return TRUE;
  16. }
复制代码

===================================================
⑥、响应 CSplitTestView 类的 WM_SIZE 消息,在其响应函数 OnSize 中进行窗口位置的调整:
  1. int width = cx/7;
  2. m_wndSplitter.MoveWindow(-2, -2, cx, cy+3);
  3. m_wndSplitter.SetColumnInfo(0, width, 0);
  4. m_wndSplitter.SetColumnInfo(1, cx-width, 0);
  5. m_wndSplitter.RecalcLayout();
复制代码

===================================================
⑦、CGroupTreeView 视图的初始化代码:
  1. void CGroupTreeView::OnInitialUpdate()
  2. {
  3.         CTreeView::OnInitialUpdate();

  4.         // TODO: Add your specialized code here and/or call the base class
  5.         GetTreeCtrl().InsertItem(_T("分组信息"));
  6.         HTREEITEM hDefault = GetTreeCtrl().InsertItem(_T("默认"), GetTreeCtrl().GetRootItem());

  7.         //GetTreeCtrl().SelectItem(hDefault);
  8.         GetTreeCtrl().Expand(GetTreeCtrl().GetRootItem(), TVE_EXPAND);
  9. }

  10. BOOL CGroupTreeView::PreCreateWindow(CREATESTRUCT& cs)
  11. {
  12.         // TODO: Add your specialized code here and/or call the base class
  13.         cs.style |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT;

  14.         return CTreeView::PreCreateWindow(cs);
  15. }
复制代码


⑧、CClientListView 视图的初始化代码:
  1. void CClientListView::OnInitialUpdate()
  2. {
  3.         CListView::OnInitialUpdate();

  4.         // TODO: Add your specialized code here and/or call the base class
  5.         GetListCtrl().SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES);
  6.         GetListCtrl().InsertColumn(0, _T("IP地址"), 0, 100);
  7.         GetListCtrl().InsertColumn(1, _T("计算机名"), 0, 100);
  8.         GetListCtrl().InsertColumn(2, _T("操作系统"), 0, 100);
  9.         GetListCtrl().InsertColumn(3, _T("CPU"), 0, 100);
  10.         GetListCtrl().InsertColumn(4, _T("内存"), 0, 100);
  11.         GetListCtrl().InsertColumn(5, _T("地理位置"), 0, 100);
  12. }

  13. BOOL CClientListView::PreCreateWindow(CREATESTRUCT& cs)
  14. {
  15.         // TODO: Add your specialized code here and/or call the base class
  16.         cs.style |= LVS_SHOWSELALWAYS | LVS_REPORT;

  17.         return CListView::PreCreateWindow(cs);
  18. }
复制代码


⑨、CLogListView 视图的初始化代码:
  1. void CLogListView::OnInitialUpdate()
  2. {
  3.         CListView::OnInitialUpdate();

  4.         // TODO: Add your specialized code here and/or call the base class
  5.         CRect rect;
  6.         GetClientRect(&rect);
  7.         int width = rect.Width()/4;
  8.         GetListCtrl().SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
  9.         GetListCtrl().InsertColumn(0, _T("发生时间"), 0, width);
  10.         GetListCtrl().InsertColumn(1, _T("事件信息"), 0, rect.Width() - width);
  11. }

  12. BOOL CLogListView::PreCreateWindow(CREATESTRUCT& cs)
  13. {
  14.         // TODO: Add your specialized code here and/or call the base class
  15.         cs.style |= LVS_SHOWSELALWAYS | LVS_REPORT;

  16.         return CListView::PreCreateWindow(cs);
  17. }

  18. void CLogListView::OnSize(UINT nType, int cx, int cy)
  19. {
  20.         CListView::OnSize(nType, cx, cy);

  21.         // TODO: Add your message handler code here
  22.         int width = cx/4;
  23.         GetListCtrl().SetColumnWidth(0, width-6);
  24.         GetListCtrl().SetColumnWidth(1, cx-width);
  25. }
复制代码


⑩、可以放置控件的视图类:class CFilterFormView : public CFormView

⑾、获取各个视图的指针:
  1. CSplitTestView *pTopView = (CSplitTestView *)m_wndSplitter.GetPane(0, 0);
  2. CFilterFormView *pBottomView = (CFilterFormView *)m_wndSplitter.GetPane(1, 0);

  3. CGroupTreeView *pGroupView = (CGroupTreeView *)(pTopView->m_wndSplitter.GetPane(0, 0));
  4. CClientListView *pClientView = (CClientListView *)(pTopView->m_wndSplitter.GetPane(0, 1));
复制代码


===================================================
※※※ 小作业:
1、修改单文档程序的标题!
2、练习在 CView 视图上面动态创建控件!
------------------------------------- End -------------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
教程介绍及详情请见:https://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:https://www.cctry.com/static/vip/index.html





上一篇:VC++高级班之窗口篇-[19]文档视图类程序框架的讲解
下一篇:VC++高级班之注册表篇-[1]认识并操作注册表

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-12 12:15

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表