MFC对话框自适应大小(四舍五入)高精度版本

  最近写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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坤昱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值