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类,具体是使用了它里面的什么东东或者说该目的是什么这里我不清楚,如果有路过的希望给个解答。

 

posted @ 2015-04-01 23:41  CY_K_YC  阅读(1735)  评论(0编辑  收藏  举报