窗口变化相关消息 OnSize、OnSizing和OnGetMinMaxInfo

最近用到窗口变化的一些东西,遇到几个相关的消息函数,简要分析,作为备忘。

3个消息分别是:WM_SIZE、WM_SIZING、WM_GETMINMAXINFO;分别对应相应的处理函数:OnSize、OnSizing、OnGetMinMaxInfo。

当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。

 

OnGetMinMaxInfo

这个函数在窗口初始化的时候会被调用一次,当窗口大小发生改变的时候也会被调用。利用这个函数,可以比较方便的实现窗口最大最小尺寸的控制。

参数lpMMI是一个结构体指针,其中包含了有关窗口的最大化大小和位置以及最小、最大跟踪大小的信息。

使用这个函数控制窗口最小尺寸的示例的代码如下:

[cpp] view plaincopy

  1. void CXXXDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)   
  2. {  
  3.     lpMMI->ptMinTrackSize.x = 500;   //x宽度  
  4.     lpMMI->ptMinTrackSize.y = 100;   //y高度  
  5.   
  6.     CDialog::OnGetMinMaxInfo(lpMMI);  
  7. }  

以上代码可以使得窗口大小变化时,最小宽度为500px,最小高度为100px。

 

OnSizing

这个函数在窗口大小发生变化时被调用。在这个函数里,也可以控制窗口的最大最小尺寸,但是没有OnGetMinMaxInfo方便。

[cpp] view plaincopy

  1. void CXXXDlg::OnSizing(UINT fwSide, LPRECT pRect)   
  2. {  
  3.     if ((pRect->right - pRect->left) < 500)  
  4.     {  
  5.         //return ;  //直接return是无效的,窗口大小还是会改变  
  6.         pRect->right = pRect->left + 500;  
  7.     }  
  8.   
  9.     CDialog::OnSizing(fwSide, pRect);  
  10. }  

用上面的方法,如果是从右边改变大小,可以达到想要的效果,但是从左边改变大小,虽然大小可以控制在最小500,但是当达到最小宽度后,再缩小,会发现整个窗口往右移动了,原因是代码中的pRect->right = pRect->left + 500;这句是针对left来改变right的,所以left移动了,right也移动了,看上去就像是这个窗口右移了。所以针对这种情况又要另外做相应的处理。

 

OnSize

这个函数会在窗口大小改变结束后被调用,通常会在这个函数里重新摆放各个控件的位置及大小。用这个函数暂时没有找到什么办法可以控制窗口的最大最小大小。

时间: 2024-10-23 00:47:59

窗口变化相关消息 OnSize、OnSizing和OnGetMinMaxInfo的相关文章

OnSize、OnSizing和OnGetMinMaxInfo区别分析_C 语言

最近用到窗口变化的一些东西,遇到几个相关的消息函数,简要分析,作为备忘. 3个消息分别是:WM_SIZE.WM_SIZING.WM_GETMINMAXINFO:分别对应相应的处理函数:OnSize.OnSizing.OnGetMinMaxInfo. 当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE. OnGetMinMaxInfo 这个函数在窗口初始化的时候会被调用一次,当窗口大小发生改变的时候也会被调用.利用这个函数,可以比

mfc 分割窗口后窗口变化问题

问题描述 mfc 分割窗口后窗口变化问题 mfc 分割窗口后,窗口最大化时,如何让各个窗口等比例随之变化问题 谢谢,大神指导 解决方案 打开classwizard,映射wm_resize消息,添加上面的代码 解决方案二: //OnSize,MoveWindow //eg: void CMainFrame::OnSize(UINT nType, int cx, int cy) { CFrameWnd::OnSize(nType, cx, cy); if (!m_wndStatusBar.m_hWn

swing-java中JTable如何用代码设置不随窗口变化而变化

问题描述 java中JTable如何用代码设置不随窗口变化而变化 在学习JTable时发现我的表格会随着JAVA窗口的变化而变化,想知道如何不让它 变化,也就是说如何让它固定化? 代码如下: package com.view; import java.awt.Color; import javax.swing.*; public class NewFrame extends JFrame { private String[] columnNames= { "Country","

VMware公司保密安全规划相关消息终于披露

VMware公司已经展示了其Goldilocks项目的原型设计,这也正式印证了其长久以来一直暗示的,正在开发一款新型安全方案的计划. VMware公司保密安全规划相关消息终于披露 VMware公司Goldilocks项目原理示意图. 其设计灵感源自NSX网络虚拟化产品创建网络"微分区"的能力,即将虚拟网络隔离于网络内其余部分之外,从而建立起"最低权限环境",即仅允许策略中所设定的必要权限.微分区的流行让VMware颇感意外,但用户则乐于借此创建自己的虚拟网络,并确保

CSS3+HTML5特效8 - 顶部和右侧固定,左侧随窗口变化的布局

原文:CSS3+HTML5特效8 - 顶部和右侧固定,左侧随窗口变化的布局 效果演示     实现原理 使用3个div(一个是顶部栏,一个是左侧栏,一个是右侧栏): 使用checkbox作为判断是否显示和隐藏右侧栏,点击显示和隐藏label实现最终效果.   代码说明 css <style> body { font-family:"Microsoft YaHei",arial,sans-serif; margin: 0px; padding: 0px; color: #66

echarts使图标能自适应浏览器窗口变化,及经纬度转换

1.echarts使图标能自适应浏览器窗口变化 window.onresize = function () { myChart.resize(); //使第一个图表适应 myChart_pieMain.resize(); // 使第二个图表适应 } 2.map地图中经纬度与平面坐标转换 var arr = [117,36.4]; alert(myChart.chart.map.getPosByGeo("china",arr));  //map经纬度转成平面坐标

c#中两个窗口如何发送消息?

问题描述 c#中两个窗口如何发送消息? 解决方案 解决方案二:用事件和委托.解决方案三:http://blog.csdn.net/guolei0451/category/238471.aspx解决方案四:委托与事件.解决方案五:SendMessagePostMessage解决方案六:你指的是不是数据交换,如果是,参考这里,http://blog.csdn.net/zhzuo/archive/2004/04/05/22027.aspxhttp://blog.csdn.net/zhzuo/archi

陶鑫良在其实名认证微博上发布相关消息

月3日下午,http://www.aliyun.com/zixun/aggregation/6831.html">韩寒代理律师之一,陶鑫良在其实名认证微博上发布相关消息,称代理韩寒向普陀区法院提交了起诉状,起诉方舟子侵害名誉权与著作署名权.随即,普陀法院证实已收到韩寒律师递交的诉状,7个工作日之内将进行审核,并最终确认是否立案. 昨天下午,普陀法院方面表示,收到韩寒诉方是民(笔名:方舟子).刘明泽名誉权纠纷及侵害作品署名权纠纷的起诉材料.经审查,已正式立案. 此前,2月6日,陶鑫良再次通过

Twitter受益飓风桑迪:相关消息量达2000万条

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 腾讯科技讯(小贝)北京时间11月3日消息,据国外媒体报道,极具破坏力的飓风"桑迪"令美国数百万人受灾,很多人通过Twitter讨论自己的经历.日前Twitter宣布了一些关于飓风"桑迪"过境期间的数据,从10月27日到11月1日,有关"飓风"和"桑迪"的Twitt