文章目录
1.CComboUI控件
- 1.CComboUI控件
- 2.作者答疑
在界面开发中,非常常用的一种界面控件是下拉列表控件,xml创建方式如下所示:
//使用范例
//属性列表
接下来分析它的源代码,它继承至CContainerUI,实现了IListOwnerUI接口,头文件如下所示:
class UILIB_API CComboUI : public CContainerUI, public IListOwnerUI
{
DECLARE_DUICONTROL(CComboUI)
friend class CComboWnd;
public:
CComboUI();
LPCTSTR GetClass() const;
LPVOID GetInterface(LPCTSTR pstrName);
void DoInit();
UINT GetControlFlags() const;
CDuiString GetText() const;
void SetEnabled(bool bEnable = true);
void SetTextStyle(UINT uStyle);
UINT GetTextStyle() const;
void SetTextColor(DWORD dwTextColor);
DWORD GetTextColor() const;
void SetDisabledTextColor(DWORD dwTextColor);
DWORD GetDisabledTextColor() const;
void SetFont(int index);
int GetFont() const;
RECT GetTextPadding() const;
void SetTextPadding(RECT rc);
bool IsShowHtml();
void SetShowHtml(bool bShowHtml = true);
bool IsShowShadow();
void SetShowShadow(bool bShow = true);
CDuiString GetDropBoxAttributeList();
void SetDropBoxAttributeList(LPCTSTR pstrList);
SIZE GetDropBoxSize() const;
void SetDropBoxSize(SIZE szDropBox);
UINT GetListType();
TListInfoUI* GetListInfo();
int GetCurSel() const;
bool SelectItem(int iIndex, bool bTakeFocus = false);
bool SelectMultiItem(int iIndex, bool bTakeFocus = false);
bool UnSelectItem(int iIndex, bool bOthers = false);
bool SetItemIndex(CControlUI* pControl, int iIndex);
bool Add(CControlUI* pControl);
bool AddAt(CControlUI* pControl, int iIndex);
bool Remove(CControlUI* pControl);
bool RemoveAt(int iIndex);
void RemoveAll();
bool Activate();
LPCTSTR GetNormalImage() const;
void SetNormalImage(LPCTSTR pStrImage);
LPCTSTR GetHotImage() const;
void SetHotImage(LPCTSTR pStrImage);
LPCTSTR GetPushedImage() const;
void SetPushedImage(LPCTSTR pStrImage);
LPCTSTR GetFocusedImage() const;
void SetFocusedImage(LPCTSTR pStrImage);
LPCTSTR GetDisabledImage() const;
void SetDisabledImage(LPCTSTR pStrImage);
bool GetScrollSelect();
void SetScrollSelect(bool bScrollSelect);
void SetItemFont(int index);
void SetItemTextStyle(UINT uStyle);
RECT GetItemTextPadding() const;
void SetItemTextPadding(RECT rc);
DWORD GetItemTextColor() const;
void SetItemTextColor(DWORD dwTextColor);
DWORD GetItemBkColor() const;
void SetItemBkColor(DWORD dwBkColor);
LPCTSTR GetItemBkImage() const;
void SetItemBkImage(LPCTSTR pStrImage);
bool IsAlternateBk() const;
void SetAlternateBk(bool bAlternateBk);
DWORD GetSelectedItemTextColor() const;
void SetSelectedItemTextColor(DWORD dwTextColor);
DWORD GetSelectedItemBkColor() const;
void SetSelectedItemBkColor(DWORD dwBkColor);
LPCTSTR GetSelectedItemImage() const;
void SetSelectedItemImage(LPCTSTR pStrImage);
DWORD GetHotItemTextColor() const;
void SetHotItemTextColor(DWORD dwTextColor);
DWORD GetHotItemBkColor() const;
void SetHotItemBkColor(DWORD dwBkColor);
LPCTSTR GetHotItemImage() const;
void SetHotItemImage(LPCTSTR pStrImage);
DWORD GetDisabledItemTextColor() const;
void SetDisabledItemTextColor(DWORD dwTextColor);
DWORD GetDisabledItemBkColor() const;
void SetDisabledItemBkColor(DWORD dwBkColor);
LPCTSTR GetDisabledItemImage() const;
void SetDisabledItemImage(LPCTSTR pStrImage);
DWORD GetItemLineColor() const;
void SetItemLineColor(DWORD dwLineColor);
bool IsItemShowHtml();
void SetItemShowHtml(bool bShowHtml = true);
SIZE EstimateSize(SIZE szAvailable);
void SetPos(RECT rc, bool bNeedInvalidate = true);
void Move(SIZE szOffset, bool bNeedInvalidate = true);
void DoEvent(TEventUI& event);
void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);
bool DoPaint(HDC hDC, const RECT& rcPaint, CControlUI* pStopControl);
void PaintText(HDC hDC);
void PaintStatusImage(HDC hDC);
protected:
CComboWnd* m_pWindow;
int m_iCurSel;
DWORD m_dwTextColor;
DWORD m_dwDisabledTextColor;
int m_iFont;
UINT m_uTextStyle;
RECT m_rcTextPadding;
bool m_bShowHtml;
bool m_bShowShadow;
CDuiString m_sDropBoxAttributes;
SIZE m_szDropBox;
UINT m_uButtonState;
CDuiString m_sNormalImage;
CDuiString m_sHotImage;
CDuiString m_sPushedImage;
CDuiString m_sFocusedImage;
CDuiString m_sDisabledImage;
bool m_bScrollSelect;
TListInfoUI m_ListInfo;
};
查看它两个关键函数DoEvent函数和DoPaint函数,DoEvent函数代码如下所示:
void CComboUI::DoEvent(TEventUI& event)
{
if( !IsMouseEnabled() && event.Type > UIEVENT__MOUSEBEGIN && event.Type DoEvent(event);
else CContainerUI::DoEvent(event);
return;
}
if( event.Type == UIEVENT_SETFOCUS )
{
Invalidate();
}
if( event.Type == UIEVENT_KILLFOCUS )
{
Invalidate();
}
if( event.Type == UIEVENT_BUTTONDOWN )
{
if( IsEnabled() ) {
Activate();//激活下拉列表,并创建窗口
m_uButtonState |= UISTATE_PUSHED | UISTATE_CAPTURED;
}
return;
}
if( event.Type == UIEVENT_BUTTONUP )
{
if( (m_uButtonState & UISTATE_CAPTURED) != 0 ) {
m_uButtonState &= ~ UISTATE_CAPTURED;
Invalidate();
}
return;
}
if( event.Type == UIEVENT_MOUSEMOVE )
{
return;
}
if( event.Type == UIEVENT_KEYDOWN )
{
switch( event.chKey ) {
case VK_F4:
Activate();
return;
case VK_UP:
SelectItem(FindSelectable(m_iCurSel - 1, false));
return;
case VK_DOWN:
SelectItem(FindSelectable(m_iCurSel + 1, true));
return;
case VK_PRIOR:
SelectItem(FindSelectable(m_iCurSel - 1, false));
return;
case VK_NEXT:
SelectItem(FindSelectable(m_iCurSel + 1, true));
return;
case VK_HOME:
SelectItem(FindSelectable(0, false));
return;
case VK_END:
SelectItem(FindSelectable(GetCount() - 1, true));
return;
}
}
if( event.Type == UIEVENT_SCROLLWHEEL )
{
if(GetScrollSelect()) {
bool bDownward = LOWORD(event.wParam) == SB_LINEDOWN;
SelectItem(FindSelectable(m_iCurSel + (bDownward ? 1 : -1), bDownward));
}
return;
}
if( event.Type == UIEVENT_CONTEXTMENU )
{
return;
}
if( event.Type == UIEVENT_MOUSEENTER )
{
if( ::PtInRect(&m_rcItem, event.ptMouse ) ) {
if( (m_uButtonState & UISTATE_HOT) == 0 )
m_uButtonState |= UISTATE_HOT;
Invalidate();
}
return;
}
if( event.Type == UIEVENT_MOUSELEAVE )
{
if( (m_uButtonState & UISTATE_HOT) != 0 ) {
m_uButtonState &= ~UISTATE_HOT;
Invalidate();
}
return;
}
CControlUI::DoEvent(event);
}
bool CComboUI::Activate()
{
if( !CControlUI::Activate() ) return false;
if( m_pManager != NULL ) m_pManager->SendNotify(this, DUI_MSGTYPE_PREDROPDOWN);
if( m_pWindow ) return true;
m_pWindow = new CComboWnd();//临时生成窗口显示文本
ASSERT(m_pWindow);
m_pWindow->Init(this);
if( m_pManager != NULL ) m_pManager->SendNotify(this, DUI_MSGTYPE_DROPDOWN);
Invalidate();
return true;
}
DoPaint函数代码如下所示:
bool CComboUI::DoPaint(HDC hDC, const RECT& rcPaint, CControlUI* pStopControl)
{
return CControlUI::DoPaint(hDC, rcPaint, pStopControl);
}
下拉列表控件是列表控件的一种,使用频率也是比较高,而真正的下拉列表控件种类还是比较多的,在第三章的范例里再进行详细的讲解,这一部分使读者对代码有一定程度的熟悉。
2.作者答疑如有疑问,请留言。