MFC:如何让对话框中的控件和对话框一起变小变大
2011-04-25 16:43 愤怒的青蛙 阅读(2951) 评论(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函数那么简单了,实现起来有点复杂。等我掌握了这个复杂的方法,一定会拿来分享的。