MFC中CScrollView对话框位置及滚动条调整

        在MFC中CScrollView嵌入的是对话框的时候,可以简单快速实现滚动条的大小:
  1. CSize sizeTotal(0, 900);  
  2. SetScrollSizes(MM_TEXT, sizeTotal);  

       但是在实际运用当中,发现滚动条的范围和对话框还是需要不断地做动态的变更,有时候需要滚动,而有时候又不需要,所以需要不断地做动态调整。

       这里提供解决方式主要是在ScrollView的中OnSize()消息函数中做调整。

#define TEST_SCROLLVIEW_HEIGHT 540 // CScrollView高度
#define TEST_SCROLLVIEW_WIDHT  980 // CScrollView宽度
#define TEST_SCROLLVIEW_SCROLL_LENGHT 20 // 滚动条所占宽度

void CTestView::AjustScrollView(CRect& rect,CDialog* pDlg,int cx, int cy)
{
	if(NULL == pDlg)
	{
		return;
	}
	if( rect.Height() > TEST_SCROLLVIEW_HEIGHT)
	{
		if(rect.Width() < TEST_SCROLLVIEW_WIDHT)
		{
			pDlg->SetWindowPos(this,0,0,TEST_SCROLLVIEW_WIDHT,cy,SWP_NOZORDER);
			this->SetScrollSizes(MM_TEXT, CSize(TEST_SCROLLVIEW_WIDHT,cy));
			this->SetScrollPos(SB_HORZ,0,TRUE);
		}
		else
		{
			pDlg->SetWindowPos(this,0,0,cx + TEST_SCROLLVIEW_SCROLL_LENGHT,cy + TEST_SCROLLVIEW_SCROLL_LENGHT,SWP_NOZORDER);
			this->SetScrollSizes(MM_TEXT, CSize(cx,cy));
		}
	}
	else
	{
		if(rect.Width() < TEST_SCROLLVIEW_WIDHT)
		{
			pDlg->SetWindowPos(this,0,0,TEST_SCROLLVIEW_WIDHT,TEST_SCROLLVIEW_HEIGHT,SWP_NOZORDER);
			this->SetScrollSizes(MM_TEXT, CSize(TEST_SCROLLVIEW_WIDHT,CMAINTENANCE_SYSTEMVIEW_HEIGHT));
			this->SetScrollPos(SB_HORZ,0,TRUE);
		}
		else
		{
			pDlg->SetWindowPos(this,0,0,cx + TEST_SCROLLVIEW_SCROLL_LENGHT,TEST_SCROLLVIEW_HEIGHT + TEST_SCROLLVIEW_SCROLL_LENGHT,SWP_NOZORDER);
			this->SetScrollSizes(MM_TEXT, CSize(cx,TEST_SCROLLVIEW_HEIGHT));
		}
		this->SetScrollPos(SB_VERT,0,TRUE);
	}
}
函数说明如下:

	// 功能说明:调整滚动视图中对话框大小和位置及滚动条范围
	// 参数:
	//       @rect 滚动视图大小
	//       @pDlg 滚动视图中对话框
	//       @cx、@cy 拖动视图时位置变动
	void AjustScrollView(CRect& rect,CDialog* pDlg,int cx, int cy);


在OnSize()函数中调用:

void CTestView::OnSize(UINT nType, int cx, int cy)
{
	CScrollView::OnSize(nType, cx, cy);

	CRect rect;
	GetClientRect(&rect);

	if(m_testDlg.GetSafeHwnd()!=0)
	{
		AjustScrollView(rect,&m_testDlg,cx,cy);
	}
}




MFC,如果我们想要在调整窗口大小时自动出现滚动条来实现内容的滚动,我们可以采取以下步骤: 1. 在需要添加滚动条对话框或窗口类的类体,添加一个CScrollView的派生类成员变量,用于处理滚动条的相关功能。例如,可以添加一个名为m_scrollView的成员变量。 2. 在对话框或窗口类的OnInitDialog(对于对话框类)或OnCreate(对于窗口类)函数,创建并初始化CScrollView对象。例如,在OnInitDialog函数可以添加如下代码: m_scrollView.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST); 3. 在对话框或窗口类重写OnSize函数,用于处理窗口大小改变事件。例如,在对话框可以添加如下代码: void CMyDialog::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); if (m_scrollView.GetSafeHwnd() != nullptr) { CRect rect; GetClientRect(rect); m_scrollView.MoveWindow(rect); } } 在窗口类可以添加如下代码: void CMyWnd::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); if (m_scrollView.GetSafeHwnd() != nullptr) { CRect rect; GetClientRect(rect); m_scrollView.SetWindowPos(nullptr, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER); } } 这样,在调整窗口大小时,滚动条会根据内容的大小和窗口的大小自动进行调整,并在需要时出现或隐藏。你可以根据需要在CScrollView对象添加需要滚动的内容,例如使用CScrollView的派生类CDrawView实现自定义的绘图功能等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦逼的IT男

你的鼓励是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值