精华内容
下载资源
问答
  • 分别对应相应的处理函数:OnSize、OnSizing、OnGetMinMaxInfo。 当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO–>WM_SIZING–>WM_SIZE。 OnGetMinMaxInfo 这个函数在窗口初始化的时候会被调用一次,当...
  • 为了产生OnSIze、OnSizing和OnGetMinMaxInfo三个函数,需要在【类向导】中给对应的窗口的WM_SIZE、WM_SIZING、WM_GETMINMAXINFO三个消息添加消息处理函数。 当窗口大小发生动态变化时, 响应的顺序依次是: WM_...

    ----------------------------------------------------------------------------------------------------------------------------------------

    MFC编写时,经常需要在运行时动态调整窗口大小,并且使里面的控件和视图也随窗口的尺寸变化而发生变化。

    在这之间,您需要在资源视图中,设置该窗口的“Border属性”为Resizing,从而使窗口可以调整大小。

    ----------------------------------------------------------------------------------------------------------------------------------------


    为了产生OnSIze、OnSizing和OnGetMinMaxInfo三个函数,需要在【类向导】中给对应的窗口的WM_SIZE、WM_SIZING、WM_GETMINMAXINFO三个消息添加消息处理函数。

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



    OnGetMinMaxInfo()


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

    参数lpMMI是一个指向MINMAXINFO 结构体的指针,包含了有关窗口的尺寸信息,其中包括最大化大小和位置、窗口的最大最小跟踪范围。

    函数使用案例如下:

    void CTestDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
    {//控制窗口最小尺寸
    	
    	lpMMI->ptMinTrackSize.x = m_min_width;//x:宽度;m_min_width为对话框类CTestDLg的私有变量,在OnInitDialog()中已赋值
    	lpMMI->ptMinTrackSize.y = m_min_height;//y:高度,m_min_height为对话框类CTestDlg的私有变量,在OnInitDialog()中已赋值
    
    	CDialogEx::OnGetMinMaxInfo(lpMMI);
    }
    



    OnSizing()


    该函数在窗口大小发生变化时被调用。用该函数也可以控制窗口的最大最小尺寸,但是没有OnGetMinMaxInfo()函数方便。
    函数使用案例如下:

    void CTestDlg::OnSizing(UINT fwSide, LPRECT pRect)
    {
    	CDialogEx::OnSizing(fwSide, pRect);
    
    	//框架调用该成员函数指示用户调整矩形
    	//通过处理此消息,应用程序可以监视拖动矩形的大小和位置,因此,如果需要,更改其大小或位置。
    
    	int Width = pRect->right - pRect->left;//计算“变化当前”窗口宽度
    	int Height = pRect->bottom - pRect->top;//计算“变化当前”窗口高度
    	//若“变化宽度”小于设定的最小宽度,则把真实宽度设置为最小宽度
    	if (Width < m_min_width)
    		pRect->right = pRect->left + m_min_width;
    
    	if (Height < m_min_height)
    		pRect->bottom = pRect->top + m_min_height;
    }
    注意:用上面的方法,若从窗口右边调节其大小,可以达到想要的效果;但是从左边调节窗口大小时,虽然大小可以控制在约定尺寸,但是当达到最小宽度后,再缩小窗口时,会发现整个窗口往右移动了。原因在于代码中pRect->right = pRect->left + MinWidth;这条语句是相对left来改变right的,而对left没有约束,所有left移动了,right也跟着移动。看上去就像窗口右移了。所以针对这种情况要另外做相应处理。



    OnSizie()


    该函数会在窗口大小改变结束后被调用,通常我们会在该函数中重新计算各个空间的位置及大小,并重绘。但用这个函数没有办法控制窗口的最大最小尺寸。

    函数使用案例如下:

    void CTestDlg::OnSize(UINT nType, int cx, int cy)
    {
    	CDialogEx::OnSize(nType, cx, cy);
    
    	// TODO: 在此处添加消息处理程序代码
    
    	CRect current_dialog_rect;
    	GetClientRect(¤t_dialog_rect);//捕获窗口大小变化后的窗口大小
    
    	CWnd * p_wnd;//用于获取窗口元素
    	CRect rect;
    	
    	//重新计算“确认”按钮的位置,left、top、right、bottom
    	rect.left = 20;
    	rect.top = 20;
    	rect.right = rect.left + 100;
    	rect.bottom = rect.top + 40;
    
    	p_wnd = GetDlgItem(IDC_BUTTON_OK);//通过“确认”按钮的ID来得到按钮元素
    	if (p_wnd)
    	{
    		p_wnd->MoveWindow(&rect);//将“确认”按钮移动到新的位置
    	}
    }







    展开全文
  • 其他版本和控件未测试,而OnSizing没有这问题。 前一方法没有问题,经过详细测试后已排除了上述原因,已确认是对ClistCtrl的误操作导致。 对于OnSizing,一开始在网上找了半天都是残缺的使用方法,那些人都没想想...

    之前用的GetMinMaxInfo,在VS2015中会导致:Report模式的CListCtrl随窗口拉伸时,表头无法绘制超过原大小的区域。其他版本和控件未测试,而OnSizing没有这问题。

    前一方法没有问题,经过详细测试后已排除了上述原因,已确认是对ClistCtrl的误操作导致。

    对于 OnSizing ,一开始在网上找了半天都是残缺的使用方法,那些人都没想想参数 fwSide (Forward Side)有没有用,最后我为了代码可读性找了半天,最终通过VS的自动补完找到了宏定义。

    例程只限制了最小范围,但完全可以实现限制最大范围。

    其中 MINI_WIDTH 、 MINI_HEIGHT 为自定义的最小范围, WMSZ_XXXXXX 表示你拉伸的起点方向(共八个)

    void CMyDlg::OnSizing(UINT fwSide, LPRECT pRect)
    {
        if (pRect->right - pRect->left < MINI_WIDTH) {
            if (fwSide == WMSZ_LEFT
                || fwSide == WMSZ_TOPLEFT
                || fwSide == WMSZ_BOTTOMLEFT) {
                pRect->left = pRect->right - MINI_WIDTH;
            }
            else {
                pRect->right = pRect->left + MINI_WIDTH;
            }
        }
        if (pRect->bottom - pRect->top < MINI_HEIGHT) {
            if (fwSide == WMSZ_TOP
                || fwSide == WMSZ_TOPLEFT
                || fwSide == WMSZ_TOPRIGHT) {
                pRect->top = pRect->bottom - MINI_HEIGHT;
            }
            else {
                pRect->bottom = pRect->top + MINI_HEIGHT;
            }
        }
        CDialogEx::OnSizing(fwSide, pRect);
    }

     

    转载于:https://www.cnblogs.com/sssworld/p/5418187.html

    展开全文
  • 3.2 在OnSizing中控制窗口的大小:使用传入传出参数pRect控制  a. 响应调整:根据用户调整的方向,当用户从左边挑宽度是,我们也从左边调,同理高度也如此  b. 大小限制:当移动的大小超出我们设置的限制时...


    参考: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)

     

     

    展开全文
  • 最近用到窗口变化的一些东西,遇到几个相关的消息...分别对应相应的处理函数:OnSize、OnSizing、OnGetMinMaxInfo。 当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。  

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

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

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

     

    OnGetMinMaxInfo

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

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

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

    [cpp]  view plain copy
    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 plain copy
    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

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

    展开全文
  • 最近用到窗口变化的一些东西,遇到几个相关的...分别对应相应的处理函数:OnSize、OnSizing、OnGetMinMaxInfo。 当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。   OnGetMi
  • 函数onsize()与onsizing()区别

    千次阅读 2014-09-18 16:50:15
    OnSize是控件大小发生变化后发给你的消息,你可以得到控件将要变成多大(cx和cy指定),OnSizing是正在改变的大小,例如用户点击着鼠标拖放一个控件的大小,这个时候就收到OnSizing
  • 原文地址:窗口变化相关消息OnSize、OnSizing和OnGetMinMaxInfo作者:刘加国 窗口变化相关消息 OnSize、OnSizing和OnGetMinMaxInfo 分类:VC 6.02012-02-15 12:31129人阅读评论(2)收藏举报 最近用到窗口...
  • void CDlg::OnSizing(UINT fwSide, LPRECT pRect) {  //pRect窗口变化后的大小    CDialog::OnSizing(fwSide, pRect); }  OnSize函数会在窗口大小改变结束后被调用,通常会在这个函数里重新摆放各个...
  • 分别对应相应的处理函数:OnSize、OnSizing、OnGetMinMaxInfo。 当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。 OnGetMinMaxInfo 这个函数在窗口初始化的时候会...
  • 最近用到窗口变化的一些东西,遇到几个相关的消息函数,简要...分别对应相应的处理函数:OnSize、OnSizing、OnGetMinMaxInfo。 当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。
  • CWnd::OnSizing的问题

    2012-02-02 11:49:01
    我的窗口里面响应了OnSizing MSDN对afx_msg void OnSizing( UINT nSide, LPRECT lpRect ); 中的lpRect解释是这样的 lpRect Address of the CRect or RECT structure that will contain the item's ...
  • 是不是调用OnSize,MFC系统就会调用MoveWindow函数,而不需要再另外调用了呢?
  • 控件是从CWnd衍生的,但不能运用SetWindowPos()或OnSize()或OnSizing()来改变其大小,应在父窗口的WM_SIZE讯息中运用MoveWindow()来进展整合。VC++之依据对话框大小曲整控件大小一、在对话框类中加入成员变量CRect m...
  • Windows消息大全(转载)

    千次阅读 2006-04-27 09:33:00
    消息 MSG_MAP 相应函数 作用WM_LBUTTONDOWN ON_WM_LBUTTONDOWN() OnLButtonDown(UINT nFlags, CPoint point) 相应鼠标左健单击WM_ERASEBKGND ON_MESSAGE(WM_ERASEBKGND,
  • 然后在OnSize和OnSizing中添加 graphics->Resize(m_hWnd); 就行了 那么如果想做个游戏,想要动态的画面,怎么弄呢?总不能被动地调用绘画了吧?也就是要主动绘画了,所以我就用 WM_TIMER 实现了主动绘画,我做的...
  • OnSizing ( UINT nSide , LPRECT lpRect ) ; DECLARE_MESSAGE_MAP ( ) private : int m_iClientWidth ; // 对话框client区域的宽度 int m_iClientHeight ; // 对话框client区域的高度 int m_...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 343
精华内容 137
关键字:

onsizing