• MFC窗体大小变化


    对话框的大小变化后,假若对话框上的控件大小不变化,看起来会比较难看。下面就介绍怎么让对话框上的控件随着对话框的大小的变化自动调整。

    首先明确的是Windows有一个WM_SIZE消息响应函数,这个函数在对话框大小发生变化的时候调用,所以我们可以记录下原来对话框的大小,还有当前对话框的大小(这个不用自己算,系统已给出),然后根据控件做出相应比例的调整。

    比如原来对话框大小为a,现在为b,原来控件大小为c,那么现在的控件大小应该为c*b/a;(注意a不能为0)。

    看实例:(黑体字为添加的代码!!)

    假设对话框类为CMyDlg类,那么首先设置一个变量

    CRect  m_rect;   //用于保存原对话框大小

    那么在对话框创建的时候先获得对话框的大小

    BOOL CMyDlg::OnInitDialog()
    {

              .........................
             SetIcon(m_hIcon, TRUE);   // Set big icon
             SetIcon(m_hIcon, FALSE);  // Set small icon
             // TODO: Add extra initialization here
             GetClientRect(&m_rect);  //获取对话框的大小

              return TRUE;  // return TRUE  unless you set the focus to a control
    }
    然后再手动添加一个函数,用以实现具体的变化

    void CMyDlg::ChangeSize(UINT nID, int x, int y)  //nID为控件ID,x,y分别为对话框的当前长和宽
    {
           CWnd *pWnd;
           pWnd=GetDlgItem(nID); 
           if(pWnd!=NULL)     //判断是否为空,因为在窗口创建的时候也会调用OnSize函数,但是此时各个控件还没有创建,Pwnd为空
           {
                   CRect rec; 
                   pWnd->GetWindowRect(&rec);  //获取控件变化前的大小
                   ScreenToClient(&rec);   //将控件大小装换位在对话框中的区域坐标
                   rec.left=rec.left*x/m_rect.Width();  //按照比例调整空间的新位置
                   rec.top=rec.top*y/m_rect.Height();
                   rec.bottom=rec.bottom*y/m_rect.Height();
                   rec.right=rec.right*x/m_rect.Width();
                   pWnd->MoveWindow(rec);   //伸缩控件
          }
    }

    最后添加windows消息响应函数OnSize:

    void CMyDlg::OnSize(UINT nType, int cx, int cy)  //cx,cy就是当前对话框的长和宽
    {
                CDialog::OnSize(nType, cx, cy);
     
                // TODO: Add your message handler code here
                if(nType!=SIZE_MINIMIZED )  //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作
              {
                      ChangeSize(IDC_LIST1,cx,cy);  //对每一个控件依次做调整
                      ChangeSize(IDC_LIST2,cx,cy);
                      ChangeSize(IDC_BUTTON1,cx,cy); 
                      ChangeSize(IDC_BUTTON2,cx,cy); 
                      GetClientRect(&m_rect);   //最后要更新对话框的大小,当做下一次变化的旧坐标;
             }

    }

    任务完成!

  • 相关阅读:
    罗尔定理、微分中值定理、广义微分中值定理
    高等数学和数学分析教材推荐及其学习方法浅谈
    音视频下载插件 安装及使用
    win10台式机rtl8188eu(FW 150 UM V2.0)无线网卡无法连接wifi(无法连接到这个网络)
    django模板中的extends和include使用方法
    wordpress中文目录出现“有点尴尬诶!该页无法显示"
    wordpress迁移后登陆时出现Forbidden You don’t have permission to access /wp-login.php on this server
    centos设置开机自启动脚本
    hexo的jacman主题设置语言为英文后偶尔出现中文
    安卓QQ聊天记录导出、备份完全攻略
  • 原文地址:https://www.cnblogs.com/xzh1993/p/5548465.html
Copyright © 2020-2023  润新知