当我们添加了资源对话框时,它的尺寸在客户区显示时是不会随着窗口的大小调整的,当框架尺寸小于它的尺寸时,还出现了滚动条。
思路
根据客户区的大小调整资源对话框的大小。
根据对话框大小动态调整控件的大小和位置
方法1:
1.记录原始的CFormView的RECT。在OnSize中获得当前Rect,求出放大比例。
2.对每一个控件。在OnSize中获取当前RECT。然后乘以放大比例。作为新的RECT大小。
3.对每一个控件。调用MoveWindow函数。完毕缩放。
这样的方法对每一个控件,都编写代码进行操作,必定是缩放效果最好的。
方法2:
这是对方法1的改进。须要一定的知识和技巧。
全部控件的定义都是在*.rc文件里,可是这些控件的ID声明却都在resource.h中。假设你有足够的耐心和另外一块显示屏,那么你能够:
1.更改这些控件的ID值,使它们顺序增长(减小),这样我们就能够在一个循环里完毕方法1中对控件的操作,仅仅需1套代码。
方法3:
我採用了这样的。主要是不想维护太多的代码。也不想在如此众多的宏中对ID值进行更改。
先上代码吧,无码无真相。
void CRealTimeFV::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
RECT rc;
GetClientRect(&rc);
LPRECT lpClientRect=&rc;
m_dXRate=lpClientRect->right/(double)m_lastRect.right;
m_dYRate=lpClientRect->bottom/(double)m_lastRect.bottom;
if (lpClientRect->right!=0 && lpClientRect->bottom!=0)
{
m_lastRect.bottom=lpClientRect->bottom;
m_lastRect.left=lpClientRect->left;
m_lastRect.right=lpClientRect->right;
m_lastRect.top=lpClientRect->top;
CWnd *pWnd=NULL;
pWnd=GetWindow(GW_CHILD);
while (pWnd)
{
CString strCaption;
pWnd->GetWindowTextW(strCaption);
OutputDebugString(TEXT("Caption:")+strCaption+TEXT("\n"));
CRect childRect;
pWnd->GetWindowRect(&childRect);
ScreenToClient(&childRect);
childRect.left=(LONG)(childRect.left*m_dXRate);
childRect.top=(LONG)(childRect.top*m_dYRate);
childRect.right=(LONG)(childRect.right*m_dXRate);
childRect.bottom=(LONG)(childRect.bottom*m_dYRate);
pWnd->MoveWindow(&childRect,TRUE);
pWnd=pWnd->GetWindow(GW_HWNDNEXT);
}
}
}