MFC——void OnSize(UINT nType, int cx, int cy)

本文介绍了一个Windows对话框中Tab控件尺寸动态调整的方法。通过获取并更新控件的窗口矩形来确保其能随对话框尺寸的变化而变化。这种方法适用于需要自定义布局的界面设计。
BEGIN_MESSAGE_MAP(CLibraryDlg, CDialogEx)
    ON_WM_SIZE()
END_MESSAGE_MAP()


void CLibraryDlg::OnSize(UINT nType, int cx, int cy)
{
	if (!m_pTabCtrl)
		m_pTabCtrl = (CTabCtrl *)GetDlgItem(IDC_TAB1);   //获取控件句柄
	if (m_pTabCtrl)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
	{
		CRect rect;  //获取控件变化前大小
		m_pTabCtrl->GetWindowRect(&rect); //(left,top)(right,button)相对整个屏幕,两个坐标
		ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标,(用户区域的x,y,width,height,相对于主窗口)
								// 这里转换后,是该控件相对主窗口的位置

		// 获取窗口的客户端的区域,(用户区域的x,y,width,height),注意与ScreenToClient使用的区别
		//this->GetClientRect(&m_WinRect);
		// 获取窗口 (left,top)(right,button)相对整个屏幕
		//this->GetWindowRect(&m_WinRect);
		
		rect.right = cx;	//cx是更新后主窗口用户区的宽度
		rect.bottom = cy;	// cy是更新后的主窗口用户区的高度
		m_pTabCtrl->MoveWindow(rect);//设置控件大小
	}
}


修改代码,实现鼠标对界面拉伸时,界面包括所有控件随鼠标保持原比例拉伸 void CWordctrlDlg::ResizeControls() { CWnd* pWnd = GetWindow(GW_CHILD); int nIndex = 0; while (pWnd && nIndex < m_nCtrlCount) { CRect rect; pWnd->GetWindowRect(&rect); ScreenToClient(&rect); // 计算新位置和大小 int x = (int)(m_ptCtrlOrig[nIndex].x * m_dScaleX); int y = (int)(m_ptCtrlOrig[nIndex].y * m_dScaleY); int cx = (int)(m_szCtrlOrig[nIndex].cx * m_dScaleX); int cy = (int)(m_szCtrlOrig[nIndex].cy * m_dScaleY); // 移动并调整控件大小 pWnd->MoveWindow(x, y, cx, cy); nIndex++; pWnd = pWnd->GetNextWindow(); } } // 初始化所有控件的原始位置和大小 void CWordctrlDlg::InitCtrlPos() { CWnd* pWnd = GetWindow(GW_CHILD); m_nCtrlCount = 0; // 遍历所有子控件并记录初始位置和大小 while (pWnd && m_nCtrlCount < 20) { pWnd->GetWindowRect(&m_rectOrig); ScreenToClient(&m_rectOrig); m_ptCtrlOrig[m_nCtrlCount] = m_rectOrig.TopLeft(); m_szCtrlOrig[m_nCtrlCount] = m_rectOrig.Size(); m_nCtrlCount++; pWnd = pWnd->GetNextWindow(); } } // 处理窗口大小改变消息 void CWordctrlDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); // 最小化时不处理 if (nType == SIZE_MINIMIZED) return; // 计算缩放比例 m_dScaleX = (double)cx / m_rectOrig.Width(); m_dScaleY = (double)cy / m_rectOrig.Height(); // 缩放所有控件 ResizeControls(); // 更新原始矩形为新尺寸,用于下次缩放计算 m_rectOrig.right = m_rectOrig.left + cx; m_rectOrig.bottom = m_rectOrig.top + cy; }
09-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值