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