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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cxq_1993/article/details/47723303

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

}

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

展开阅读全文

没有更多推荐了,返回首页