MFC:如何让对话框中的控件和对话框一起变小变大
2011-04-25 16:43 愤怒的青蛙 阅读(2998) 评论(1) 收藏 举报转载自: 麦兜响当当
一个基于对话框的MFC界面,怎么样才能让对话框里的控件能和对话框同比例变小变大?今天我一直想解决这个问题,这是师姐留给我的任务。经过在网上的大量搜素,终于找到了解决方法,其实比较简单。

当我们点击最大化按钮的时候,对话框会最大化,但是控件“确定”和“取消”不会跟着变大。如果我们在对话框上面有多少控件,那么会很丑,而且很不实用,最大化本来就是想看的更清楚嘛。
(这里要注意,如果在对话框没有生成前使用GetClientRect(&m_rect)是会报错的,貌似是断言错误,我不知道怎么解决,就使用一个比较笨的方法,在对话框显示出来后手动的再更新这个大小)
void CLayerItemProDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
CWnd *pWnd;
CWnd *pChild;
pWnd = GetDlgItem(IDC_MSFLEXGRID_PROPERTY);
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);
}
然后运行 ,当对话框最大化的时候,两个按钮也变大了。

PS:其实这种方法实现起来简单,但是是存在问题的,如果界面有很多控件,那个当你拖拽窗口的角的时候,经过几次变大变小,你会发现其实里面的控件已经失真了,就不是原来的长宽比例了。那么要实现不管窗口怎么变,里面的控件不但大小跟着变,而且大小比例也跟着变,那就不是这个OnSize函数那么简单了,实现起来有点复杂。等我掌握了这个复杂的方法,一定会拿来分享的。
浙公网安备 33010602011771号