对话框最大化个人觉得完全是鸡肋,如果需要全屏话的软件完全可以用单文档实现,对话框只是实现一些小的功能的软件,但为了显示功能强大加上了最大化按钮,当初设计时是按对话框大小进行设计,放大以后真的不忍直视,但还是要将这倒霉的功能进行记录,以备后需。
对话框放大相应WM_SIZE消息,实现函数为Onsize(),只需在重载此函数即可
void CCDlgFrameDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
//对话框初始化之间会调用Onsize进行框架初始化,如果不加判断会报错,因为空间还未加载
if(Init_flag)
{
change(IDC_STATIC);
change(IDC_COMBO1);
change(IDC_EDIT1);
change(IDC_PROGRESS1);
change(IDC_BUTTON1);
//放大倍数保存
m_Multiple_width=1/m_Multiple_width;
m_Multiple_heigh=1/m_Multiple_heigh;
}
}
函数change(int nID)主要实现控件放大和恢复
void CCDlgFrameDlg::change(int nID)
{
CRect Rect;
GetDlgItem(nID)->GetWindowRect(Rect);
ScreenToClient(Rect);
CPoint OldTLPoint,TLPoint;
OldTLPoint=Rect.TopLeft();
TLPoint.x=long(OldTLPoint.x*m_Multiple_width);
TLPoint.y=long(OldTLPoint.y*m_Multiple_heigh);
CPoint OldBRPoint,BRPoint;
OldBRPoint=Rect.BottomRight();
BRPoint.x=long(OldBRPoint.x*m_Multiple_width);
BRPoint.y=long(OldBRPoint.y*m_Multiple_heigh);
Rect.SetRect(TLPoint,BRPoint);
GetDlgItem(nID)->MoveWindow(Rect,TRUE);
}
放大倍数的提取则是在调用两个函数之前
CRect rect;
GetWindowRect(&rect);
ScreenToClient(rect);
int m_nDlgWidth=rect.right-rect.left;
int m_nDlgHeight=rect.bottom-rect.top;
//获取屏幕尺寸
int m_nWidth=GetSystemMetrics(SM_CXSCREEN);
int m_nHeight=GetSystemMetrics(SM_CYSCREEN);·
m_Multiple_width=float(m_nWidth)/float(m_nDlgWidth);
m_Multiple_heigh=float(m_nHeight)/float(m_nDlgHeight);
放大倍数定义为float,是防止在多次放大和缩小时控件产生错位,精度高而已。