MFC窗口和控件大小等比例变化

167次阅读
没有评论

共计 1244 个字符,预计需要花费 4 分钟才能阅读完成。

第一步:在头文件中添加成员变量CList<CRect,CRect&> m_listRect;
第二步:OnInitDialog里保存对话框及其所有子窗体的Rect区域

CRect rect;
  GetWindowRect(&rect);
  m_listRect.AddTail(rect);//对话框的区域
  
  CWnd* pWnd = GetWindow(GW_CHILD);//获取子窗体
  while(pWnd)
  {
    pWnd->GetWindowRect(rect);//子窗体的区域
    m_listRect.AddTail(rect);           //CList<CRect,CRect> m_listRect成员变量
    pWnd = pWnd->GetNextWindow();//取下一个子窗体
  }

第三步:在类向导里面(Ctrl+W),为窗体添加消息WM_SIZE的响应函数OnSize();

第四步:响应OnSize消息

CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
if (m_listRect.GetCount() > 0)
{
  CRect dlgNow;
  GetWindowRect(&dlgNow);
  POSITION pos = m_listRect.GetHeadPosition();//第一个保存的是对话框的Rect
  
  CRect dlgSaved;
  dlgSaved = m_listRect.GetNext(pos);
  ScreenToClient(dlgNow);
  
  float x = dlgNow.Width() * 1.0 / dlgSaved.Width();//根据当前和之前保存的对话框的宽高求比例
  float y = dlgNow.Height()  *1.0/ dlgSaved.Height();
  ClientToScreen(dlgNow);
  
  CRect childSaved;
  
  CWnd* pWnd = GetWindow(GW_CHILD);
  while(pWnd)
  {
    childSaved = m_listRect.GetNext(pos);//依次获取子窗体的Rect
    childSaved.left = dlgNow.left + (childSaved.left - dlgSaved.left)*x;//根据比例调整控件上下左右距离对话框的距离
    childSaved.right = dlgNow.right + (childSaved.right - dlgSaved.right)*x;
    childSaved.top = dlgNow.top + (childSaved.top - dlgSaved.top)*y;
    childSaved.bottom = dlgNow.bottom + (childSaved.bottom - dlgSaved.bottom)*y;
    ScreenToClient(childSaved);
    pWnd->MoveWindow(childSaved);
    pWnd = pWnd->GetNextWindow();
  }
}

 

正文完
 
admin
版权声明:本站原创文章,由 admin 2022-10-25发表,共计1244字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码