这里介绍一种控制控件随主框体变化而变化的方法。
方法并不完善,框体只支持最大化和最小化窗口时还好,但是在连续最大化最小化切换10次以上以后,控件在主框体中的相对位置会向左上角移动,幅度并不大,基本可以满足应用需要;
但如果主框体动态的变化大小,控件的相对位置变化的非常快,基本不能使用。
自己使用MFC只是做一些小工具,或者测试工具,自己或者同事使用,只使用最大化和最小化窗口,基本也满足需要了。
下面介绍方法:
1、在对话框类中添加成员变量 CRect m_rectOrg 它是用来记录当前对话框的大小。
在OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rectOrg )。
2、在对话框类中添加函数void ChangeSize(CWnd * pWnd, int cx, int cy),根据主框体的变化改变控件大小。
void CTESTDlg::ChangeSize(CWnd * pWnd, int cx, int cy)
{
if (pWnd)
{
CRect rect;
pWnd->GetWindowRect(&rect); //获取控件变化前的大小
ScreenToClient(&rect); //将控件大小转换为在对话框中的区域坐标
rect.left=rect.left*cx/m_rectOrg.Width(); //调整控件大小 ,cx/m_rectOrg.Width()为对话框在横向的变化比例
rect.right=rect.right*cx/m_rectOrg.Width(); //cx存储的是变化后的宽度,cy存储的是变化后的高度
rect.top=rect.top*cy/m_rectOrg.Height(); //m_rectOrg.height()表示的是变化前主窗体的高度
rect.bottom=rect.bottom*cy/m_rectOrg.Height();
pWnd->MoveWindow(rect); //设置控件大小
}
}
3、在MFC 类向导中添加消息WM_SIZE,如下图所示:
4、修改void CTESTDlg::OnSize(UINT nType, int cx, int cy)
void CTESTDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if(nType==SIZE_MINIMIZED) return; //最小化则什么都不做
CWnd *pWnd;
int ctrlID;
HWND hWndChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控件
while(hWndChild)
{
ctrlID= ::GetDlgCtrlID(hWndChild);
pWnd = GetDlgItem(ctrlID); //获取控件句柄
ChangeSize(pWnd,cx,cy);
hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT);
}
GetClientRect(&m_rectOrg);
}