学习笔记:MFC001——控件自适应窗口大小(上)

目的:

MFC窗口上的控件根据窗口的大小,自动调节位置和大小。

展示:

变化前

变化后

实现步骤:

1. 获得原始的窗口大小;

2. 在OnSize()响应中,调整窗口上的控件大小和位置。

实现代码:

//.h
#pragma once
class CUIResize
{
public:
	CUIResize(CWnd*);
	void ReSize();
private:
	CWnd *m_CWnd;
	CRect m_oldRect;
};

//.cpp
#include "StdAfx.h"
#include "UIResize.h"

CUIResize::CUIResize(CWnd* cwnd)
{
	m_CWnd = cwnd;
	cwnd->GetClientRect(&m_oldRect);
}

void CUIResize::ReSize()
{
	HWND hwnd = m_CWnd->GetSafeHwnd();
	//获取新窗口尺寸
	CRect newRect;
	GetClientRect(hwnd,&newRect);
	if(newRect.Width() <= 0 || newRect.Height() <= 0)
	{
		return;
	}
	//变尺寸前后窗口尺寸比
	float rankWidth=(float)newRect.Width()/m_oldRect.Width();  
	float rankHeight=(float)newRect.Height()/m_oldRect.Height();  
	//获得第一个控件句柄
	HWND hwndChild=::GetWindow(hwnd,GW_CHILD); 
	while(hwndChild)
	{
		int id =::GetDlgCtrlID(hwndChild);	//取得ID
		CRect Rect;
		m_CWnd->GetDlgItem(id)->GetWindowRect(Rect);
		m_CWnd->ScreenToClient(Rect);
		CPoint OldTLPoint,TLPoint;			//左上角
		CPoint OldBRPoint,BRPoint;			//右下角
		OldTLPoint = Rect.TopLeft();
		TLPoint.x = long(OldTLPoint.x*rankWidth);
		TLPoint.y = long(OldTLPoint.y*rankHeight);
		OldBRPoint = Rect.BottomRight();
		BRPoint.x = long(OldBRPoint.x *rankWidth);
		BRPoint.y = long(OldBRPoint.y *rankHeight);
		//设置控件大小
		Rect.SetRect(TLPoint,BRPoint);
		m_CWnd->GetDlgItem(id)->MoveWindow(Rect,TRUE);
		//获得下一个控件句柄
		hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);
	}
	m_oldRect = newRect;
}

遗留问题:

1. 窗口调节过快时,Resize()函数不能及时响应,出现控件调节错误。

2. 反复变化,控件变不回原先的位置和大小。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值