• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 擴展CStatic支持顏色及熱跟蹤

    發表于:2007-05-25來源:作者:點擊數: 標簽:CStatic顏色擴展原理支持
    原理 :重載CStatic,響應WM_CTLCOLOR消息,實現對顏色的支持;響應WM_MOUSEMOVE并跟蹤WM_MOUSEHOVER和WM_MOUSELEAVE消息,實現熱跟蹤功能。 LabelEx.h #ifndef __LabelEx_h__ #define __LabelEx_h__ // ##################################################
    原理:重載CStatic,響應WM_CTLCOLOR消息,實現對顏色的支持;響應WM_MOUSEMOVE并跟蹤WM_MOUSEHOVER和WM_MOUSELEAVE消息,實現熱跟蹤功能。

    LabelEx.h

    #ifndef __LabelEx_h__
    #define __LabelEx_h__

    // ############################################################################
    // # Definition of CLabelEx

    class CLabelEx: public CStatic
    {
    DECLARE_DYNAMIC(CLabelEx)

    // Constructor/Destructor
    public:
    CLabelEx();

    // Attributes
    public:
    void SetTextColor(COLORREF clrText);
    void SetHotTextColor(COLORREF clrHotText);
    void SetBgColor(COLORREF clrBack);

    void EnableHotTrack(BOOL bHotTrack);

    // Overloaded funtions
    protected:
    virtual void PreSubclassWindow();

    // Member varibles
    protected:
    COLORREF m_clrText;
    COLORREF m_clrHotText;
    COLORREF m_clrBack;
    CBrush m_brBkgnd;
    BOOL m_bHotTrack;

    BOOL m_bHover;

    // Handlers of the messages
    protected:
    afx_msg HBRUSH CtlColor(CDC *pDC, UINT nCtlColor);
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
    DECLARE_MESSAGE_MAP()
    };

    // ############################################################################

    #endif //__LabelEx_h__

    LabelEx.cpp
    #include "StdAfx.h"
    #include "LabelEx.h"

    IMPLEMENT_DYNAMIC(CLabelEx, CStatic)

    // ############################################################################
    // # Map the messages

    BEGIN_MESSAGE_MAP(CLabelEx, CStatic)
    ON_WM_CTLCOLOR_REFLECT()
    ON_WM_MOUSEMOVE()
    ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
    END_MESSAGE_MAP()

    // ############################################################################


    // ############################################################################
    // # CLabelEx constructor/destructor

    CLabelEx::CLabelEx()
    {
    m_clrHotText = m_clrText = RGB(0, 0, 0);
    m_clrBack = ::GetSysColor(COLOR_3DFACE);
    m_brBkgnd.CreateSolidBrush(m_clrBack);
    m_bHotTrack = FALSE;

    m_bHover = FALSE;
    }

    // ############################################################################


    // ############################################################################
    // # CLabelEx attributes

    void CLabelEx::SetTextColor(COLORREF clrText)
    {
    m_clrText = clrText;
    this->Invalidate();
    }

    void CLabelEx::SetHotTextColor(COLORREF clrHotText)
    {
    m_clrHotText = clrHotText;
    this->Invalidate();
    }

    void CLabelEx::SetBgColor(COLORREF clrBack)
    {
    m_clrBack = clrBack;
    this->Invalidate();
    }

    void CLabelEx::EnableHotTrack(BOOL bHotTrack)
    {
    m_bHotTrack = bHotTrack;
    this->Invalidate();
    }

    // ############################################################################


    // ############################################################################
    // # CLabelEx overloaded functions

    void CLabelEx::PreSubclassWindow()
    {
    DWORD dwStyle = this->GetStyle();
    ::SetWindowLong(this->GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY);

    CStatic::PreSubclassWindow();
    }

    // ############################################################################


    // ############################################################################
    // # CLabelEx message handlers

    HBRUSH CLabelEx::CtlColor(CDC *pDC, UINT nCtlColor)
    {
    if (m_bHover)
    pDC->SetTextColor(m_clrHotText);
    else
    pDC->SetTextColor(m_clrText);
    pDC->SetBkColor(m_clrBack);
    return (HBRUSH)m_brBkgnd;
    }

    void CLabelEx::OnMouseMove(UINT nFlags, CPoint point)
    {
    TRACKMOUSEEVENT tme;
    tme.cbSize = sizeof(tme);
    tme.dwFlags = TME_HOVER | TME_LEAVE;
    tme.hwndTrack = m_hWnd;
    tme.dwHoverTime = HOVER_DEFAULT;
    _TrackMouseEvent(&tme);

    if (m_bHover) // Cursor is currently over control
    {
    CRect rect;
    GetClientRect(rect);

    if (!rect.PtInRect(point))
    {
    m_bHover = FALSE;
    this->Invalidate();
    ::ReleaseCapture();
    }
    }
    else // Cursor has just moved over control
    {
    m_bHover = TRUE;
    this->Invalidate();
    this->SetCapture();
    // 這兒使用了偷懶的辦法,
    // 使用系統的手型光標只能在win2k或以上OS工作,
    // 如果希望能在win95或win98下工作的話最好自己創建光標資源
    if (m_bHotTrack)
    ::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(32649)));
    }

    CStatic::OnMouseMove(nFlags, point);
    }

    LRESULT CLabelEx::OnMouseLeave(WPARAM wParam, LPARAM lParam)
    {
    m_bHover = FALSE;
    this->Invalidate();
    ::ReleaseCapture();

    return 0;
    }

    // ############################################################################

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>