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
}//像上面的代码,控件是可以和窗体一起变化,但只要最小化窗体后,再弹出就会出错,为什么?有什么解决方法呀
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
}//像上面的代码,控件是可以和窗体一起变化,但只要最小化窗体后,再弹出就会出错,为什么?有什么解决方法呀
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();
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
}
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正解~
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);
}
}
}
}具体现在就不解释了,如有需要明天再解释~
http://www.codeproject.com/KB/dialog/easysize.aspx