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


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

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

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

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

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

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

    在IRealWndHandler接口实现的OnRealWndCreate

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

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

    1. void CRealWndHelper::Init(CVideoHostWnd* pvideoWnd, SScrollView* pScoroll)
    2. {
    3. m_pvideoWnd = pvideoWnd;
    4. m_pScoroll = pScoroll;
    5. SASSERT(m_pvideoWnd && m_pScoroll);
    6. m_pScoroll->GetEventSet()->subscribeEvent<CRealWndHelper, EventScrollViewOriginChanged>(&CRealWndHelper::OnScrollViewOriginChanged, this);
    7. m_pScoroll->GetEventSet()->subscribeEvent<CRealWndHelper, EventScrollViewSizeChanged>(&CRealWndHelper::OnScrollViewSizeChanged, this);
    8. }
    9. void CRealWndHelper::SetvideoViewSize(CSize szViewSize)
    10. {
    11. SASSERT(m_pvideoWnd && m_pScoroll);
    12. m_pScoroll->SetAttribute(L"viewsize", SStringT().Format(L"%dpx,%dpx", szViewSize.cx, szViewSize.cy), TRUE);
    13. m_pScoroll->RequestRelayout();
    14. }
    15. bool CRealWndHelper::OnScrollViewSizeChanged(EventScrollViewSizeChanged* pEv)
    16. {
    17. m_pvideoWnd->SetRelWndSize(pEv->szNewViewSize);
    18. return true;
    19. }
    20. bool CRealWndHelper::OnScrollViewOriginChanged(EventScrollViewOriginChanged* pEv)
    21. {
    22. m_pvideoWnd->SetRelWndOrg(pEv->ptNewOrigin);
    23. return true;
    24. }

    最后效果如下

     

  • 相关阅读:
    云呐|如何利用系统管理固定资产?如何进行固定资产管理?
    技术分享 | MySQL Shell 定制化部署 MySQL 实例
    从零开始的c++(一)
    SpringBoot项目创建及运行
    初学kotlin 01
    红海云签约广州无线电集团,头部国企人力资源数字化转型全面加速
    Vue中如何进行文件浏览与文件管理
    2022.12.4 学习周报
    螯合物前体肽c(RGD)环肽:DOTA-c(RGDfK)
    电脑怎么改图片格式?图片转格式怎么转?
  • 原文地址:https://blog.csdn.net/lovehuanhuan1314/article/details/125532906