MFC中让控件随窗体大小变化而变化中需要注意的问题

让控件随窗体大小变化而变化即要在 OnSize(UINT nType, int cx, int cy)函数中添加如下代码:
假设m_sheet为某控件的成员变量:
m_sheet.SetWindowPos(NULL,0,0,cx,cy/3,SWP_NOZORDER|SWP_NOMOVE);
这样写,会抛出断言。
这是为什么呢,因为m_sheet为空,程序是先运行到OnSize函数,再运行到DoDataExchange函数,
而m_sheet在DoDataExchange中才被真正与控件相关联,才获得具体控件的句柄,所以在改变控件大小时,要加判断:
 if (m_sheet)
 {
  m_sheet.SetWindowPos(NULL,0,0,cx,cy/3,SWP_NOZORDER|SWP_NOMOVE);
 }
 或者通过m_sheet.m_hWnd获得控件句柄来判断:
 if (m_sheet.m_hWnd!=NULL)
 {
  m_sheet.SetWindowPos(NULL,0,0,cx,cy/3,SWP_NOZORDER|SWP_NOMOVE);
 }
可能有人想在窗口初始化时按窗体大小设置控件大小,便在OnInitDialog函数中添加代码:
  CRect rect;
  GetClientRect(&rect);
  m_sheet.SetWindowPos(NULL,0,0,rect.Width(),rect.Height()/3,SWP_NOMOVE|SWP_NOZORDER);
其实这是不必要的,只要在OnSize函数中添加改变的代码就可以了。
 
如果用控件变量来进行判断的话,窗体第一次show出来的时候控件的显示布局会有延迟,这是因为程序的运行顺序是:OnSize-OnInitDialog-DoDataExchange-OnSize,
程序到DDX的时候,窗体就Show出来了,但是第一次OnSize中并没有进行布局,因为控件变量还没有与控件关联起来,DDX之后,控件变量与控件关联起来
之后,OnSize中才会进行布局。这个的一个解决方法是:直接利用控件句柄在OnSize中进行布局。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值