网络文学网站开发,做个小型购物网站要多少钱,棋牌游戏开发多少钱,wordpress单页网站在本页跳转MFC如何使控件大小随着对话框大小自动调整
2012-04-27 16:24:50| 分类#xff1a; MFC | 标签#xff1a; |字号大中小 订阅 对话框的大小变化后#xff0c;假若对话框上的控件大小不变化#xff0c;看起来会比较难看。下面就介绍怎么让对话框上的控件随着对话框的…MFC如何使控件大小随着对话框大小自动调整
2012-04-27 16:24:50| 分类 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为控件IDx,y分别为对话框的当前长和宽 { CWnd *pWnd; pWndGetDlgItem(nID); if(pWnd!NULL) //判断是否为空因为在窗口创建的时候也会调用OnSize函数但是此时各个控件还没有创建Pwnd为空 { CRect rec; pWnd-GetWindowRect(rec); //获取控件变化前的大小 ScreenToClient(rec); //将控件大小装换位在对话框中的区域坐标 rec.leftrec.left*x/m_rect.Width(); //按照比例调整空间的新位置 rec.toprec.top*y/m_rect.Height(); rec.bottomrec.bottom*y/m_rect.Height(); rec.rightrec.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); //最后要更新对话框的大小当做下一次变化的旧坐标 } } 任务完成