• Combox控件的认识


    1、CComboBoxUI这个函数里面的内容还没学着用。

    这里主要学习CComboUI

    1、该函数继承CContainerUI是因为该函数会包含下拉列表的控件

    2、该函数同时继承了IListOwnerUI 接口,是因为列表控件们在回掉的时候存储的是IListOwnerUI指针

    3、该函数有一个CComboWnd* m_pWindow属性。该类跟时间控件的CDateTimeWnd的功能是一模一样的。当CComboUI被点击时则会触发创建该控件,该空间则会通过(Init函数,时间控件也是通过Init)计算并显示对应的下来列表。该下拉列表是一个VerticalLayout,具体的创建可以看HandleMessage函数里面的WM_CREATE.

      该类实现了一个VerticalLayout里面的滚动条的操作,并显示当前选中的选项的选项。刚开始一直疑惑,它的选中项的背景色是如何绘制,然后进入selectitem之后,它调用了对应的IListItemUI*的select,然后该接口的实现是CListElementUI  在该接口调用 CListElementUI::DrawItemBk 进行对应选中时是什么颜色进行绘制。

    if( IsSelected() ) {
            iBackColor = pInfo->dwSelectedBkColor;
        }
        if( !IsEnabled() ) {
            iBackColor = pInfo->dwDisabledBkColor;
        }
    
        if ( iBackColor != 0 ) {
            CRenderEngine::DrawColor(hDC, m_rcItem, GetAdjustColor(iBackColor));
        }
    View Code

    4、当失去焦点的时候则会调用对应的postquitmessage(0) 然后OnFinalMessage进行自毁。

      或者在选中的时候(CListElementUI::Select)调用pOwner->SelectItem(m_iIndex) 进行调用OnClose

      而对应的调用顺序是在CComboWnd::HandleMessage  ->   m_pm的MessageHandle 然后才调用对应的WM_LButtondown 的对应选中控件的Event,因为CControlUI调用对应的DoEvent 该函数是虚函数 所以才会调用CListLabelElementUI::DoEvent的

    if( event.Type == UIEVENT_BUTTONDOWN || event.Type == UIEVENT_RBUTTONDOWN )
        {
            if( IsEnabled() ) {
                m_pManager->SendNotify(this, DUI_MSGTYPE_ITEMCLICK);
                Select(); // this Select
                Invalidate();
            }
            return;
        }
    View Code

    有注意到:在这个labelSelect之后,其实已经调用了CComboWnd的OnClose,到这时候,理论上应该自动销毁了,然后程序应该崩了才对,但是没有。

    原来:在create这里调用了m_pLayout->SetAutoDestroy(false); 设置自动销毁为false,也就是VerticalLayout在本身VerticalLayout销毁的时候,子对象是不被销毁的。

    否则在~CPaintManagerUI()的delete m_pRoot时在CContainerUI的析构调用RemoveAll时就会删除所有子项。

        void CContainerUI::RemoveAll()
        {
            for( int it = 0; m_bAutoDestroy && it < m_items.GetSize(); it++ ) {
                if( m_bDelayedDestroy && m_pManager ) m_pManager->AddDelayedCleanup(static_cast<CControlUI*>(m_items[it]));             
                else delete static_cast<CControlUI*>(m_items[it]);
            }
            m_items.Empty();
            NeedUpdate();
        }
    View Code

    问题:m_pm.UseParentResource(m_pOwner->GetManager())  也就是引用了CComboUI的PaintManager类,具体是使用了它里面的什么东东或者说该目的是什么这里我不清楚,如果有路过的希望给个解答。

  • 相关阅读:
    路障【SPFA】
    路障【SPFA】
    糟糕的一天【栈】
    糟糕的一天【栈】
    糟糕的一天【栈】
    糟糕的一天【栈】
    2018年暑假 纪中培训总结
    2018年暑假 纪中培训总结
    2018年暑假 纪中培训总结
    仪仗队【数论】
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/4385715.html
Copyright © 2020-2023  润新知