最近写MFC对话框项目需要控件自适应窗口的大小…,使用以前用过的方法经过多次测试发现对话框内的部件"每经过一次拉伸或收缩都会有一定比例的缩小(控件朝左上方向缩小)";
为了解决这个问题,继续查看代码发现 控件移动后的位置与控件上一次位置的倍数用的float储存,但是用来修改控件位置的SetRect函数传入的POINT结构体成员参数是long类型(小数位被舍去) ; 针对这种情况我们通过计算就可以得到含有小数位的控件移动后的位置并且根据小数位的数字大小进行增加或者舍弃,下面贴上代码:
移动后的位置计算方式:
//如果float类型数据位置比long类型数据位置大0.5,使用long类型数据位置+1 得到最终数据
TLPoint.x = (pointTLPoint.x*fsp[0] - long(pointTLPoint.x*fsp[0])) > 0.5 ? long(pointTLPoint.x*fsp[0]) + 1 : long(pointTLPoint.x*fsp[0]);
TLPoint.y = (pointTLPoint.y*fsp[1] - long(pointTLPoint.y*fsp[1])) > 0.5 ? long(pointTLPoint.y*fsp[1]) + 1 : long(pointTLPoint.y*fsp[1]);
.h文件定义:
//在消息中添加WM_SIZE 得到OnSize函数
afx_msg void OnSize(UINT nType, int cx, int cy);
//手动添加
void ReSize();
POINT point;
.cpp实现部分
//首先在初始化函数中得到初始对话框大小
BOOL TestMfcDlg::OnInitDialog()
{
CRect rect;
GetClientRect(&rect); //取客户区大小
point.x=rect.right-rect.left;
point.y=rect.bottom-rect.top;
}
//ReSize()函数 实现部分
void TestMfcDlg::ReSize()
{
float fsp[2];
POINT Newp;
CRect recta;
GetClientRect(&recta);
Newp.x=recta.right-recta.left;
Newp.y=recta.bottom-recta.top;
fsp[0]=(float)Newp.x/point.x;
fsp[1]=(float)Newp.y/point.y;
CRect Rect;
int woc;
POINT pointTLPoint,TLPoint; //左上角
POINT pointBRPoint,BRPoint; //右下角
HWND hwndChild=::GetWindow(m_hWnd,GW_CHILD); //列出所有控件
while(hwndChild)
{
woc=::GetDlgCtrlID(hwndChild);//取得ID
GetDlgItem(woc)->GetWindowRect(Rect);
ScreenToClient(Rect);
pointTLPoint = Rect.TopLeft();
TLPoint.x = (pointTLPoint.x*fsp[0] - long(pointTLPoint.x*fsp[0])) > 0.5 ? long(pointTLPoint.x*fsp[0]) + 1 : long(pointTLPoint.x*fsp[0]);
TLPoint.y = (pointTLPoint.y*fsp[1] - long(pointTLPoint.y*fsp[1])) > 0.5 ? long(pointTLPoint.y*fsp[1]) + 1 : long(pointTLPoint.y*fsp[1]);
pointBRPoint = Rect.BottomRight();
BRPoint.x = (pointBRPoint.x *fsp[0] - long(pointBRPoint.x *fsp[0])) > 0.5 ? long(pointBRPoint.x *fsp[0]) + 1 : long(pointBRPoint.x *fsp[0]);
BRPoint.y = (pointBRPoint.y *fsp[1] - long(pointBRPoint.y *fsp[1])) > 0.5 ? long(pointBRPoint.y *fsp[1]) + 1 : long(pointBRPoint.y *fsp[1]);
Rect.SetRect(TLPoint,BRPoint);
GetDlgItem(woc)->MoveWindow(Rect,TRUE);
hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);
}
point=Newp;
}
//OnSize函数 实现部分
void CUDP_TestMfcDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
ReSize();
}