VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 304|回复: 5

[已解决]CSplitterWnd 切割窗口出了小问题。

[复制链接]
35_avatar_middle
最佳答案
0 
online_vip 发表于 2019-10-30 01:44:08 | 显示全部楼层 |阅读模式
这个代码是 Syc 写的,原本只是分割2个,我改了一点代码,让它分割四个单元。
但问题出现了
CSplitterWnd 切割窗口出了小问题。



最佳答案
51_avatar_small
2019-10-30 11:21:51
cheating_plugin 发表于 2019-10-30 01:46
如果大哥们不愿意下载,我直接把我改的代码粘贴出来:

        // and finally, create the splitter with the  ...

加上这行代码就可以了,设置下第0行的高度:
m_wndSplitter.SetRowInfo(0, 300, 300);
具体高度自己设置下吧,300是临时的数。

参考的文章:

关于静态拆分窗口的文章,网上有很多很多,《深入浅出MFC》中也有个很详细的例子,大家都说的我就不再写了。不过,仔细观察会发现这些例子都是关于“拆分三窗口”,即将主窗口拆成两纵列,右侧的再拆成两横行。在设置新窗口大小的时候无一例外都是在CreateView方法中使用第4个参数设置,MSDN中的解释:
  1. virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );
  2. sizeInit:Specifies the initial size of the new view
复制代码


但是使用这种方法在拆分多纵列时(如将主窗口拆成三纵列,中间一列再拆成两横行)就会出现问题:无论如何设置SIZE参数,显示时中间一列的宽度总是0。MSDN给的解释:The CreateStatic member function automatically initializes a static splitter with a minimum row height and column width of 0. 在拆分时设置SIZE是设置各VIEW的大小,而中间一列的CSplitterWnd类的大小却没有设置,而在“拆分三窗口”时,右侧窗口的宽度实际是:总宽度-左侧窗口宽度,设置并没起作用。
MSDN也给出了解决方法:use SetColumnInfo and SetRowInfo

  1. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext *pContext)
  2. {
  3. //产生静态拆分窗口,横列为1,纵列为3
  4. m_wndSplitter1.CreateStatic(this, 1, 3);
  5. //产生拆分窗口的第一个窗口(标号 0,0)的View窗口
  6. m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CTreeCtrlView), CSize(107,0), pContext);

  7. //设置第二列宽,不然会被默认为0
  8. m_wndSplitter1.SetColumnInfo(1, 330, 330);
  9. //产生第二个拆分窗口,横列为2,纵列为1。位置在第一个拆分窗口的(0,1)窗口
  10. m_wndSplitter2.CreateStatic(&m_wndSplitter1, 2, 1, WS_CHILD | WS_VISIBLE,  m_wndSplitter1.IdFromRowCol(0,1));
  11. //产生第二个拆分窗口的第一个窗口(标号 0,0)的View窗口
  12. m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CRSDrillInfoView), CSize(0,200), pContext);
  13. //产生第二个拆分窗口的第二个窗口(标号 1,0)的View窗口
  14. m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CRSDrillLevelView), CSize(0,0), pContext);
  15.   
  16. //产生拆分窗口的第三个窗口(标号 0,2)的View窗口
  17. m_wndSplitter1.CreateView(0, 2, RUNTIME_CLASS(CHZOpenGLView), CSize(0,0), pContext);
  18. return TRUE;
  19. }
  20. 其中m_wndSplitter1,m_wndSplitter2是CSplitterWnd型变量。
复制代码

SplitTest1.rar

136.93 KB, 下载次数: 1

大佬帮瞧一下吧





上一篇:请教下checksum和校验属于计算机哪个学科
下一篇:CRgn 如何实现两个窗口的并集,实现游戏窗口
51_avatar_middle
最佳答案
83 
online_admins 发表于 2019-10-30 11:21:51 | 显示全部楼层    本楼为最佳答案   
bestAnswer
cheating_plugin 发表于 2019-10-30 01:46
如果大哥们不愿意下载,我直接把我改的代码粘贴出来:

        // and finally, create the splitter with the  ...

加上这行代码就可以了,设置下第0行的高度:
m_wndSplitter.SetRowInfo(0, 300, 300);
具体高度自己设置下吧,300是临时的数。

参考的文章:

关于静态拆分窗口的文章,网上有很多很多,《深入浅出MFC》中也有个很详细的例子,大家都说的我就不再写了。不过,仔细观察会发现这些例子都是关于“拆分三窗口”,即将主窗口拆成两纵列,右侧的再拆成两横行。在设置新窗口大小的时候无一例外都是在CreateView方法中使用第4个参数设置,MSDN中的解释:
  1. virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );
  2. sizeInit:Specifies the initial size of the new view
复制代码


但是使用这种方法在拆分多纵列时(如将主窗口拆成三纵列,中间一列再拆成两横行)就会出现问题:无论如何设置SIZE参数,显示时中间一列的宽度总是0。MSDN给的解释:The CreateStatic member function automatically initializes a static splitter with a minimum row height and column width of 0. 在拆分时设置SIZE是设置各VIEW的大小,而中间一列的CSplitterWnd类的大小却没有设置,而在“拆分三窗口”时,右侧窗口的宽度实际是:总宽度-左侧窗口宽度,设置并没起作用。
MSDN也给出了解决方法:use SetColumnInfo and SetRowInfo

  1. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext *pContext)
  2. {
  3. //产生静态拆分窗口,横列为1,纵列为3
  4. m_wndSplitter1.CreateStatic(this, 1, 3);
  5. //产生拆分窗口的第一个窗口(标号 0,0)的View窗口
  6. m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CTreeCtrlView), CSize(107,0), pContext);

  7. //设置第二列宽,不然会被默认为0
  8. m_wndSplitter1.SetColumnInfo(1, 330, 330);
  9. //产生第二个拆分窗口,横列为2,纵列为1。位置在第一个拆分窗口的(0,1)窗口
  10. m_wndSplitter2.CreateStatic(&m_wndSplitter1, 2, 1, WS_CHILD | WS_VISIBLE,  m_wndSplitter1.IdFromRowCol(0,1));
  11. //产生第二个拆分窗口的第一个窗口(标号 0,0)的View窗口
  12. m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CRSDrillInfoView), CSize(0,200), pContext);
  13. //产生第二个拆分窗口的第二个窗口(标号 1,0)的View窗口
  14. m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CRSDrillLevelView), CSize(0,0), pContext);
  15.   
  16. //产生拆分窗口的第三个窗口(标号 0,2)的View窗口
  17. m_wndSplitter1.CreateView(0, 2, RUNTIME_CLASS(CHZOpenGLView), CSize(0,0), pContext);
  18. return TRUE;
  19. }
  20. 其中m_wndSplitter1,m_wndSplitter2是CSplitterWnd型变量。
复制代码
35_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-10-30 01:46:14 | 显示全部楼层
本帖最后由 cheating_plugin 于 2019-10-30 01:47 编辑

如果大哥们不愿意下载,我直接把我改的代码粘贴出来:

        // and finally, create the splitter with the frame as
        // the parent
        m_wndSplitter.CreateStatic(m_pFrameWnd, 2, 1);

        // 这里的代码是 Syc大佬 的代码 ,分割2个单元
        /*m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyListView), CSize(500,300), &ctxList);
        m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CMyEditView), CSize(500,100), &ctxEdit);*/

        //这里是我的代码,分割窗口4个单元,大哥帮瞧瞧吧
        if (m_wndSplitter1.CreateStatic(&m_wndSplitter, 1, 2, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(0, 0)) == NULL)
                return FALSE;
        m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CMyListView), CSize(250, 300), &ctxList);
        m_wndSplitter1.CreateView(0, 1, RUNTIME_CLASS(CMyListView), CSize(250, 300), &ctxList);
        if (m_wndSplitter2.CreateStatic(&m_wndSplitter, 1, 2, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(1, 0)) == NULL)
                return FALSE;
        m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CMyEditView), CSize(250, 100), &ctxEdit);
        m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CMyEditView), CSize(250, 100), &ctxEdit);
35_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-10-30 15:23:51 | 显示全部楼层
Syc 发表于 2019-10-30 11:21
加上这行代码就可以了,设置下第0行的高度:
m_wndSplitter.SetRowInfo(0, 300, 300);
具体高度自己设 ...

Syc大哥,还有一个小问题:
到底在OnSize消息中:SIZE_RESTORED 和 SIZE_MAXIMIZED、SIZE_MINIMIZED有什么不同?
我要保持m_wndSplitter分割的比例:
CRect rect;
        GetWindowRect(&rect);
        ScreenToClient(&rect);
        int w = rect.Width();
        int h = rect.Height();
        GetDlgItem(IDC_STATIC_MAIN)->MoveWindow(0, 0, cx, cy);
        m_pFrameWnd->MoveWindow(0, 0, rect.Width(), rect.Height());
        m_wndSplitter.MoveWindow(0, 0, rect.Width(), rect.Height());
        m_wndSplitter.SetRowInfo(0, rect.Height() * (6.5 / (float)10), 10);
        m_wndSplitter1.SetColumnInfo(0, rect.Width()  * (7 / (float)10), 10);
        m_wndSplitter1.SetColumnInfo(1, 200, 10);
        m_wndSplitter1.RecalcLayout();

        m_wndSplitter2.SetColumnInfo(0, rect.Width()  * (4 / (float)7), 10);
        m_wndSplitter2.SetColumnInfo(1, 200, 10);
        m_wndSplitter2.RecalcLayout();

代码是这样写的,程序运行完成以后,窗口比例是对的,我用鼠标拖动缩放扩大比例完全正确,但是如果我按最大化或者是最小化按钮的话,就会出现高度错乱的问题,我也是设置了m_wndSplitter.SetRowInfo(0, rect.Height() * (6.5 / (float)10), 10);但还是不行。
51_avatar_middle
最佳答案
83 
online_admins 发表于 2019-10-30 15:30:06 | 显示全部楼层
cheating_plugin 发表于 2019-10-30 15:23
Syc大哥,还有一个小问题:
到底在OnSize消息中:SIZE_RESTORED 和 SIZE_MAXIMIZED、SIZE_MINIMIZED有什 ...

试试在 WM_SIZING 消息中处理一下呢?
35_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-10-30 17:37:43 | 显示全部楼层
Syc 发表于 2019-10-30 15:30
试试在 WM_SIZING 消息中处理一下呢?

WM_SIZING 没有响应
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

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

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

GMT+8, 2021-1-21 22:16

Powered by CcTry.CoM

© 2009-2020 cctry.com

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