基于单文档的CFormView动态调整对话框的尺寸并成比例调整部署控件
如果你正在开发基于单文档程序,使用了CFormView基类实现多个窗口的显示,那么这个文档可能会给你提供些许帮助。
一、实现对话框填充客户区
当我们添加了资源对话框时,它的尺寸在客户区显示时是不会随着窗口的大小调整的,当框架尺寸小于它的尺寸时,还出现了滚动条,操作麻烦同时视觉效果也不良好。
思路
根据客户区的大小调整资源对话框的大小,而客户区大小由父级的框架进行设定。
步骤
1、 根据屏幕分辨率设定框架的尺寸
请注意,我们不能将在InitInstance中ShowWindow参数SW_SHOW 直接改为SW_SHOWMAXIMIZED。虽然窗口是最大化了但是我们的在CFormView中使用GetClientRect可以看到客户区的尺寸仍然是原来的大小。
如果在PreCreateWindow或者OnCreate函数中设定框架的尺寸时,发现并没有起到作用。
正确的方法是在MainFrame中重载OnGetMinMaxInfo,并根据屏幕分辨率设定窗口的尺寸。
//依据屏幕分辨率设置框架大小
voidCMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
lpMMI->ptMinTrackSize.x= cx;
lpMMI->ptMaxTrackSize.x = cx;
lpMMI->ptMaxTrackSize.y = cy;
lpMMI->ptMinTrackSize.y = cy;
CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
并在PreCreateWindow中设定窗口的初始坐标。
cs.x= 0;cs.y = 0;
2、 根据客户区尺寸设定对话框的尺寸
在View中的OnInitialUpdate函数进行操作,这是View第一个执行的函数。
CRect rect;
GetClientRect(&rect);
MoveWindow(&rect);
3、根据对话框大小动态调整控件的大小和位置
使用了网上获得一个方法,并进行了修改具体如下,视类中添加成员变量和成员函数:
voidSetControlInfo(WORD CtrlID);
protected:
intm_old_cx,m_old_cy;
CDWordArraym_control_info;
在OnInitialUpdate初始化:
CSizesz = GetTotalSize();
m_old_cx= sz.cx;
m_old_cy=sz.cy;
加控件信息的函数定义:
voidCTestFormView::SetControlInfo(WORD CtrlID){
m_control_info.Add(CtrlID);
}
添加OnMySize函数
voidCTestFormView:: OnMySize (UINT nType,int cx,int cy){
if(cx==0 || cy ==0){
cx =800;
cy = 600;
}
floatdx_percent = (m_old_cx==0)?1:(float)((float)cx/(float)m_old_cx);
floatdy_percent = (m_old_cy==0)?1:(float)((float)cy/(float)m_old_cy);
if(m_old_cx){
CRect WndRect;
CWnd * pWnd;
for(inti=0;i<m_control_info.GetSize();i++){
pWnd = GetDlgItem(m_control_info[i]);
if(!pWnd){
TRACE(_T("Control ID-%dNot"),m_control_info[i]);
continue;
}
pWnd->GetWindowRect(&WndRect);
ScreenToClient(&WndRect);
WndRect.left= (int)(WndRect.left*dx_percent );
WndRect.right= (int)(WndRect.right*dx_percent );
WndRect.top= (int)(WndRect.top*dy_percent );
WndRect.bottom= (int)(WndRect.bottom*dy_percent );
pWnd->MoveWindow(&WndRect);
}
}
m_old_cx= cx;
m_old_cy= cy;
}
在OnInitialUpdate函数中加入控件ID
SetControlInfo(IDC_BUTTON1);
……
请大家注意了,这里需要获得对话框的初始尺寸就是我们在资源对话框中拉出的对话框的大小,才能知道缩放的比例。
获得初始尺寸使用的CScrollView中的函数GetTotalSize获得的。
CFormView动态调整对话框的尺寸并成比例调整部署控件