目的:
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. 反复变化,控件变不回原先的位置和大小。