对话框控件大小随窗口的大小变化而变化

我们经常会发现当我们将窗口最大化时,里面的控件并没有进行改变,接下来我就介绍一下此问题的解决办法,我们其实一般的都会把窗口的最大化按钮失效,是窗口不能进行最大化操作,但是有时候我们还是需要对窗口进行最大化操作的,,下面我们可以通过添加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){//取得IDwoc = ::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; //新的窗口大小作为下一次变化的依据 }

}

但是,经过多次的窗口变化后,里面的控件会失真,这个问题还未解决!

其实只要你愿意,一切都可以变得很容易。

对话框控件大小随窗口的大小变化而变化

相关文章:

你感兴趣的文章:

标签云: