无题

设计窗体控件及关联控件变量如下:



若要使用尺寸调节手柄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;
}

运行效果如下:

初始化时:



拉大窗体后:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值