MFC单文档静态划分窗口时出现宽高度参数无效的改正方法

来源:互联网 发布:java资源下载网 编辑:程序博客网 时间:2024/04/30 02:51

         在对MFC的单文档进行静态划分窗口的时候,如果方法不对就会出现宽高度参数无效的情况(高度为零或者宽度为零)。我在这里也纠结了好久,最终摸索出了解决方法,分享给大家。

         我原本想要划分出下面的效果:


代码如下:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {// TODO: Add your specialized code here and/or call the base classCRect frmRC;GetClientRect(frmRC);m_yi.CreateStatic(this,1,2);m_er.CreateStatic(&m_yi,2,1,WS_CHILD|WS_VISIBLE,m_yi.IdFromRowCol(0,0));m_yi.CreateView(0,1,RUNTIME_CLASS(CWWWView),CSize(200,frmRC.Height()),pContext);m_er.CreateView(0,0,RUNTIME_CLASS(CWWWView),CSize(200,100),pContext);m_er.CreateView(1,0,RUNTIME_CLASS(CWWWView),CSize(200,100),pContext);return true;//return CFrameWnd::OnCreateClient(lpcs, pContext);}

高度和宽度我都在了设置,但是结果却并不理想,如下图:


出现了宽度为零的情况。

        我猜测这是因为我在0行0列中又划分了两行一列,这样一来,这两行的宽度必须一致才行。虽然我的设置中两个宽度是一致的,但是MFC为了避免程序猿在不留意的情况下设置了两个不一样的宽度参数,这样程序就会出错不能运行。而MFC也并不提供这样的检校机制,所以为了避免出错采取了这样的做法:将这两宽度参数忽略并且设置默认宽度为零。

        那么该如何解决这一问题呢?

首先我要介绍两个函数:

SplitterWnd的成员函数SetColumnInfo(int col,int cxIdeal,int cxMin)和SetRowInfo(int row,int cyIdeal,int cyMin)

其中,第一个函数用来设置宽度,第二个函数用来设置高度。参数col,cxIdeal,cxMin分别表示列序号、宽度、最小宽度,参数row,cyIdeal,cyMin分别表示行序列、高度、最小高度。

接下来的解决方案大家都猜的到了,就是调用这两个函数解决问题。

在这里,我需要设置0行0列的宽度,那么调用SetColumnInfo()函数,代码如下:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {// TODO: Add your specialized code here and/or call the base classCRect frmRC;GetClientRect(frmRC);m_yi.CreateStatic(this,1,2);m_er.CreateStatic(&m_yi,2,1,WS_CHILD|WS_VISIBLE,m_yi.IdFromRowCol(0,0));m_yi.CreateView(0,1,RUNTIME_CLASS(CWWWView),CSize(200,frmRC.Height()),pContext);m_er.CreateView(0,0,RUNTIME_CLASS(CWWWView),CSize(200,100),pContext);m_er.CreateView(1,0,RUNTIME_CLASS(CWWWView),CSize(200,100),pContext);m_yi.SetColumnInfo(0,300,0);//将0行0列的宽度为300RecalcLayout();//刷新return true;//return CFrameWnd::OnCreateClient(lpcs, pContext);}
         调用之后就轻松解决了宽度为零的情况,如果遇到高度为零则调用另一函数进行设置,方法一样。这里就不再陈述。运行结果就是预想的结果,如第一图所示。

这就是我为大家分享的一点小经验。

0 0
原创粉丝点击