设计窗体控件及关联控件变量如下:
若要使用尺寸调节手柄Custom control(工具栏人头标志),需设置属性:
Tabstop:false
Caption:清空
Class:SCROLLBAR
Style:0x5000001e
1.在改变控件大小和位置时,需要了解控件原来的尺寸。
在Dialog的头文件中定义一个CSize类型的成员变量m_oldSize,
构造函数中初始化:m_oldSize=CSize(0,0);
2.OnSize()中添加如下代码:
void CMoveTestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// 当对话框最小化时, 不做处理,直接返回
if (nType == SIZE_MINIMIZED) return;
//尺寸改变量
CSize SizeOff(cx - m_oldSize.cx, cy - m_oldSize.cy);
// 利用枚举子窗口函数调用回调函数EnumProc, 来处理对话框中控件的移动
::EnumChildWindows(GetSafeHwnd(), EnumProc, (LPARAM)&SizeOff);
// 尺寸调节手柄处理
if (GetDlgItem(IDC_SIZEBOX)->GetSafeHwnd())
{
if (nType == SIZE_MAXIMIZED) // 最大化时
GetDlgItem(IDC_SIZEBOX)->ShowWindow(SW_HIDE); // 隐藏手柄
else // 其他状态
GetDlgItem(IDC_SIZEBOX)->ShowWindow(SW_SHOW); // 显示手柄
}
// 保存当前尺寸
m_oldSize = CSize(cx,cy);
// 刷新对话框
Invalidate();
// TODO: 在此处添加消息处理程序代码
}
3.编写全局回调函数EnumProc()
BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
CWnd* pWnd = CWnd::FromHandle(hwnd);
CSize* pSizeOff = (CSize*) lParam;
CMoveTestDlg* pDlg = (CMoveTestDlg *) pWnd->GetParent();
if (!pDlg) return FALSE;
CRect rect;
pWnd->GetWindowRect(rect);
pDlg->ScreenToClient(rect);
if (hwnd == pDlg->m_static.GetSafeHwnd())
{ // 静态文本不做处理
return TRUE;
}
if (hwnd == pDlg->m_btn1.GetSafeHwnd() ||
hwnd == pDlg->m_btn2.GetSafeHwnd())
{ //按钮只移动位置
pWnd->MoveWindow(
rect.left+pSizeOff->cx,
rect.top+pSizeOff->cy,
rect.Width(),
rect.Height(),
FALSE);
return TRUE;
}
if (hwnd == pDlg->m_list.GetSafeHwnd())
{ // 列表框控件只改变高度
pWnd->MoveWindow(
rect.left,
rect.top,
rect.Width(),
rect.Height()+pSizeOff->cy,
FALSE);
return TRUE;
}
if (pWnd == pDlg->GetDlgItem(IDC_EDIT1))
{ // 编辑框控件改变宽度和宽度
pWnd->MoveWindow(
rect.left,
rect.top,
rect.Width()+pSizeOff->cx,
rect.Height()+pSizeOff->cy,
FALSE);
return TRUE;
}
{ // 其他控件,改变坐标
pWnd->MoveWindow(
rect.left+pSizeOff->cx,
rect.top+pSizeOff->cy,
rect.Width(),
rect.Height(),
FALSE);
}
return TRUE;
}
运行效果如下:
初始化时:
拉大窗体后: