• DuiLib 中滚动条不显示的问题


    DuiLib 很好用,同时在没有完全理解源码的前提下,坑也不少,比如今天遇到的添加滚动条不显示。。。
    情况是这样的,将一个页面作为Tab控件的其中一页,为了代码不窝在一起,就没有在CreateControl函数中使用CDialogBuilder,而是直接new一个页面,在构造函数中使用CDialogBuilder,大致如下
    1. CControlUI * CMainView::CreateControl(LPCTSTR pstrClass) {
    2. if (0 == _tcscmp(pstrClass, _T("RealTimeInfoPage"))) {
    3. return new CRealTimeInfoPage();
    4. }
    5. return NULL;
    6. }
    1. class CRealTimeInfoPage : public CContainerUI {
    2. public:
    3. CRealTimeInfoPage();
    4. ~CRealTimeInfoPage();
    5. };
    1. CRealTimeInfoPage::CRealTimeInfoPage() {
    2. CDialogBuilder builder;
    3. this->Add(builder.Create(_T("xml\RealTimeInfoPage.xml")));
    4. }
    就这么个搞法,以前也这么用,不过没用到滚动条,没发现这个问题。页面创建,显示都没有问题,滚动条死活不出来。
    没办法,跟踪源码吧,跟到这里,原来m_pManager为NULL。。。当然略过了xml中配置的Default
    1. void CContainerUI::EnableScrollBar(bool bEnableVertical, bool bEnableHorizontal) {
    2. if( bEnableVertical && !m_pVerticalScrollBar ) {
    3. m_pVerticalScrollBar = new CScrollBarUI;
    4. m_pVerticalScrollBar->SetScrollRange(0);
    5. m_pVerticalScrollBar->SetOwner(this);
    6. m_pVerticalScrollBar->SetManager(m_pManager, NULL, false);
    7. if ( m_pManager ) {
    8. LPCTSTR pDefaultAttributes = m_pManager->GetDefaultAttributeList(_T("VScrollBar"));
    9. if( pDefaultAttributes ) {
    10. m_pVerticalScrollBar->SetAttributeList(pDefaultAttributes);
    11. }
    12. }
    13. } else if( !bEnableVertical && m_pVerticalScrollBar ) {
    14. m_pVerticalScrollBar->Delete();
    15. m_pVerticalScrollBar = NULL;
    16. }
    17. if( bEnableHorizontal && !m_pHorizontalScrollBar ) {
    18. m_pHorizontalScrollBar = new CScrollBarUI;
    19. m_pHorizontalScrollBar->SetScrollRange(0);
    20. m_pHorizontalScrollBar->SetHorizontal(true);
    21. m_pHorizontalScrollBar->SetOwner(this);
    22. m_pHorizontalScrollBar->SetManager(m_pManager, NULL, false);
    23. if ( m_pManager ) {
    24. LPCTSTR pDefaultAttributes = m_pManager->GetDefaultAttributeList(_T("HScrollBar"));
    25. if( pDefaultAttributes ) {
    26. m_pHorizontalScrollBar->SetAttributeList(pDefaultAttributes);
    27. }
    28. }
    29. } else if( !bEnableHorizontal && m_pHorizontalScrollBar ) {
    30. m_pHorizontalScrollBar->Delete();
    31. m_pHorizontalScrollBar = NULL;
    32. }
    33. NeedUpdate();
    34. }
    得想办法把PaintManager传进来,找了下CPaintManagerUI看能不能找到获取paintmanager对象的方法,结果是不好用的
    1. CPaintManagerUI* CPaintManagerUI::GetPaintManager(LPCTSTR pstrName) {
    2. if( pstrName == NULL ) return NULL;
    3. CString sName = pstrName;
    4. if( sName.IsEmpty() ) return NULL;
    5. for( int i = 0; i < m_aPreMessages.GetSize(); i++ ) {
    6. CPaintManagerUI* pManager = static_cast<CPaintManagerUI*>(m_aPreMessages[i]);
    7. if( pManager != NULL && sName == pManager->GetName() ) return pManager;
    8. }
    9. return NULL;
    10. }
    11. CDuiPtrArray* CPaintManagerUI::GetPaintManagers() {
    12. return &m_aPreMessages;
    13. }
    有这么两个,明明CMainView继承自WindowImplBase,拥有成员变量m_PaintManager的Name为“”,却不能通过""获取,不说了,找到原因还是去改一下CRealTimeInfoPage的构造函数,把paintmanager传进来把,虽然很丑陋,但是能用啊!
    1. CRealTimeInfoPage::CRealTimeInfoPage(CPaintManagerUI *pManager) {
    2. CDialogBuilder builder;
    3. this->Add(builder.Create(_T("xml\RealTimeInfoPage.xml"), NULL, NULL, pManager));
    4. }
    1. CControlUI * CMainView::CreateControl(LPCTSTR pstrClass) {
    2. if (0 == _tcscmp(pstrClass, _T("RealTimeInfoPage"))) {
    3. return new CRealTimeInfoPage(&m_PaintManager);
    4. }
    5. return NULL;
    6. }
    至此终于把滚动条显示出来了。




  • 相关阅读:
    tensorflow 镜像
    TDD、BDD、DDD
    Node.js结合Selenium做Web自动化测试
    Selenium 对元素element的操作举例
    Selenium UI 举例 getCssValue
    《测之重器——自动化测试框架搭建指南》
    《Robot Framework自动化测试修炼宝典》道长
    SQLServer中round函数
    SQLServer中对时间和长度的处理
    SQLServer中获取所有数据库名、所有表名、所有字段名的SQL语句
  • 原文地址:https://www.cnblogs.com/mforestlaw/p/5894904.html
Copyright © 2020-2023  润新知