VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 14742|回复: 138

[交流] MFC对话框的窗口实现 窗口分割

  [复制链接]
001
51_avatar_middle
online_admins 发表于 2016-4-1 14:50:05 | 显示全部楼层 |阅读模式
今天有位 VC驿站 的Vip会员问我对话框实现窗口分割怎么做,我说忘网上一堆一堆的代码随便找一个就行了,有不少都不太完美,于是他找到了一个说还不错,但是代码不全,只是给了个提示,让我帮忙看看如何做出来,我一看还行,方法不错,试试吧,于是就动手了!

首先,我新建了MFC对话框的工程,工程名字 SplitTest。之后,因为我们要分割窗口,所以我们自定义一下,分割2行1列,上下两个窗口,上面的窗口用 ListView,下面的窗口用 EditView,于是,我在工程中添加了两个类,一个派生自 CListView 的 CMyListView,一个派生自 EditView 的 CMyEditView。

之后,响应主对话框类 CSplitTestDlg 的 WM_CREATE 消息,在其响应函数 OnCreate 中添加如下代码:
  1. int CSplitTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
  2. {
  3.         if (CDialogEx::OnCreate(lpCreateStruct) == -1)
  4.                 return -1;

  5.         // Initialize a context for the view. CMyTreeView is my view and
  6.         // is defined as :  class CMyListView : public CListView.
  7.         CCreateContext ctxList, ctxEdit;
  8.         ctxList.m_pNewViewClass = RUNTIME_CLASS(CMyListView);
  9.         ctxList.m_pCurrentDoc = NULL;
  10.         ctxList.m_pNewDocTemplate = NULL;
  11.         ctxList.m_pLastView = NULL;
  12.         ctxList.m_pCurrentFrame = NULL;

  13.         ctxEdit.m_pNewViewClass = RUNTIME_CLASS(CMyEditView);
  14.         ctxEdit.m_pCurrentDoc = NULL;
  15.         ctxEdit.m_pNewDocTemplate = NULL;
  16.         ctxEdit.m_pLastView = NULL;
  17.         ctxEdit.m_pCurrentFrame = NULL;

  18.         // Because the CFrameWnd needs a window class, we will create
  19.         // a new one. I just copied the sample from MSDN Help.
  20.         // When using it in your project, you may keep CS_VREDRAW and
  21.         // CS_HREDRAW and then throw the other three parameters.
  22.         CString strMyClass = AfxRegisterWndClass(CS_VREDRAW|CS_HREDRAW, ::LoadCursor(NULL, IDC_ARROW), (HBRUSH)::GetStockObject(WHITE_BRUSH), ::LoadIcon(NULL, IDI_APPLICATION));

  23.         // Create the frame window with "this" as the parent
  24.         m_pFrameWnd = new CFrameWnd();
  25.         m_pFrameWnd->Create(strMyClass, _T(""), WS_CHILD, CRect(0,0,1,1), this);
  26.         m_pFrameWnd->ShowWindow(SW_SHOW);
  27.         m_pFrameWnd->MoveWindow(0, 0, 500, 400);

  28.         // and finally, create the splitter with the frame as
  29.         // the parent
  30.         m_wndSplitter.CreateStatic(m_pFrameWnd, 2, 1);
  31.         m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyListView), CSize(500,300), &ctxList);
  32.         m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CMyEditView), CSize(500,100), &ctxEdit);

  33.         return 0;
  34. }
复制代码


//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com/thread-263053-1-1.html
// C、C++、MFC、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

来实现创建一个2行1列的分割窗口。相关的解释上面已经加注释了,大家自己理解吧。
之后在主对话框的初始化函数 CSplitTestDlg::OnInitDialog() 中添加以下代码:

  1. CRect rect;
  2. // Get the rectangle of the custom window. The custom window
  3. // is just a a big button that is not visible and is disabled.
  4. // It's a trick to not use coordinates directly.
  5. GetDlgItem(IDC_CUTSOM_WINDOW)->GetWindowRect(&rect);

  6. // Move the splitter
  7. ScreenToClient(&rect);
  8. m_pFrameWnd->MoveWindow(&rect);
  9. m_pFrameWnd->ShowWindow(SW_SHOW);
  10. m_wndSplitter.MoveWindow(0, 0, rect.Width(), rect.Height());
  11. m_wndSplitter.ShowWindow(SW_SHOW);
复制代码


完整的 CSplitTestDlg::OnInitDialog() 代码如下:
  1. BOOL CSplitTestDlg::OnInitDialog()
  2. {
  3.         CDialogEx::OnInitDialog();

  4.         // 将“关于...”菜单项添加到系统菜单中。

  5.         // IDM_ABOUTBOX 必须在系统命令范围内。
  6.         ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  7.         ASSERT(IDM_ABOUTBOX < 0xF000);

  8.         CMenu* pSysMenu = GetSystemMenu(FALSE);
  9.         if (pSysMenu != NULL)
  10.         {
  11.                 BOOL bNameValid;
  12.                 CString strAboutMenu;
  13.                 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  14.                 ASSERT(bNameValid);
  15.                 if (!strAboutMenu.IsEmpty())
  16.                 {
  17.                         pSysMenu->AppendMenu(MF_SEPARATOR);
  18.                         pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  19.                 }
  20.         }

  21.         // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  22.         //  执行此操作
  23.         SetIcon(m_hIcon, TRUE);                        // 设置大图标
  24.         SetIcon(m_hIcon, FALSE);                // 设置小图标

  25.         // TODO: 在此添加额外的初始化代码

  26.         CRect rect;
  27.         // Get the rectangle of the custom window. The custom window
  28.         // is just a a big button that is not visible and is disabled.
  29.         // It's a trick to not use coordinates directly.
  30.         GetDlgItem(IDC_CUTSOM_WINDOW)->GetWindowRect(&rect);

  31.         // Move the splitter
  32.         ScreenToClient(&rect);
  33.         m_pFrameWnd->MoveWindow(&rect);
  34.         m_pFrameWnd->ShowWindow(SW_SHOW);
  35.         m_wndSplitter.MoveWindow(0, 0, rect.Width(), rect.Height());
  36.         m_wndSplitter.ShowWindow(SW_SHOW);

  37.         return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
  38. }
复制代码


大家可以注意到了一个控件ID:IDC_CUTSOM_WINDOW,实际上大家只要在对话框界面上添加一个很大的按钮,之后将按钮的ID改成 IDC_CUTSOM_WINDOW 就可以了,之后将按钮的Visible属性设置为FALSE即可。实际上这个按钮就是分割窗口的容器。

好啦,基本步骤说完了,怕大家自己搞不定,还是直接把我的工程源码传上来吧,编译环境 vs2010,程序截图如下:
MFC对话框的窗口实现 窗口分割

//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com/thread-263053-1-1.html
// C、C++、MFC、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

源码回复后可下载:
游客,如果您要查看本帖隐藏内容请回复


参考网址:http://www.codeguru.com/cpp/w-d/ ... hree-Easy-Steps.htm




上一篇:用Winpcap实现局域网IP扫描及SYN洪水
下一篇:VC中给列表控件CListCtrl添加复选框
05_avatar_middle
online_vip 发表于 2016-4-1 15:09:06 | 显示全部楼层
第一个支持,看看。
49_avatar_middle
在线会员 发表于 2016-4-1 17:02:16 | 显示全部楼层
哈哈 老大 老大
41_avatar_middle
在线会员 发表于 2016-4-1 22:59:50 | 显示全部楼层
谢谢老大,前排支持。
22_avatar_middle
在线会员 发表于 2016-4-2 01:47:34 | 显示全部楼层
MFC对话框的窗口实现 窗口分割MFC对话框的窗口实现 窗口分割MFC对话框的窗口实现 窗口分割
45_avatar_middle
online_vip 发表于 2016-4-2 08:44:16 | 显示全部楼层
谢谢分享
24_avatar_middle
在线会员 发表于 2016-4-2 12:23:28 | 显示全部楼层
收藏      
55_avatar_middle
在线会员 发表于 2016-4-2 19:06:54 | 显示全部楼层
支持楼主啊  这个不错
83_avatar_middle
在线会员 发表于 2016-4-2 22:18:25 | 显示全部楼层
既然要分割,为什么不直接用文档呢
32_avatar_middle
online_vip 发表于 2016-4-3 10:13:07 | 显示全部楼层
这个很好用
08_avatar_middle
在线会员 发表于 2016-4-4 09:57:00 | 显示全部楼层
MFC对话框的窗口实现 窗口分割
07_avatar_middle
online_vip 发表于 2016-4-5 11:23:26 | 显示全部楼层
1111111111111111111111
93_avatar_middle
在线会员 发表于 2016-4-8 20:48:19 | 显示全部楼层
呆呆呆呆
22_avatar_middle
在线会员 发表于 2016-4-14 18:06:31 | 显示全部楼层
本帖最后由 sunflover 于 2016-4-14 18:11 编辑

我表示不服,对话框的直接使用EasySize就行了,还分割有什么意义呢
https://www.cctry.com/thread-246700-1-1.html
https://www.cctry.com/thread-246701-1-1.html
56_avatar_middle
在线会员 发表于 2016-4-17 18:11:34 | 显示全部楼层
学习一下
15_avatar_middle
在线会员 发表于 2016-4-19 09:10:41 | 显示全部楼层
多谢楼主分享,找这个程序很久了!
31_avatar_middle
在线会员 发表于 2016-5-1 10:13:36 | 显示全部楼层
我来看看
76_avatar_middle
在线会员 发表于 2016-5-6 14:19:04 | 显示全部楼层
学习。学习
02_avatar_middle
在线会员 发表于 2016-5-10 15:06:39 | 显示全部楼层
本帖最后由 phbmxd 于 2016-5-10 15:12 编辑

按照步骤写了一下,实现了分割效果。
46_avatar_middle
在线会员 发表于 2016-5-14 23:14:59 | 显示全部楼层
对话框实现窗口分割
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

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

GMT+8, 2019-5-23 03:51

Powered by Discuz! X3.4

© 2009-2019 cctry.com

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