MFC如何使控件大小随着对话框大小自动调整

【直接设置对话框的大小:

可以将代码添加到初始化程序中:
(比如设置成640*480)
   CRect   temprect(0,0,640,480);   
   CWnd::SetWindowPos(NULL,0,0,temprect.Width(),temprect.Height(),SWP_NOZORDER|SWP_NOMOVE);

对话框的大小变化后,假若对话框上的控件大小不变化,看起来会比较难看。下面就介绍怎么让对话框上的控件随着对话框的大小的变化自动调整。

首先明确的是Windows有一个WM_SIZE消息响应函数,这个函数在对话框大小发生变化的时候调用,所以我们可以记录下原来对话框的大小,还有当前对话框的大小(这个不用自己算,系统已给出),然后根据控件做出相应比例的调整。

比如原来对话框大小为a,现在为b,原来控件大小为c,那么现在的控件大小应该为c*b/a;(注意a不能为0)。

看实例:(黑体字为添加的代码!!)

假设对话框类为CMyDlg类,那么首先设置一个变量

CRect  m_rect;   //用于保存原对话框大小

那么在对话框创建的时候先获得对话框的大小

BOOL CMyDlg::OnInitDialog()
{

          .........................
         SetIcon(m_hIcon, TRUE);   // Set big icon
         SetIcon(m_hIcon, FALSE);  // Set small icon
         // TODO: Add extra initialization here
         GetClientRect(&m_rect);  //获取对话框的大小

          return TRUE;  // return TRUE  unless you set the focus to a control
}
然后再手动添加一个函数,用以实现具体的变化

void CMyDlg::ChangeSize(UINT nID, int x, int y)  //nID为控件ID,x,y分别为对话框的当前长和宽
{
       CWnd *pWnd;
       pWnd=GetDlgItem(nID); 
       if(pWnd!=NULL)     //判断是否为空,因为在窗口创建的时候也会调用OnSize函数,但是此时各个控件还没有创建,Pwnd为空
       {
               CRect rec; 
               pWnd->GetWindowRect(&rec);  //获取控件变化前的大小
               ScreenToClient(&rec);   //将控件大小装换位在对话框中的区域坐标
               rec.left=rec.left*x/m_rect.Width();  //按照比例调整空间的新位置
               rec.top=rec.top*y/m_rect.Height();
               rec.bottom=rec.bottom*y/m_rect.Height();
               rec.right=rec.right*x/m_rect.Width();
               pWnd->MoveWindow(rec);   //伸缩控件
      }
}

最后添加windows消息响应函数OnSize:

void CMyDlg::OnSize(UINT nType, int cx, int cy)  //cx,cy就是当前对话框的长和宽
{
            CDialog::OnSize(nType, cx, cy);
 
            // TODO: Add your message handler code here
            if(nType!=SIZE_MINIMIZED )  //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作
          {
                  ChangeSize(IDC_LIST1,cx,cy);  //对每一个控件依次做调整
                  ChangeSize(IDC_LIST2,cx,cy);
                  ChangeSize(IDC_BUTTON1,cx,cy); 
                  ChangeSize(IDC_BUTTON2,cx,cy); 
                  GetClientRect(&m_rect);   //最后要更新对话框的大小,当做下一次变化的旧坐标;
         }

}

任务完成!

________________________________________________________________________

1、在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小;
2、在对话框的OnInitDialog()函数中获取对话框创建时的大小:
GetClientRect(&m_rect);
3、在WM_SIZE的响应函数OnSize()中加入以下代码:
CWnd *pWnd;
pWnd = GetDlgItem(IDC_LIST); //获取控件句柄
if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
{
CRect rect; //获取控件变化前大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
// cx/m_rect.Width()为对话框在横向的变化比例
rect.left=rect.left*cx/m_rect.Width();/////调整控件大小
rect.right=rect.right*cx/m_rect.Width();
rect.top=rect.top*cy/m_rect.Height();
rect.bottom=rect.bottom*cy/m_rect.Height();
pWnd->MoveWindow(rect);//设置控件大小
}
GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小

http://zhidao.baidu.com/question/235900863.html

http://www.baidu.com/link?url=52J4jyPTYmWQSEgaJQaJ_BPghLMN_3BAYWNvV9-s1lKP61YdMVdyg2U9erEoD2bbiJd4wib3nuz_XTeOk-wz9a

你可能感兴趣的:(MFC如何使控件大小随着对话框大小自动调整)