关于如何设置对话框的最大(小)高度与宽度,网上有很多blog介绍了这个方面,我觉得有一篇写的比较好,先扒过来凑点字数

以下内容转自http://www.youranshare.com/push/code/win-c-cpp/427.html:

在MFC中,没有像QT那样的函数可以直接通过某个函数就可以完成对窗口的最大最小SIZE信息进行设置,但是这么强大的MFC,这种弱鸡的问题肯定也就不是问题,这里给大家分享三个方法来完成限定窗口大小的处理。

方法一:响应窗口 WM_SIZE 消息(不推荐)

WM_SIZE 消息是当窗口大小发生改变发送的,所以如果要在这个窗口中限制窗口大小的话,你就需要重新计算窗口的大小信息,代码如下:

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{CFrameWnd::OnSize(nType, cx, cy);// TODO: 在此处添加消息处理程序代码CRect rect ;BOOL IsNeedReset = FALSE;GetWindowRect(&rect);if(cx<640){IsNeedReset = TRUE;rect.right = rect.left+640;}if(cy<480){IsNeedReset = TRUE;rect.bottom = rect.top+480;}if(IsNeedReset){SetWindowPos(NULL,rect.left,rect.top,rect.Width(),rect.Height(),SWP_SHOWWINDOW|SWP_NOMOVE);}
}

由于OnSize是在窗口大小已经改变后才执行的,所以如果在代码种再次执行窗口的大小调整将会导致闪烁的问题,所以这种方法不推荐。

方法二:响应窗口 WM_SIZEING 消息(较为推荐)

WM_SIZEING消息是当窗口大小正在发生改变的时候发送的,所以可以在此消息种限制改变的大小从而达到限制窗口大小的目的,但是对于一个窗口来说,其改变大小的方式有很多,例如从窗口的四个方向都可以改变其大小,WM_SIZEING 消息有一个SIDE参数其描述了改变方向边界位置,这里为了简单,不去处理这个参数,如果你从左侧调整大小,可以发现很好玩的状态。

void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect)
{//这里还需要知道 dwSide的信息,就是从那个方向进行变动//这里省略了,不建议使用这种方法//如果不处理方向,你可以试试看窗口从左下角 变小,很好玩的if(pRect->right-pRect->left<=840){   pRect->right = pRect->left+840;}if(pRect->bottom-pRect->top<=480){   pRect->bottom = pRect->top+480;}//CFrameWnd::OnSizing(fwSide, pRect);// TODO: 在此处添加消息处理程序代码
}

WM_SIZEING 这种处理是可行的,不会出现闪烁的问题,但是需要处理一个dwSide的参数,处理起来较为复杂。

方法三:响应窗口 WM_GETMINMAXINFO消息(推荐)

当一个窗口的位置或者大小将要改变的时候将会发送一个WM_GETMINMAXINFO的窗口消息,应用程序可以使用这个消息来重设窗口的默认最大化大小和位置,或者窗口的默认最小或最大拖放大小。

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{//调整最小高度与宽度,如果需要的话lpMMI->ptMinTrackSize.x = 640;lpMMI->ptMinTrackSize.y = 480;//调整最大高度与宽度,如果需要的话lpMMI->ptMaxTrackSize.x = 1366;lpMMI->ptMaxTrackSize.y = 768;CFrameWnd::OnGetMinMaxInfo(lpMMI);
}

WM_GETMINMAXINFO的处理简单易懂,无需繁杂的计算即可限定窗口的拖放大小等信息。

下面我接着写自己遇到的问题。我的对话框是Popup无边框对话框,本打算用上面的二或者三方法解决限制窗口大小的问题,却发现对话框接收不到WM_SIZING和WM_GETMINMAXINFO消息,而用WM_SIZE解决方案有有点丑陋,于是想到了能不能响应WM_WINDOWPOSCHANGING消息解决,还好,可以这此消息里设置对话框的大小:

 void OnWindowPosChanging(LPWINDOWPOS lpWndPos){if (m_iMaxWidth != 0 && lpWndPos->cx > m_iMaxWidth){lpWndPos->cx = m_iMaxWidth;}if (m_iMaxHeight != 0 && lpWndPos->cy > m_iMaxHeight){lpWndPos->cy = m_iMaxHeight;}}

结论嘛就是在无边框对话框是不响应 WM_SIZING和 WM_GETMINMAXINFO消息的(我想这是因为没有Resizing属性导致),但是呢可以使用WM_WINDOWPOSCHANGING消息解决限制对话框大小问题。我有回头翻了下E文:

For a window with the WS_OVERLAPPED or WS_THICKFRAME style, the DefWindowProc function sends theWM_GETMINMAXINFO message to the window. This is done to validate the new size and position of the window and to enforce the CS_BYTEALIGNCLIENT and CS_BYTEALIGNWINDOW client styles. By not passing the WM_WINDOWPOSCHANGING message to the DefWindowProc function, an application can override these defaults.

While this message is being processed, modifying any of the values in WINDOWPOS affects the window's new size, position, or place in the Z order. An application can prevent changes to the window by setting or clearing the appropriate bits in the flags member of WINDOWPOS.

根据上面所写,只有窗口具有WS_OVERLAPPED 或者 WS_THICKFRAME时,才会收到 WM_GETMINMAXINFO消息。另外也可以清除WINDOWPOS成员flags某些bit位阻止窗口改变。例如上面的代码也可以这样写:

 void OnWindowPosChanging(LPWINDOWPOS lpWndPos){if (lpWndPos->cx > m_iMaxWidth || lpWndPos->cy > m_iMaxHeight){lpWndPos->flags |= SWP_NOSIZE;}}

如何设置对话框的最大(小)高度与宽度相关推荐

  1. 设置对话框的小三角方法

    ①:当小三角颜色边框与内部颜色一致时,可以使用三角形的画法(纯CSS绘制三角形(各种角度))或者使用搜狗输入法中的◆符号设置: ②:当小三角只需要设置颜色边框,且不需要设置内部颜色时,可以使用搜狗输入 ...

  2. JAVA语言版之字体格式设置对话框的编程实现

    在编写自己的记事本小程序时,为了给里面的文本设置格式,需要一个格式对话框来进行这方面的设置,但是,在JAVA中,并没有现成的字体格式设置对话框供我们使用,这时,我们就需要自己去设计一个对话框.接下来讲 ...

  3. word如何设置长宽高_word页面高度和宽度怎么设置

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. word设置宽度高度的方法: 1.首先打开一篇文档,在功能区选择"页面布局". 2.在页面布局的页面设置功能区 ...

  4. vs如何设置对话框显示在最前面_【另存为】对话框的使用

    原文链接: No.21 [另存为]对话框的使用​mp.weixin.qq.com [另存为]对话框 [另存为]对话框我们也十分熟悉,一般用来保存文件到指定的路径.其实它和[打开]对话框除了标题文字不同 ...

  5. java 设置宽度和高度,如何通过设置高度和宽度来使宽度和高度反映ScaleTransform以及如何进行ScaleTransform?...

    我有一个关于在Silverlight中使用Canvas上的ScaleTransform的问题,Canvas正确缩放,但是Height和Width值始终保持不变 . 例如一个100x100 Canvas ...

  6. BPM实例分享:如何设置开窗高度与宽度?

    版本: V9.2.7 问题描述: DropDown的开窗查询中高度与宽度设置无效 解决方案: 修改MvcSheetAll,具体修改文件位置在: /Portal/WFRes/_Scripts/MVCSh ...

  7. css设置元素继承父元素宽度_CSS设置HTML元素的高度与宽度的各种情况总结

    1.元素不设宽度 第一种情况:元素为文档流中元素 dd dd dd 结论1:把子元素定位换成position:relative与上述例子表现一样,因此在元素不设宽度时,若元素为文档流中元素,则此元素继 ...

  8. android 动态让控件超出屏幕_android 动态设置屏幕控件宽高度

    获取屏幕宽高度: WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE); Displ ...

  9. vs如何设置对话框显示在最前面_“打开”对话框的使用

    原文链接: No.20 "打开"对话框的使用​mp.weixin.qq.com 打开 对话框 我们昨天熟悉了"字体"对话框,今天我们来看一下"打开&q ...

最新文章

  1. memcached java 多线程_springboot使用memcache缓存
  2. 死磕Synchronized底层实现--偏向锁
  3. Java入门算法(排序篇)丨蓄力计划
  4. IdentityServer4实战 - 谈谈 JWT Token 的安全策略
  5. Android之升级OkHttp编译提示错误如下Using ‘body(): ResponseBody?’ is an error. moved to val
  6. 注解 @ModelAttribute 运用详细介绍
  7. java 某年某月中第几周 开始时间和结束时间_重磅!库里又要签下一超级大合同!4年2亿啊!退役时间也定了...
  8. mysql ha 安装 配置文件_Linux下环境安装配置Rose HA全攻略(图)
  9. java 数据库备份 linux,java邮件打包在linux备份数据库练习
  10. 在CentOS 7上利用systemctl添加自定义系统服务 /usr/lib/systemd/
  11. 2018年最受欢迎的Python库,你都用过吗?
  12. python爬百度新闻_13、web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息...
  13. Linux系统基本操作及命令详解
  14. Android隐藏状态栏实现沉浸式体验
  15. 【机器学习线性代数】17 利用SVD进行彩色图片压缩
  16. 2020写真消费人群需求报告
  17. 今天出门你查老黄历了吗?包括万年历在内的超多免费可用 API 推荐(一)
  18. matlab三相异步电动机仿真,三相异步电动机的MATLAB仿真研究
  19. 推荐一个开源库(Calligraphy)将ttf字体库加入到项目中,轻松实现各种字体
  20. 调焦后焦实现不同距离成像_相机的“对焦”和“变焦”,这二者有什么区别?...

热门文章

  1. 今天是我的生日,十年如一日
  2. python 日历节假日显示颜色_python判断2018/2019年的某天是否是节假日
  3. Python爬虫任务1
  4. java 实现EME2000(国家大地坐标系)转ECEF坐标系(地心地固坐标系)
  5. 华为路由器交换机配置命令
  6. 温习古文之念奴娇·赤壁怀古
  7. Verilog语言要素(二)
  8. 大数据与人工智能方向基础 --- 概述
  9. mysql中如何去除重复数据_mysql数据库如何去除重复数据
  10. 科普向-----验证码