您当前的位置: 首页 >  ui

插件开发

暂无认证

  • 2浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

第二章 第六小节Duilib中的CEditUI控件-简单编辑框

插件开发 发布时间:2022-04-01 08:22:39 ,浏览量:2

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

1.CEditUI控件

  在duilib中,如何引入文本编辑框,实现采用的是CEditUI控件,它实现的是单行文本的输入,继承至CLabelUI控件,XML创建方式如下所示:

//使用范例

//属性列表

		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
	

源代码如下所示:

class UILIB_API CEditUI : public CLabelUI
    {
        DECLARE_DUICONTROL(CEditUI)
        friend class CEditWnd;
    public:
        CEditUI();

        LPCTSTR GetClass() const;
        LPVOID GetInterface(LPCTSTR pstrName);
        UINT GetControlFlags() const;

        void SetEnabled(bool bEnable = true);
        void SetText(LPCTSTR pstrText);
        void SetMaxChar(UINT uMax);
        UINT GetMaxChar();
        void SetReadOnly(bool bReadOnly);
        bool IsReadOnly() const;
        void SetPasswordMode(bool bPasswordMode);
        bool IsPasswordMode() const;
        void SetPasswordChar(TCHAR cPasswordChar);
        TCHAR GetPasswordChar() const;
        void SetNumberOnly(bool bNumberOnly);
        bool IsNumberOnly() const;
        int GetWindowStyls() const;

        LPCTSTR GetNormalImage();
        void SetNormalImage(LPCTSTR pStrImage);
        LPCTSTR GetHotImage();
        void SetHotImage(LPCTSTR pStrImage);
        LPCTSTR GetFocusedImage();
        void SetFocusedImage(LPCTSTR pStrImage);
        LPCTSTR GetDisabledImage();
        void SetDisabledImage(LPCTSTR pStrImage);
        void SetNativeEditBkColor(DWORD dwBkColor);
        DWORD GetNativeEditBkColor() const;
        void SetNativeEditTextColor( LPCTSTR pStrColor );
        DWORD GetNativeEditTextColor() const;

        bool IsAutoSelAll();
        void SetAutoSelAll(bool bAutoSelAll);
        void SetSel(long nStartChar, long nEndChar);
        void SetSelAll();
        void SetReplaceSel(LPCTSTR lpszReplace);

        void SetTipValue(LPCTSTR pStrTipValue);
        LPCTSTR GetTipValue();
        void SetTipValueColor(LPCTSTR pStrColor);
        DWORD GetTipValueColor();

        void SetPos(RECT rc, bool bNeedInvalidate = true);
        void Move(SIZE szOffset, bool bNeedInvalidate = true);
        void SetVisible(bool bVisible = true);
        void SetInternVisible(bool bVisible = true);
        SIZE EstimateSize(SIZE szAvailable);
        void DoEvent(TEventUI& event);
        void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);

        void PaintStatusImage(HDC hDC);
        void PaintText(HDC hDC);

    protected:
        CEditWnd* m_pWindow;

        UINT m_uMaxChar;
        bool m_bReadOnly;
        bool m_bPasswordMode;
        bool m_bAutoSelAll;
        TCHAR m_cPasswordChar;
        UINT m_uButtonState;
        CDuiString m_sNormalImage;
        CDuiString m_sHotImage;
        CDuiString m_sFocusedImage;
        CDuiString m_sDisabledImage;
        CDuiString m_sTipValue;
        DWORD m_dwTipValueColor;
        DWORD m_dwEditbkColor;
        DWORD m_dwEditTextColor;
        int m_iWindowStyls;
    };

  使用win32编辑框的读者,阅读以上代码,会觉得很简单,只是一些常用属性的设置,接着在cpp文件里,有一个动态win32编辑窗口的实现,源代码如下:

class CEditWnd : public CWindowWnd
    {
    public:
        CEditWnd();

        void Init(CEditUI* pOwner);
        RECT CalPos();

        LPCTSTR GetWindowClassName() const;
        LPCTSTR GetSuperClassName() const;
        void OnFinalMessage(HWND hWnd);

        LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
        LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
        LRESULT OnEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

    protected:
        enum { 
            DEFAULT_TIMERID = 20,
        };

        CEditUI* m_pOwner;
        HBRUSH m_hBkBrush;
        bool m_bInit;
        bool m_bDrawCaret;
    };
    
    LPCTSTR CEditWnd::GetWindowClassName() const
    {
        return _T("EditWnd");
    }

    LPCTSTR CEditWnd::GetSuperClassName() const
    {
        return WC_EDIT;//超类化,扩展系统提供的窗口类
    }
    
    LRESULT CEditWnd::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
        //if ((HWND)wParam != m_pOwner->GetManager()->GetPaintWindow()) {
        //    ::SendMessage(m_pOwner->GetManager()->GetPaintWindow(), WM_KILLFOCUS, wParam, lParam);
        //}
        PostMessage(WM_CLOSE);
        return lRes;
    }

    LRESULT CEditWnd::OnEditChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        if( !m_bInit ) return 0;
        if( m_pOwner == NULL ) return 0;
        // Copy text back
        int cchLen = ::GetWindowTextLength(m_hWnd) + 1;
        LPTSTR pstr = static_cast(_alloca(cchLen * sizeof(TCHAR)));
        ASSERT(pstr);
        if( pstr == NULL ) return 0;
        ::GetWindowText(m_hWnd, pstr, cchLen);
        m_pOwner->m_sText = pstr;
        m_pOwner->GetManager()->SendNotify(m_pOwner, DUI_MSGTYPE_TEXTCHANGED);
        if( m_pOwner->GetManager()->IsLayered() ) m_pOwner->Invalidate();
        return 0;
    }

  编辑窗口在失去焦点时关闭,在文本改变时动态保存。

    void CEditUI::DoEvent(TEventUI& event)
    {
    	......
    	if( event.Type == UIEVENT_SETFOCUS && IsEnabled() ) 
        {
            if( m_pWindow ) return;
            m_pWindow = new CEditWnd();//聚焦新建窗口
            ASSERT(m_pWindow);
            m_pWindow->Init(this);
            Invalidate();
        }
        ......
        if( event.Type == UIEVENT_BUTTONDOWN || event.Type == UIEVENT_DBLCLICK || event.Type == UIEVENT_RBUTTONDOWN) 
        {
            if( IsEnabled() ) {
                GetManager()->ReleaseCapture();
                if( IsFocused() && m_pWindow == NULL )
                {
                	//左键按下时动态创建编辑窗口,并选择所有
                    m_pWindow = new CEditWnd();
                    ASSERT(m_pWindow);
                    m_pWindow->Init(this);

                    if( PtInRect(&m_rcItem, event.ptMouse) )
                    {
                        int nSize = GetWindowTextLength(*m_pWindow);
                        if( nSize == 0 ) nSize = 1;
                        Edit_SetSel(*m_pWindow, 0, nSize);
                    }
                }
                else if( m_pWindow != NULL )
                {
                    if (!m_bAutoSelAll) {
                        POINT pt = event.ptMouse;
                        pt.x -= m_rcItem.left + m_rcTextPadding.left;
                        pt.y -= m_rcItem.top + m_rcTextPadding.top;
                        Edit_SetSel(*m_pWindow, 0, 0);//取消选择
                        //编辑框鼠标点击事件
                        ::SendMessage(*m_pWindow, WM_LBUTTONDOWN, event.wParam, MAKELPARAM(pt.x, pt.y));
                    }
                }
            }
            return;
        }
        if( event.Type == UIEVENT_MOUSEMOVE ) 
        {
            return;
        }
        if( event.Type == UIEVENT_BUTTONUP ) 
        {
            return;
        }
        if( event.Type == UIEVENT_CONTEXTMENU )
        {
            return;
        }
        if( event.Type == UIEVENT_MOUSEENTER )
        {
            if( ::PtInRect(&m_rcItem, event.ptMouse ) ) {
                if( IsEnabled() ) {
                    if( (m_uButtonState & UISTATE_HOT) == 0  ) {
                        m_uButtonState |= UISTATE_HOT;
                        Invalidate();
                    }
                }
            }
        }
        if( event.Type == UIEVENT_MOUSELEAVE )
        {
            if( IsEnabled() ) {
                m_uButtonState &= ~UISTATE_HOT;
                Invalidate();
            }
            return;
        }
        CLabelUI::DoEvent(event);
    }

  最后一部分是绘制文本,代码如下:

void CEditUI::PaintText(HDC hDC)
    {
        DWORD mCurTextColor = m_dwTextColor;

        if( m_dwTextColor == 0 ) mCurTextColor = m_dwTextColor = m_pManager->GetDefaultFontColor();        
        if( m_dwDisabledTextColor == 0 ) m_dwDisabledTextColor = m_pManager->GetDefaultDisabledColor();

        CDuiString sDrawText = GetText();
        CDuiString sTipValue = GetTipValue();
        if(sDrawText == sTipValue || sDrawText == _T("")) {
            mCurTextColor = m_dwTipValueColor;
            sDrawText = sTipValue;
        }
        else {
            CDuiString sTemp = sDrawText;
            if( m_bPasswordMode ) {//密码模式
                sDrawText.Empty();
                LPCTSTR pStr = sTemp.GetData();
                while( *pStr != _T('\0') ) {
                    sDrawText += m_cPasswordChar;
                    pStr = ::CharNext(pStr);
                }
            }
        }

        RECT rc = m_rcItem;
        rc.left += m_rcTextPadding.left;
        rc.right -= m_rcTextPadding.right;
        rc.top += m_rcTextPadding.top;
        rc.bottom -= m_rcTextPadding.bottom;
        if( IsEnabled() ) {
            CRenderEngine::DrawText(hDC, m_pManager, rc, sDrawText, mCurTextColor, \
                m_iFont, DT_SINGLELINE | m_uTextStyle);
        }
        else {
            CRenderEngine::DrawText(hDC, m_pManager, rc, sDrawText, m_dwDisabledTextColor, \
                m_iFont, DT_SINGLELINE | m_uTextStyle);
        }
    }
2.作者答疑

  如有疑问,请留言。

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

微信扫码登录

0.1279s