您的位置:首页 > 其它

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

2015-12-01 21:02 531 查看
假设对话框类为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); //最后要更新对话框的大小,当做下一次变化的旧坐标;

}


}

原文地址:http://blog.163.com/scuqifuguang@126/blog/static/171370086201232741358711/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: