zoukankan      html  css  js  c++  java
  • 所有者绘制按钮助手类

    介绍 这只是一个类的表示,它可以用作所有者绘制按钮的中间类。 使用的代码 当创建一个owner draw按钮时,我们像这样开始… 隐藏,复制Code

    class CMyButton : public CButton
    {
        // class content related custom drawing
    };

    我所做的是从CButton派生了一个名为CODBaseBtn的类,它与绘图没有任何关系。相反,调用一些虚函数。这使得它成为所有者绘制按钮的中间类。 隐藏,复制Code

    class CODBaseBtn : public CButton
    {
        // Basic handling of events and virtual functions for drawing
    }

    提供了两种虚函数: 画relatedAction相关 图中相关虚函数如下… 隐藏,复制Code

    virtual void OnDrawNormal( CDC& dc, CRect rect ) = 0;
    virtual void OnDrawHovered( CDC& dc, CRect rect ) { OnDrawNormal( dc, rect ); }
    virtual void OnDrawPressed( CDC& dc, CRect rect ) { OnDrawNormal( dc, rect ); }
    virtual void OnDrawDisabled( CDC& dc, CRect rect ) { OnDrawNormal( dc, rect ); }

    第一个函数是纯虚函数,它必须由派生类实现。顾名思义,这些函数在相应的条件下调用。因此派生类可以处理它们并绘制适当的按钮图像。 与动作相关的虚函数如下… 隐藏,复制Code

    virtual void OnBeginHover() { }
    virtual void OnEndHover() { }
    virtual void OnPressed() { }
    virtual void OnReleased() { }

    它们分别在鼠标悬停、鼠标离开、按下和释放等操作上被调用。可以明智地使用它们来扩展普通按钮的功能。它们不是纯虚拟的,所以如果不需要,可以避免使用。 从CODBaseBtn派生一个类如下所示… 隐藏,复制Code

    class CMyBtn : public CODBaseBtn
    {
        // Implementation of custom drawings and actions.
    }

    样例应用程序 示例测试应用程序有两个派生类。一种是使用相关函数的绘图。而另一种则同时使用绘图和动作相关的功能。由此,可以理解这样一个类的可能性。 绘图非常简单,因为测试应用程序只是为了演示CODBaseBtn的使用。 内部CODBaseBtn CODBaseBtn内部的主要代码描述如下: 隐藏,复制Code

    void CODBaseBtn::PreSubclassWindow()
    {
        // Some code...
    
    
        // Update the style to owner draw
        ModifyStyle( 0, BS_OWNERDRAW );
    
        // Some code...
    }

    样式设置为BS_OWNERDRAW以启用按钮所有者绘制。这有助于避免在对话框资源编辑器中或在运行时使用Create(或CreateWindow)创建按钮时设置此样式。 隐藏,复制Code

    void CODBaseBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        // The virtual functions are called from here
    }

    DrawItem是CButton的一个虚拟函数。当需要绘制按钮时调用它。lpDrawItemStruct将包含绘制所需的内容,如hDC、客户端矩形、按钮状态等。使用这些函数,可以调用用于绘制和操作的适当虚函数。 隐藏,复制Code

    void CODBaseBtn::OnMouseMove(UINT nFlags, CPoint point)
    {
        if( !m_bMouseHover )
        {
            // Set the flag so that next mouse move message will be neglected
            m_bMouseHover = true;
    
            // Some code to register the mouse leave message
        }
    }

    这是鼠标悬停处理。当鼠标在按钮内部时,m_bMouseHover将为false(最初设置为false)。在函数内部,它被设为真。因此,当鼠标再次移动到按钮内时,可以忽略它。第一次,调用相应的绘图和操作函数,并使用_TrackMouseEvent注册鼠标留言请求。当鼠标离开按钮(客户端)区域时,将调用以下函数。 隐藏,复制Code

    LRESULT CODBaseBtn::OnMouseLeave( WPARAM, LPARAM )
    {
        // Reset the flag
        m_bMouseHover = false;
    
        // Some code...
    
        return 0;
    }

    这里,m_bMouseHover被重置为false。调用绘制和动作函数的必要调用: 隐藏,复制Code

    void CODBaseBtn::OnLButtonDblClk(UINT nFlags, CPoint point)
    {
        // Convert the double click to single click
        const MSG* pstMSG = GetCurrentMessage();
        DefWindowProc( WM_LBUTTONDOWN, pstMSG->wParam, pstMSG->lParam );
    }

    这是一个棘手的问题。具有BS_OWNERDRAW样式的按钮不会像普通按钮那样对双击作出响应。解如上所述。当双击发生时,用WM_LBUTTONDOWN调用按钮的默认窗口过程,而不是实际的WM_LBUTTONDBLCLK。 结论 提供的类可以用作CButton和所有者绘制按钮的派生类之间的层。它将有助于避免大量代码,而且非常有用。 历史 一个也没有。 本文转载于:http://www.diyabc.com/frontweb/news443.html

  • 相关阅读:
    33. Search in Rotated Sorted Array
    文章
    导航
    页眉和页脚
    渐变
    图像翻转与子画面
    背景图像定位
    背景图像
    使用css将图像居中
    使用CSS将图像对齐
  • 原文地址:https://www.cnblogs.com/Dincat/p/13450099.html
Copyright © 2011-2022 走看看