• 被迫写一个类似qq登陆框上面的那个下拉框控件


    蓝色边框,选择时是深蓝色边框,下拉按钮可以自定义图片,不过只能是 15*16的BMP

    class CMyComboBox : public CComboBox
    {
    // Construction
    public:
        CMyComboBox();
        
    // normal_id 普通状态图片的ID
        
    // hover_id  hover状态图片的ID
        
    // push_id   push状态图片的ID
        CMyComboBox(unsigned int normal_id,unsigned int hover_id,unsigned int push_id);

    // Attributes
    public:

    // Operations
    public:

    // OverridesClassWizard
        
    //  generated virtual function overrides
        
    //{{AFX_VIRTUAL(CMyComboBox)
        protected:
        
    virtual void PreSubclassWindow();
        
    //}}AFX_VIRTUAL

    // Implementation
    public:
        
    virtual ~CMyComboBox();

        
    // Generated message map functions
    protected:
        
    //{{AFX_MSG(CMyComboBox)
        afx_msg void OnPaint();
        afx_msg 
    void OnMouseMove(UINT nFlags, CPoint point);
        afx_msg 
    void OnTimer(UINT nIDEvent);
        afx_msg 
    void OnLButtonDown(UINT nFlags, CPoint point);
        afx_msg 
    void OnLButtonUp(UINT nFlags, CPoint point);
        
    //}}AFX_MSG

        DECLARE_MESSAGE_MAP()
    private:
        
    void DrawButton(CDC* pDC);
    private:

        unsigned 
    int m_normal_id;
        unsigned 
    int m_hover_id;
        unsigned 
    int m_push_id;

        
    //0-normal 1-hover 2-push
        int  m_button_state;

        
    bool m_active;
        
    bool m_draw;
    }
    ;




    #define BUTTON_STATE_NORMAL 0
    #define BUTTON_STATE_HOVER    (1<<1)
    #define BUTTON_STATE_PUSH    (1<<2)

    /////////////////////////////////////////////////////////////////////////////
    // CMyComboBox

    CMyComboBox::CMyComboBox():m_active(
    false),
                               m_normal_id(
    0),
                               m_hover_id(
    0),
                               m_push_id(
    0),
                               m_button_state(BUTTON_STATE_NORMAL)
    {

    }


    CMyComboBox::CMyComboBox(unsigned 
    int normal_id,
                             unsigned 
    int hover_id,
                             unsigned 
    int push_id):
                                m_active(
    false),
                                m_normal_id(normal_id),
                                m_hover_id(hover_id),
                                m_push_id(push_id),
                                m_button_state(BUTTON_STATE_NORMAL)
    {

    }


    CMyComboBox::
    ~CMyComboBox()
    {
    }



    BEGIN_MESSAGE_MAP(CMyComboBox, CComboBox)
        
    //{{AFX_MSG_MAP(CMyComboBox)
        ON_WM_PAINT()
        ON_WM_MOUSEMOVE()
        ON_WM_TIMER()
        ON_WM_LBUTTONDOWN()
        ON_WM_LBUTTONUP()
        
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // CMyComboBox message handlers




    void CMyComboBox::PreSubclassWindow() 
    {
        CRect rc;
        GetWindowRect(
    &rc);

        rc.left 
    -= 2;
        rc.top 
    -= 15;
        rc.bottom 
    -= 23;
        rc.right 
    -= 8;

        MoveWindow(
    &rc);

        ModifyStyle(
    0,BS_OWNERDRAW);
        CComboBox::PreSubclassWindow();
    }




    void
    CMyComboBox::OnPaint()
    {
        CRect    rc;
        CDC
    *    pDC;

        Default();

        
        pDC 
    = GetDC();

        GetClientRect(rc);

        
    if(m_active)
            pDC
    ->Draw3dRect(rc, RGB(78,108,133), RGB(78,108,133));
        
    else
            pDC
    ->Draw3dRect(rc, RGB(126,157,185), RGB(126,157,185));

        
    //填充掉阴影
        rc.DeflateRect(1,1);
        pDC
    ->Draw3dRect(rc, RGB(255,255,255), RGB(255,255,255));
        
    //填充掉原来的按钮
        rc.left += (rc.Width() - 18);
        rc.DeflateRect(
    1,1);
        pDC
    ->Draw3dRect(rc, RGB(255,255,255), RGB(255,255,255));

        DrawButton(pDC);
        ReleaseDC(pDC);
    }


    void CMyComboBox::OnMouseMove(UINT nFlags, CPoint point) 
    {
        m_draw 
    = true;
        SetTimer(
    1,10,NULL);
        OnTimer(
    1);

        CComboBox::OnMouseMove(nFlags, point);
    }


    void 
    CMyComboBox::OnTimer(UINT nIDEvent) 
    {
        POINT pt;
        CRect rc,rc_button;

        GetCursorPos(
    &pt);

        GetWindowRect(
    &rc);
        
        rc_button 
    = rc;
        rc_button.left 
    += rc_button.Width() - 17;
        
        
    if(rc_button.PtInRect(pt))
        
    {
            
    if(m_button_state != BUTTON_STATE_PUSH)
                m_button_state 
    = BUTTON_STATE_HOVER;
        }

        
    else
            m_button_state 
    = BUTTON_STATE_NORMAL;

        
    if(rc.PtInRect(pt))
        
    {
            m_active 
    = true;
            
    if(m_draw)
            
    {
                m_draw 
    = false;
                Invalidate();
            }

        }

        
    else
        
    {
            KillTimer (
    1);
            m_active       
    = false;
            m_button_state 
    = 0;

            Invalidate();
        }


        CComboBox::OnTimer(nIDEvent);
    }


    void 
    CMyComboBox::DrawButton(CDC
    * pDC)
    {
        
    if(m_normal_id == 0 || m_hover_id ==0 || m_push_id == 0)
            
    return;
        CDC            MemDC;
        CBitmap        bitmap;
        CRect        rc;

        GetWindowRect(
    &rc);
        
        MemDC.CreateCompatibleDC(pDC);

        
    if( m_button_state == BUTTON_STATE_NORMAL )
        
    {
            bitmap.LoadBitmap(m_normal_id);
        }

        
    else if( m_button_state == BUTTON_STATE_HOVER )
        
    {
            bitmap.LoadBitmap(m_hover_id);
        }

        
    else
        
    {
            bitmap.LoadBitmap(m_push_id);
        }


        MemDC.SelectObject(
    &bitmap);
        pDC
    ->BitBlt(rc.Width()-17,3,15,16,&MemDC,0,0,SRCCOPY);
    }




    void CMyComboBox::OnLButtonDown(UINT nFlags, CPoint point) 
    {
        m_button_state 
    = BUTTON_STATE_PUSH;
        Invalidate();
        CComboBox::OnLButtonDown(nFlags, point);
    }


    void CMyComboBox::OnLButtonUp(UINT nFlags, CPoint point) 
    {
        m_button_state 
    = BUTTON_STATE_HOVER;
        Invalidate();
        CComboBox::OnLButtonUp(nFlags, point);
    }

     
  • 相关阅读:
    Forms身份验证
    常见的js图片或内轮换效果
    模仿select选择框
    基于jquery的js幻灯片类
    js弹出幕布遮罩层
    css那些事
    选择珠宝js业务逻辑源码
    aspnet帐号密码改了会出问题
    用rails做了个书评排行网站,欢迎光临!
    转发:为什么函数式编程至关重要
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/2422189.html
Copyright © 2020-2023  润新知