我们经常会发现当我们将窗口最大化时,里面的控件并没有进行改变,接下来我就介绍一下此问题的解决办法,我们其实一般的都会把窗口的最大化按钮失效,是窗口不能进行最大化操作,但是有时候我们还是需要对窗口进行最大化操作的,下面我们可以通过添加WM_SIZE消息来解决此问题。
1 在XXDLg.h中添加
afx_msg void OnSize(UINT nType, int cx, int cy);
2 在XXDLg.h中添加
ON_WM_SIZE() 或者 ON_MESSAGE(WM_SIZE,OnSize)
3 在XXDlg类中添加以下成员变量
POINT oSize
4 在XXDlg类中OnInitDialog()添加以下代码
CRect rect;
GetClientRect(&rect); //获取客户端区域的大小
oSize.x = rect.right - rect.left; //初始窗口的宽度
oSize.y = rect.bottom - rect.top; //初始窗口的高度
5在XXDlg类中添加以下成员函数
“`
void XXDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (nType==SIZE_RESTORED || nType==SIZE_MAXIMIZED) //窗口变化的类型
{
float ratio[2]; //变化率
POINT newDialogSize; //新的窗口的大小
CRect newRect;
GetClientRect(&newRect); //获取新的客户区的大小
newDialogSize.x = newRect.right - newRect.left; //新窗口的宽度
newDialogSize.y = newRect.bottom - newRect.top; //新窗口的高度
//得现在的对话框与以往对话框的大小比例
ratio[0] = (float)newDialogSize.x / oSize.x;
ratio[1] = (float)newDialogSize.y / oSize.y;
CRect Rect;
int woc;
//左右上角的数据
CPoint OldTLPoint, NewTLPint; //左上角
CPoint OldBRPoint, NewBRPint; //右下角
//列出所有控件
HWND hwndChild = ::GetWindow(m_hWnd,GW_CHILD);
while(hwndChild)
{
//取得ID
woc = ::GetDlgCtrlID(hwndChild);
GetDlgItem(woc)->GetWindowRect(Rect); //获取控件的区域大小
ScreenToClient(Rect); //映射到客户端区域大小
OldTLPoint = Rect.TopLeft();
NewTLPint.x = long(OldTLPoint.x*ratio[0]);
NewTLPint.y = long(OldTLPoint.y*ratio[1]);
OldBRPoint = Rect.BottomRight();
NewBRPint.x = long(OldBRPoint.x*ratio[0]);
NewBRPint.y = long(OldBRPoint.y*ratio[1]);
Rect.SetRect(NewTLPint,NewBRPint); //重新设置控件区域大小
GetDlgItem(woc)->MoveWindow(Rect,TRUE); //显示到窗口上
hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT); //获取下一个控件的句柄
}
oSize = newDialogSize; //新的窗口大小作为下一次变化的依据
}
}
但是,经过多次的窗口变化后,里面的控件会失真,这个问题还未解决!
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-14 14:57:02