您当前的位置: 首页 >  ui

插件开发

暂无认证

  • 1浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

第二章 第九小节Duilib中的CComboUI控件-下拉列表控件

插件开发 发布时间:2022-04-02 08:39:20 ,浏览量:1

文章目录
    • 1.CComboUI控件
    • 2.作者答疑

1.CComboUI控件

  在界面开发中,非常常用的一种界面控件是下拉列表控件,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.作者答疑

  如有疑问,请留言。

关注
打赏
1665481431
查看更多评论
立即登录/注册

微信扫码登录

0.0471s