CRect m_rect;
void CDownDlg::OnSize(UINT nType, int cx, int cy) 
{
CWnd *pwnd;
pwnd=GetDlgItem(IDC_LIST_VIEW);//获取控件句柄if (pwnd)//判断是pwnd是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
{  CRect rect;  //获取控件变化前大小
  pwnd->GetWindowRect(&rect);
  ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
  // cx/m_rect.Width()为对话框在横向的变化比例
  rect.left=rect.left*cx/m_rect.Width();/////调整控件大小
  rect.right=rect.right*cx/m_rect.Width();
 //rect.top=rect.top;
  rect.bottom=rect.bottom*cy/m_rect.Height();
  pwnd->MoveWindow(rect);//设置控件大小
  }
  GetClientRect(&m_rect);
  CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
}//像上面的代码,控件是可以和窗体一起变化,但只要最小化窗体后,再弹出就会出错,为什么?有什么解决方法呀

解决方案 »

  1.   

    //除的地方估计是0,加个判断
    if(m_rect.Width()) 
      rect.left=rect.left*cx/m_rect.Width();/////调整控件大小
    if(m_rect.Width())
      rect.right=rect.right*cx/m_rect.Width();
     //rect.top=rect.top;
    if(m_rect.Height())
      rect.bottom=rect.bottom*cy/m_rect.Height();
      

  2.   

    同意LS的
    LZ可以试下, 当最小化时不做处理
    if (pwnd && !IsIconic() )//判断是pwnd是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
    {  CRect rect; //获取控件变化前大小
      pwnd->GetWindowRect(&rect);
      ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
      // cx/m_rect.Width()为对话框在横向的变化比例
      rect.left=rect.left*cx/m_rect.Width();/////调整控件大小
      rect.right=rect.right*cx/m_rect.Width();
     //rect.top=rect.top;
      rect.bottom=rect.bottom*cy/m_rect.Height();
      pwnd->MoveWindow(rect);//设置控件大小
      }
      GetClientRect(&m_rect);
      CDialog::OnSize(nType, cx, cy);// TODO: Add your message handler code here
    }
      

  3.   


    void CTestMoveWndDlg::OnSize(UINT nType, int cx, int cy)
    {
    CDialog::OnSize(nType, cx, cy); if (m_lstTest.GetSafeHwnd() != NULL)
    {
    if (m_rect.Width() == 0)
    {
    AfxMessageBox(_T("出错了!")); //跟踪了一下,退出最小化时确实都为零
    return;
    }
    CRect rect; //获取控件变化前大小
    m_lstTest.GetWindowRect(&rect);
    ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
    // cx/m_rect.Width()为对话框在横向的变化比例
    rect.left=rect.left*cx/m_rect.Width();/////调整控件大小
    rect.right=rect.right*cx/m_rect.Width();
    //rect.top=rect.top;
    rect.bottom=rect.bottom*cy/m_rect.Height();
    m_lstTest.MoveWindow(rect);//设置控件大小
    } GetClientRect(&m_rect);
    }LS正解~
      

  4.   

    (1)在CTestMoveWndDlg的头文件中加入如下的成员变量: CRect m_dlgRect;//记录变化前的对话框的客户区坐标
    CRect m_lstRect;//记录变化前的列表控件的客户区坐标
    bool m_bLastStatusIsMin;//记录变化前是不是最小话状态,是最小话状态,则不记录当前的列表控件的客户区坐标,保留最小化前的列表控件的客户区坐标(2)在CTestMoveWndDlg的构造函数中将m_bLastStatusIsMin初始化为false;
    (3)在CTestMoveWndDlg::OnInitDialog()中获取初始状态时对话框和列表控件的客户区坐标: GetClientRect(&m_dlgRect);
    m_lstTest.GetWindowRect(&m_lstRect);
    ScreenToClient(&m_lstRect);
    (4)在CTestMoveWndDlg::OnSize()中加入如下代码:void CTestMoveWndDlg::OnSize(UINT nType, int cx, int cy)
    {
    CDialog::OnSize(nType, cx, cy); if (m_lstTest.GetSafeHwnd() != NULL)
    {
    if (m_dlgRect.Width()!= 0)
    {
    CRect tempDlgRect;
    GetClientRect(&tempDlgRect);
    if (tempDlgRect.Width() == 0)
    {
    m_bLastStatusIsMin = true;
    m_lstTest.GetWindowRect(&m_lstRect);
    ScreenToClient(&m_lstRect);
    }
    else
    {
    if (m_bLastStatusIsMin == false)
    {
    m_lstTest.GetWindowRect(&m_lstRect);
    ScreenToClient(&m_lstRect);
    }
    m_bLastStatusIsMin = false;
    } // cx/m_rect.Width()为对话框在横向的变化比例
    CRect tempLstRect;
    tempLstRect.left=m_lstRect.left*cx/m_dlgRect.Width();/////调整控件大小
    tempLstRect.right=m_lstRect.right*cx/m_dlgRect.Width();
    tempLstRect.top=m_lstRect.top;
    tempLstRect.bottom=m_lstRect.bottom*cy/m_dlgRect.Height();
    m_lstTest.MoveWindow(tempLstRect);//设置控件大小 if (tempDlgRect.Width() != 0)
    {
    GetClientRect(&m_dlgRect);
    }
    }
    }
    }具体现在就不解释了,如有需要明天再解释~
      

  5.   

    一个控件都这么麻烦,要是要调整多个控件那可不得了,上面是笨办法,LZ可以看一下这篇文章:
    http://www.codeproject.com/KB/dialog/easysize.aspx