在SOUI里使用真窗口时使用SOUI的滚动条

在UI里合理使用真窗口一般可以充分利用现有控件,并且减少重写的麻烦,但是在DUI里融合是一个问题,而带有滚动条的控件一般有控件自带的滚动条,这种情况可能需要HOOK掉现在的控件。另一种是自己的窗口实现大小大于视图大小需要显示滚动条,本文讨论的是第二种情况。对于这种情况下要使用SOUI自带的滚动条我使用的方法是在外层再加一层这真窗口这样答到clip子窗口的效果。这里只讲关键部分不提供源码。

一  、关闭窗口透明,真窗口是不能在透明窗口当子窗口显示的。

二、外层窗口创建时添加WS_CLIPCHILDREN标志。

三、真子窗口放入一个scollview里。

四、创建真子窗口时需要创建两层,外面为clip功能一直和视图大小一样。以下是我使用创建方法

HWND CVideoHostWnd::Create(HWND hWndParent, int id)
{
	HWND hWnd = SNativeWnd::Create(_T("video_host_wnd"), WS_CHILD | WS_VISIBLE/*| WS_CLIPCHILDREN*/, NULL, 0, 0, 0, 0, hWndParent, NULL);
	m_hRealWnd.Create(_T("video_wnd"), WS_CHILD | WS_VISIBLE, NULL, 0, 0, 0, 0, hWnd, NULL);
	SetRelWndID(id);
	return hWnd;
}

在IRealWndHandler接口实现的OnRealWndCreate

CVideoHostWnd* pvideoWnd = new CVideoHostWnd();
			pvideoWnd->Create(pRealWnd->GetContainer()->GetHostHwnd(),pRealWnd->GetID());
			pRealWnd->SetData(pvideoWnd);
			//返回成功创建后的窗口句柄
			return pvideoWnd->m_hWnd;

五、在合适的时机里调整两个窗口的大小和位置

void CRealWndHelper::Init(CVideoHostWnd* pvideoWnd, SScrollView* pScoroll)
	{
		m_pvideoWnd = pvideoWnd;
		m_pScoroll = pScoroll;
		SASSERT(m_pvideoWnd && m_pScoroll);
		m_pScoroll->GetEventSet()->subscribeEvent<CRealWndHelper, EventScrollViewOriginChanged>(&CRealWndHelper::OnScrollViewOriginChanged, this);
		m_pScoroll->GetEventSet()->subscribeEvent<CRealWndHelper, EventScrollViewSizeChanged>(&CRealWndHelper::OnScrollViewSizeChanged, this);
	}
	
	void CRealWndHelper::SetvideoViewSize(CSize szViewSize)
	{
		SASSERT(m_pvideoWnd && m_pScoroll);
		m_pScoroll->SetAttribute(L"viewsize", SStringT().Format(L"%dpx,%dpx", szViewSize.cx, szViewSize.cy), TRUE);
		m_pScoroll->RequestRelayout();
	}
	
	bool CRealWndHelper::OnScrollViewSizeChanged(EventScrollViewSizeChanged* pEv)
	{
		m_pvideoWnd->SetRelWndSize(pEv->szNewViewSize);
		return true;
	}

	bool CRealWndHelper::OnScrollViewOriginChanged(EventScrollViewOriginChanged* pEv)
	{
		m_pvideoWnd->SetRelWndOrg(pEv->ptNewOrigin);
		return true;
	}

最后效果如下

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值