MFC控件随窗口大小变化,多次缩放不改变位置

MFC控件随窗口大小变化,多次缩放不影响位置

代码改自:https://blog.csdn.net/u013280734/article/details/51355035

void CMyCefTestDlg::OnSize(UINT nType, int cx, int cy)
{

CDialogEx::OnSize(nType, cx, cy);
// TODO:  在此处添加消息处理程序代码

//最小化判断
if (nType == 1)
{
	return;
}
else
{	
	CRect rect;//获取当前窗口的大小
	for (std::list<control*>::iterator it = m_con_list.begin(); it != m_con_list.end();it++)
	{
		CWnd* pWnd = GetDlgItem((*it)->Id);//获取ID为woc的空间的句柄
		pWnd->GetWindowRect(&rect);
		ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
		rect.left = (*it)->scale[0] * cx;
		rect.right = (*it)->scale[1] * cx;
		rect.top = (*it)->scale[2] * cy;
		rect.bottom = (*it)->scale[3] * cy;
		pWnd->MoveWindow(rect);//设置控件大小	
	}
}
GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小
return;

}

//在初始化里面调用下面这个函数

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MFC 中实现拖动或缩放对话框,需要重载对话框类的相应消息处理函数,并在其中实现相应的操作。以下是一些基本的实现步骤: 1. 响应 WM_NCHITTEST 消息,检测鼠标点击位置是否在边框范围内,并返回相应的值,以便系统知道用户想要移动或改变大小的是对话框本身还是其中的控件。 2. 响应 WM_LBUTTONDOWN、WM_LBUTTONUP 和 WM_MOUSEMOVE 消息,实现对话框的拖动、缩放等操作。在 WM_LBUTTONDOWN 消息中,记录鼠标点击位置和对话框的初始位置大小。在 WM_MOUSEMOVE 消息中,根据鼠标移动距离和拖动的方式(移动或缩放),计算出新的对话框位置大小,并重绘对话框。在 WM_LBUTTONUP 消息中,释放鼠标捕获,结束拖动或缩放操作。 3. 在控件的 OnSize 函数中,根据对话框的大小改变控件位置大小。 下面是一个简单的示例代码,实现了对话框的拖动和缩放: ``` // CMyDialog.cpp // 响应 WM_NCHITTEST 消息 LRESULT CMyDialog::OnNcHitTest(CPoint point) { UINT nHitTest = CDialog::OnNcHitTest(point); if (nHitTest == HTCLIENT) // 如果鼠标点击位置在客户区内,则返回相应的值 { CRect rc; GetClientRect(rc); ClientToScreen(rc); if (PtInRect(rc, point)) // 如果鼠标点击位置在对话框内,则返回 HTCAPTION ,表示移动对话框 return HTCAPTION; } return nHitTest; } // 响应 WM_LBUTTONDOWN 消息 void CMyDialog::OnLButtonDown(UINT nFlags, CPoint point) { if (nFlags & MK_LBUTTON) // 如果左键被按下 { m_bDragging = TRUE; // 标记正在拖动 ::SetCapture(m_hWnd); // 捕获鼠标消息 GetWindowRect(m_rcWnd); // 记录对话框的位置大小 m_ptClick = point; // 记录鼠标点击位置 } } // 响应 WM_LBUTTONUP 消息 void CMyDialog::OnLButtonUp(UINT nFlags, CPoint point) { if (m_bDragging) // 如果正在拖动 { m_bDragging = FALSE; // 标记拖动结束 ::ReleaseCapture(); // 释放鼠标捕获 } } // 响应 WM_MOUSEMOVE 消息 void CMyDialog::OnMouseMove(UINT nFlags, CPoint point) { if (m_bDragging) // 如果正在拖动 { CRect rcNew = m_rcWnd; // 计算新的位置大小 if (nFlags & MK_CONTROL) // 如果按下了 Ctrl 键,则缩放对话框 { int cx = point.x - m_ptClick.x; int cy = point.y - m_ptClick.y; rcNew.right = rcNew.left + max(32, rcNew.Width() + cx); rcNew.bottom = rcNew.top + max(32, rcNew.Height() + cy); } else // 否则移动对话框 { rcNew.OffsetRect(point - m_ptClick); } MoveWindow(rcNew); // 移动或缩放对话框 } } // 响应控件的 OnSize 消息 void CMyDialog::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if (m_wndCtrl.GetSafeHwnd() != NULL) // 如果控件已创建 { CRect rc; m_wndCtrl.GetWindowRect(rc); // 获取控件位置大小 ScreenToClient(rc); rc.right += cx - m_rcWnd.Width(); // 根据对话框的大小改变控件位置大小 rc.bottom += cy - m_rcWnd.Height(); m_wndCtrl.MoveWindow(rc); } } ``` 注意,以上代码仅为示例,实际使用还需要根据具体情况进行修改和完善。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值