在其中添加void ModelAcquire::OnSize(UINT nType, int cx, int cy)消息
根据这里的nType可以判断窗口的最大化还是最小化
if(nType == SIZE_MINIMIZED) {//最小化
return ;
}
else if (nType == SIZE_MAXIMIZED) {//最大化
;
}
else if (change_flag == TRUE){//还原
;
}
1、 在缩放之前获得缩放前的窗口的大小
m_isInitial == TRUE保证窗口已经初始化完毕
if(m_isInitial == TRUE && m_modleDlgRect.IsRectEmpty()) {
GetWindowRect(m_modleDlgRect);
ScreenToClient(m_modleDlgRect);
m_isInitial = FALSE;
}
2、 获得缩放后的窗口的大小
CRect sizeRect;
GetWindowRect(sizeRect);
ScreenToClient(sizeRect);
if (sizeRect != m_modleDlgRect) {
}//判断,因为窗口在生成只有会调用onsize()函数三次,所以要做上面和这次的判断
3、 计算缩放的大小,记得要用float类型,否则误差会很大
floatscalarWidth = sizeRect.Width()* 1.0 /m_modleDlgRect.Width() * 1.0;
float scalarHeight = sizeRect.Height() * 1.0/ m_modleDlgRect.Height() * 1.0;
4、对所用控件进行缩放的时候,把所有控件都放在int型的数组中,这样在onsize中进行缩放的时候就可以直接用for(),从而避免大量的重复代码
for (int i = 0; i <m_ptIDCount; i++) {
CRect rect;
CWnd * cWnd =GetDlgItem(m_ptID[i]);
cWnd->GetWindowRect(rect);
ScreenToClient(rect);
CRect moveRect;
moveRect.left = rect.left *scalarWidth;
moveRect.top = rect.top *scalarHeight;
moveRect.right = rect.right *scalarWidth;
moveRect.bottom = rect.bottom *scalarHeight;
TCHAR classname[255];//存储类型的控件的名称
GetClassName(cWnd->GetSafeHwnd(),classname,sizeof(classname));
CString str;
str.Format("%s",classname);
if(str=="ComboBox") {
cWnd->MoveWindow(moveRect.left,moveRect.top, moveRect.Width(), moveRect.Height() * 100);
}
else
cWnd->MoveWindow(moveRect);
}
移动控件的时候用moveWindow();
4、 这个地方值得注意的是,由于combox是有ListBox和文本框组合而成,如果我们直接对其进行缩放的话,就会发现下拉框中就没有内容了,所以多做个判断就可以解决问题了
CHARclassname[255];//存储类型的控件的名称
GetClassName(cWnd->GetSafeHwnd(),classname,sizeof(classname));
CStringstr;
str.Format("%s",classname);
if(str=="ComboBox") {
cWnd->MoveWindow(moveRect.left,moveRect.top, moveRect.Width(), moveRect.Height() * 100);//这里设置combox固定的下拉框的大小
}
else
cWnd->MoveWindow(moveRect);