[MFC]Dialog窗口大小调整控制OnSize/OnSizing

QT&MFC 专栏收录该内容
89 篇文章 4 订阅


参考:http://www.360doc.com/content/08/1210/09/799_2090143.shtml

参考:MSDN

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  转载请标明来源 

 

 

调整窗口大小的一个关键是:根据调整方向的不同做出不同的响应。

例如从左侧调整,当调整到最小值时,不能继续进行调整,需要根据右边界还原位置。

 

0. 启用对话框为可调节对话框

    在对话框 属性->外观-->Border,选择Resizing

 

1. 对话框的大小限制,预设好允许用户调整的大小范围,例如: 通常下限为我们认为需要确保窗口信息显示正常最小值

     MinWidth   = ;

     MinHeight  = ;

 

2.  响应大小调整的消息 

OnSize函数为变动后处理,此时窗口大小已变更

CWnd::OnSize The framework calls this member function after the window's size has changed.

OnSizing响应用户的拖动,此时窗口尚未变更大小

CWnd::OnSizing The framework calls this member function to indicate that the user is resizing the rectangle.

 

3. 响应OnSizing详细说明

OnSizing(UINT fwSide, LPRECT pRect)

OnSizing响应用户的拖动,此时窗口尚未变更大小; 根据传入参数fwSide确定用户调整的方向, 根据传入传出参数pRect来确定调整后的大小。 

3.1参数说明:

fwSide: 指示移动的是哪个边,取值(1-8) 分别有左边拖动,右边拖动,上边拖动,下边拖动,左上拖动,右上拖动,左下拖动,右下拖动

Left: 1      Right: 2     Top: 3     Bottom: 6     Left+Right: 3     Right+Top: 5      Left+Bottom: 7     Right+Bottom: 8

pRect: 拖动形成的矩形窗口,为指针变量,改动该结构会影响窗口的大小,从而影响调整的结果

可以自己定义四个宏来使用,具体MFC中是否有定义,我没有找到,所以自己定义的

#define MOVE_LEFT 1
#define MOVE_RIGHT 2
#define MOVE_TOP 3
#define MOVE_BOTTOM 6

3.2 在OnSizing中控制窗口的大小:使用传入传出参数pRect控制

        a. 响应调整:根据用户调整的方向,当用户从左边挑宽度是,我们也从左边调,同理高度也如此

        b. 大小限制:当移动的大小超出我们设置的限制时,调整传入的pRect指向的CRect值

  // 当窗口宽度达到最小值时
  if (fwSide == MOVE_RIGHT || fwSide == MOVE_RIGHT + MOVE_TOP || fwSide == MOVE_RIGHT + MOVE_BOTTOM)
  {
      pRect->right = pRect->left + MinWidth  ;
  }
  else
  {
      pRect->left = pRect->right - MinWidth  ;
  }
  
   if (fwSide == MOVE_BOTTOM || fwSide == MOVE_BOTTOM + MOVE_LEFT || fwSide == MOVE_BOTTOM + MOVE_RIGHT)
   {
      pRect->bottom = pRect->top + MinHeight ;
   }
   else
   {
      pRect->top = pRect->bottom - MinHeight ;
   }

4. 在OnSize函数中根据需要调整各控件的大小

OnSize函数为变动后处理,此时窗口大小已变更,我们需要调整Dialog中的组件大小来适配窗口大小。例如:把edit窗口调宽一些

 if ( 消息为调整消息 && 组件已构建)if (nType == SIZE_RESTORED && ::IsWindow(m_edit))

       组件调整  GetDlgItem(IDC_EDIT)->MoveWindow(xxxx)

}

(因为第一个OnSize消息会在InitDialog之前,此时组件尚未构建,组件是不能调整的,所以判断条件里面加上这个IsWindow)

 

 


                
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:Age of Ai 设计师:meimeiellie 返回首页

打赏作者

春夜喜雨

送人玫瑰,手留余香!

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值