VC++6.0关于分割窗口的CSize初始大小不起作用问题的解释

 

首先多谢小虫同学一直关注我的博客,昨日小虫同学按照我的分割窗体的文章举一反三自己写了一段代码,但是运行后发现问题,即,分割后显示的大小和CSize设置的初始大小不一样,那么我们现在来看一下这段代码:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
//创建一个静态分栏窗口,分为1行2列

CRect rect;
GetClientRect(&rect);

if(wndSplitter_erect.CreateStatic(this,1,2)==NULL)
  
   return FALSE;

wndSplitter_erect.CreateView(0,1,RUNTIME_CLASS(CDownView),CSize(rect.Width()-rect.Width()/6,rect.Height()),pContext);

if(wndSplitter_horizontal.CreateStatic(&wndSplitter_erect,2,1,WS_CHILD|WS_VISIBLE, wndSplitter_erect.IdFromRowCol(0, 0))==NULL)
  
   return FALSE;

wndSplitter_horizontal.CreateView(0,0,RUNTIME_CLASS(CUpView),CSize(rect.Width()/6,rect.Height()/3),pContext);

wndSplitter_horizontal.CreateView(1,0,RUNTIME_CLASS(CLeftView),CSize(rect.Width()/6,rect.Height()-rect.Height()/3),pContext);

   return TRUE;

//return CFrameWnd::OnCreateClient(lpcs, pContext);
}

我把这段代码运行一遍以后发现,CLeftView占满了整个视图,而CDownView和CUpView则被压缩为一小条。

好了,现在先来分析一下这段代码,首先将视图分割为一行两列,再然后将第一列分为两行一列,原本看似没有什么问题的程序,为什么运行起来就出问题了呢?

这个问题在于,第一次把视图分为一行两列后,我们指定了第二列的宽度,但是我们没有指定第一列的宽度,后来,我们又将第一列分为两行一列了,虽然第二次分割为两个视图CDownView和CUpView指定了宽和高,但是,它的父视图,即第一次分割后的第一列没有指定,系统则自动将大小设为0了。所以,我们看到的CDownView和CUpView被压缩为一小条。

现在我们把问题的原因搞清楚了,那么有什么解决办法呢?现在我们来看两个函数,如下:

1、SetRowInfo函数:

CSplitterWnd::SetRowInfo

void SetRowInfo( int row, int cyIdeal, int cyMin );

参数: row 指定一个分隔器窗口行。
cyIdeal 指定分隔器窗口行的以像素表示的理想高度。
cyMin 指定分隔器窗口行以像素表示的最小高度。

现在我通俗的解释下这三个参数,row:表示要设置哪行的高度。cyldeal:表示你所要设置的理想行高,即显示时的高度。cyMin:表示当用鼠标拖动分隔条的时候,此行的最小高度,通常,我们设置为0即可。

2、SetColumInfo函数:

CSplitterWnd::SetColumnInfo

void SetColumnInfo( int col, int cxIdeal, int cxMin );

参数: col 指定一个分隔器窗口列。
cxIdeal 指定分隔器窗口列的以像素表示的理想宽度。
cxMin 指定分隔器窗口列以像素表示的最小宽度。

现在我通俗的解释下这三个参数,col:表示要设置哪列的宽度。cxldeal:表示你所要设置的理想列宽,即显示时的宽度。cxMin:表示当用鼠标拖动分割条的时候,此列的最小宽度,通常,我们设置为0即可。

好了,我们要想解决问题,就要用到这两个函数,下面是我修改过的代码:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
//创建一个静态分栏窗口,分为1行2列

CRect rect;
GetClientRect(&rect);

if(wndSplitter_erect1.CreateStatic(this,1,2)==NULL)
  
   return FALSE;

wndSplitter_erect1.CreateView(0,1,RUNTIME_CLASS(CMsmonitorDownView),CSize(rect.Width()-rect.Width()/6,rect.Height()),pContext);

if(wndSplitter_horizontal1.CreateStatic(&wndSplitter_erect1,2,1,WS_CHILD|WS_VISIBLE, wndSplitter_erect1.IdFromRowCol(0, 0))==NULL)
  
   return FALSE;

wndSplitter_horizontal1.CreateView(0,0,RUNTIME_CLASS(CMsmonitorUpView),CSize(rect.Width()/6,rect.Height()/3),pContext);

wndSplitter_horizontal1.CreateView(1,0,RUNTIME_CLASS(CMsmonitorTreeView),CSize(rect.Width()/6,rect.Height()-rect.Height()/3),pContext);

wndSplitter_erect1.SetColumnInfo(0,rect.Width()/6,0);//设置第一次分割时第0列的列宽

return TRUE;

//return CFrameWnd::OnCreateClient(lpcs, pContext);
}

在我修改的代码中加入了一句,wndSplitter_erect1.SetColumnInfo(0,rect.Width()/6,0);设置第一次分割时第0列的列宽。

这个问题解决了,最后我们总结一下:

1、在分割的时候注意各个视图的大小,对没有指定宽高的视图再次分割一定要注意为这个视图初始化宽高,用SetColumnInfo和SetRowInfo函数。

2、对于没有初始化的视图,系统会自动初始化宽高为0。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值