MFC 控件随窗口大小变化

首先放一下参考的链接。。

http://blog.sina.com.cn/s/blog_4b5039210100dzkd.html

http://bbs.csdn.NET/topics/350153879

http://blog.csdn.Net/liuy_yy/article/details/7219616


以上第一篇文章博主的方法虽然可以实现控件按比例跟随窗口变大变小,但问题来了。。

button控件我们不需要他变大啊(变大要丑死),而编辑框控件(Edit Control)到边角的距离应该保持不变。

所以必须换一种方法。。

第二篇文章是一个帖子,里面说到可以用MoveWindow/SetWindowPos自己调整按钮的位置或者大小。

操作方式类似于第一篇文章博主的做法


 1   首先要知道对话框大小是否改变,改变了多少,我们应该记录当前对话框的大小。

      现在Dlg上面拖进来一个Edit  Control  ,命名为IDC_EDIT1。

     在CTestDlg对话框类(根据工程名的不同,读者自己找自己的对话框类,一般以Dlg结尾)中添加成员变量 CRect m_rect 他是用来记录当前对话框的大小。

      我们在OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);

 2   增加消息WM_SIZE的消息响应函数OnSize(): 只要对话框大小发生变化,就会调用该函数。

      PS:  消息响应函数的添加方法可参考文章末尾

 3   在OnSize()函数中增加如下代码:(最简单的为例子,就一个确定按钮,取消按钮和一个编辑框)

 

 void CTestDlg::OnSize(UINT nType, int cx, intcy)
{
     CDialog::OnSize(nType, cx, cy);
 
     // TODO: Add your message handler code here
 

      CWnd *pWnd; 
      pWnd =GetDlgItem(IDC_EDIT1);    //获取控件的句柄
     if(pWnd)  //判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
     {
              CRectrect;   //获取控件变化前的大小  

              pWnd->GetWindowRect(&rect);
              ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
              
//        cx/m_rect.Width()为对话框在横向的变化比例

            

               rect.left=rect.left;//调整控件大小
               rect.right=         cy  -  ( m_rect.Width() -  rect.right  ) ;
               rect.top=rect.top;
               rect.bottom=    cy   -   (  m_rect.Height() - rect.bottom   ) ;



               pWnd->MoveWindow(rect);//设置控件大小

        }
         GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小
 }


归根结底的思路就是:用旧的坐标,通过数学计算得到新的坐标。

上面那个示例的运行结果,确定取消按钮是不会动的。。

如果想要让他们也动,需要重新修改坐标那块的代码。


累。。。

老师告诉我们,如果有一个功能实现不了,那肯定是你不知道,不是人家实现不了。

肯定会有更简单的方法。。


于是找到了这个东西   easysize

使用方法很简单。


1、在stdafx.h中引用EasySize.h头文件(同时将EasySize.h放到你的程序目录中)

 

2、在类定义中添加DECLARE_EASYSIZE

  1. <pre name="code" class="html">class CEasySizeDemoDlg : public CDialog  
  2. {  
  3.      DECLARE_EASYSIZE    //(此处没有分号)  
  4.      ``````  
  5. };  
<pre name="code" class="html">class CEasySizeDemoDlg : public CDialog
{
     DECLARE_EASYSIZE    //(此处没有分号)
     ``````
};


 

3、增加OnInitDialog处理函数,将INIT_EASYSIZE放到函数尾处。

  1. <pre name="code" class="cpp">BOOL CEasySizeDemoDlg::OnInitDialog()  
  2. {  
  3. `````     
  4.     INIT_EASYSIZE;     
  5.         return    TRUE;  
  6. }  
<pre name="code" class="cpp">BOOL CEasySizeDemoDlg::OnInitDialog()
{
`````	
	INIT_EASYSIZE;   
        return    TRUE;
}


 

4、增加OnSize函数(OnSize 是WM_SIZE的消息函数,不会添加的看最下面),添加宏UPDATE_EASYSIZE

  1. <pre name="code" class="cpp">void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy)   
  2. {  
  3.     CDialog::OnSize(nType, cx, cy);  
  4.     UPDATE_EASYSIZE;  
  5. }  
  6.   
  7.    
<pre name="code" class="cpp">void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	UPDATE_EASYSIZE;
}

 

 

5、可选(最小化)

6、创建EasySize映射(map),在你对话框实现文件的  xxxxxDlg.cpp中找到类似这样的代码

BEGIN_MESSAGE_MAP(CcameraDlg, CDialogEx)   END_MESSAGE_MAP()

在下面添加

  1. BEGIN_EASYSIZE_MAP(CEasySizeDemoDlg)    
  2.     EASYSIZE(IDC_EDIT1, ES_BORDER, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0)    
  3.     EASYSIZE(IDOK,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)    
  4.     EASYSIZE(IDCANCEL,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)    
  5.   
  6. END_EASYSIZE_MAP    
    BEGIN_EASYSIZE_MAP(CEasySizeDemoDlg)  
        EASYSIZE(IDC_EDIT1, ES_BORDER, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0)  
        EASYSIZE(IDOK,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)  
        EASYSIZE(IDCANCEL,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)  
 
    END_EASYSIZE_MAP  

通过在EasySize Map中使用EASYSIZE宏来指定当对话框改变时control相应的行为,宏定义格式如下:

EASYSIZE(control,left,top,right,bottom,options)

 

参数1(Control):需要重新定位的control ID.

参数2、3、4、5(left, top, right and bottom ):这四个参数可以设定的值有其它控件的ID、特定的值如如ES_BORDER、ES_KEEPSIZE。

 

ES_BORDER :代表控件与边框的距离保持不变。

ES_KEEPSIZE:代表控件的宽度和高度保持不变,left/right只能设置其中一个为ES_KEEPSIZE,同理,top/bottom亦然。

 

参数6(options):ES_HCENTER, ES_VCENTER and 0的组合。

ES_HCENTER :代表控件在left/right之间水平居中,此时这两个参数都不能设置为ES_KEEPSIZE,控件的宽度保持不变。

ES_VCENTER 同理(垂直方向)。


但是这样还是需要一个一个的设定,目前没有找到更简单的方法。。

===================================本教程结束============================================


关于如何添加消息映射函数


在这个Dlg上右键 ---类向导 ----




左边WM_XXXXXX   那一堆里面找到你想要的消息双击,然后点击右边的编辑代码,VS 会帮你做好前期工作的,代码复制进去就好了。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值