• 第十一篇 -- 如何实现MFC窗口的最大化以及控件随最大化


    这一篇介绍的是怎么实现MFC窗口的最大最小化,以及里面控件大小也随之改变

    第一步:实现窗口最大最小化

    首先右击窗口空白处,打开properties,将里面的MaximizeBox和MinimizeBox都选择为true,这时候窗口已经有最大最小化了,不过控件大小却不变

    第二步:实现控件大小位置变化

    右击窗口空白处,打开类视图(Class Wizard)--> 点击选项Messages --> 找到WM_SIZE选中 --> 添加处理程序(Add handler)--> 编辑代码(Edit code)

    在这个函数里面添加如下代码

    void CframestudyDlg::OnSize(UINT nType, int cx, int cy)
    {
        CDialogEx::OnSize(nType, cx, cy);
    
        // TODO: Add your message handler code here
        if (nType == SIZE_RESTORED || nType == SIZE_MAXIMIZED) {
            resize();
        }
    }
    View Code

    其中resize()函数需要我们自己添加,这是一个自定义的函数,在上面函数下添加就可以了,当然没有硬性要求

    void CframestudyDlg::resize()
    {
        float fsp[2];
        POINT Newp; //获取现在对话框的大小
        CRect recta;
        GetClientRect(&recta);     //取客户区大小  
        Newp.x = recta.right - recta.left;
        Newp.y = recta.bottom - recta.top;
        fsp[0] = (float)Newp.x / Old.x;
        fsp[1] = (float)Newp.y / Old.y;
        CRect Rect;
        int woc;
        CPoint OldTLPoint, TLPoint; //左上角
        CPoint OldBRPoint, BRPoint; //右下角
        HWND  hwndChild = ::GetWindow(m_hWnd, GW_CHILD);  //列出所有控件  
        while (hwndChild)
        {
            woc = ::GetDlgCtrlID(hwndChild);//取得ID
            GetDlgItem(woc)->GetWindowRect(Rect);
            ScreenToClient(Rect);
            OldTLPoint = Rect.TopLeft();
            TLPoint.x = long(OldTLPoint.x*fsp[0]);
            TLPoint.y = long(OldTLPoint.y*fsp[1]);
            OldBRPoint = Rect.BottomRight();
            BRPoint.x = long(OldBRPoint.x *fsp[0]);
            BRPoint.y = long(OldBRPoint.y *fsp[1]);
            Rect.SetRect(TLPoint, BRPoint);
            GetDlgItem(woc)->MoveWindow(Rect, TRUE);
            hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
        }
        Old = Newp;
    
    }
    View Code

    resize()前面CframestudyDlg是自己的函数名,跟你创建时其他函数前缀保持一致就好。

    写完函数后,要在.h文件里面写上函数原型。

    打开frame_studyDlg.h

    在public部分添加

    POINT Old;
    void resize();

    最后一步就是要在onInitDialog()函数里面添加一段代码,里面会有一句“TODO: Add extra initialization here”这一句,在下面添加即可。

        // TODO: Add extra initialization here
        CRect rect;
        GetClientRect(&rect);//取客户区大小
        Old.x = rect.right - rect.left;
        Old.y = rect.bottom - rect.top;

    现在,大功告成了。

  • 相关阅读:
    Protobuf, understand the hood
    Linux下Matlab崩溃的解决方法
    高德地图AMapUI is not defined
    微信小程序
    js字符数组转化为数字数组
    高德地图网页端js API
    es6 函数的扩展(尾递归看不太懂,不浪费时间了)
    es6 数值扩展(正则稍微看了下,以后用得着再细看)
    vue清空表单
    es6 变量的解析复制
  • 原文地址:https://www.cnblogs.com/smart-zihan/p/11207533.html
Copyright © 2020-2023  润新知