播放器中的声音控件

来源:互联网 发布:冰点软件干嘛的 编辑:程序博客网 时间:2024/05/21 11:24

想找个现成的,没找着,所以基于现成的修改了下。

参考:

http://www.codeproject.com/Articles/1678/Transparent-CSliderCtrl-Class


额外增加的功能:

1、使thumb左侧与右侧颜色不同。

2、鼠标放置在thumb上,thumb高亮。

3、鼠标放置在slider上,变成手图标。


#pragma onceclass CVolumeSlider : public CSliderCtrl{// Constructionpublic:    CVolumeSlider();    virtual ~CVolumeSlider();public:    void SetThumbColors(COLORREF crNormal, COLORREF crHighlight);    void SetChannelColor(COLORREF crNormal, COLORREF crLeftPart);    void DrawTransparent(BOOL bRepaint);protected:    afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);    afx_msg BOOL OnEraseBkgnd(CDC* pDC);    afx_msg void OnMouseMove(UINT nFlags, CPoint point);    afx_msg void OnMouseLeave();    DECLARE_MESSAGE_MAP()private:    void DrawChannel(CDC *pDC, LPNMCUSTOMDRAW lpcd);    void DrawThumb(CDC *pDC, LPNMCUSTOMDRAW lpcd);protected:    HDC         m_hDCBk;    HBITMAP     m_hBitmapBk;    HBITMAP     m_hBitmapBkOld;    COLORREF    m_crThumbNormal;    COLORREF    m_crThumbSelected;    COLORREF    m_crChannelNormal;    COLORREF    m_crChannelLeft;    CRect       m_rectChannel;    bool        m_bHoverThumb;};


#include "stdafx.h"#include "VolumeSlider.h"#ifdef _DEBUG#define new DEBUG_NEW#endif/////////////////////////////////////////////////////////////////////////////// CVolumeSliderCVolumeSlider::CVolumeSlider(){    m_hDCBk = NULL;    m_hBitmapBk = NULL;    m_hBitmapBkOld = NULL;    m_crThumbNormal = RGB(192, 192, 192);    m_crThumbSelected = RGB(220, 220, 220);    m_crChannelNormal = RGB(51, 51, 51);    m_crChannelLeft = RGB(40, 131, 192);    m_rectChannel = CRect(0, 0, 0, 0);    m_bHoverThumb = false;}CVolumeSlider::~CVolumeSlider(){    if (m_hDCBk != NULL)    {        if (m_hBitmapBkOld != NULL)        {            ::SelectObject(m_hDCBk, m_hBitmapBkOld);            m_hBitmapBkOld = NULL;        }        if (m_hBitmapBk != NULL)        {            ::DeleteObject(m_hBitmapBk);            m_hBitmapBk = NULL;        }        ::DeleteDC(m_hDCBk);        m_hDCBk = NULL;    }}void CVolumeSlider::SetThumbColors(COLORREF crNormal, COLORREF crHighlight){    m_crThumbNormal = crNormal;    m_crThumbSelected = crHighlight;}void CVolumeSlider::SetChannelColor(COLORREF crNormal, COLORREF crLeftPart){    m_crChannelNormal = crNormal;    m_crChannelLeft = crLeftPart;}void CVolumeSlider::DrawTransparent(BOOL bRepaint){    if (m_hDCBk != NULL)    {        if (m_hBitmapBkOld != NULL)        {            ::SelectObject(m_hDCBk, m_hBitmapBkOld);            m_hBitmapBkOld = NULL;        }        if (m_hBitmapBk != NULL)        {            ::DeleteObject(m_hBitmapBk);            m_hBitmapBk = NULL;        }        ::DeleteDC(m_hDCBk);        m_hDCBk = NULL;    }    if (bRepaint)     {        Invalidate();        EnableWindow(FALSE);        EnableWindow(TRUE);    }}BEGIN_MESSAGE_MAP(CVolumeSlider, CSliderCtrl)    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)    ON_WM_ERASEBKGND()    ON_WM_MOUSEMOVE()    ON_WM_MOUSELEAVE()END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CVolumeSlider message handlers//-------------------------------------------------------------------//void CVolumeSlider::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) //// Description  :   Sent by the slider control to notify the parent window //                  about drawing operations. This notification is sent in //                  the form of a WM_NOTIFY message.// Parameters   :   pNMHDR - a pointer to a NM_CUSTOMDRAW structure.//                  pResult - value depends on the current drawing state.{    LPNMCUSTOMDRAW lpcd = (LPNMCUSTOMDRAW)pNMHDR;    CDC *pDC = CDC::FromHandle(lpcd->hdc);    switch(lpcd->dwDrawStage)    {    case CDDS_PREPAINT:        *pResult = CDRF_NOTIFYITEMDRAW;        break;    case CDDS_ITEMPREPAINT:        {            switch(lpcd->dwItemSpec)            {            case TBCD_TICS:                *pResult = CDRF_DODEFAULT;                 break;            case TBCD_THUMB:                DrawThumb(pDC, lpcd);                *pResult = CDRF_SKIPDEFAULT;                 break;            case TBCD_CHANNEL:                DrawChannel(pDC, lpcd);                *pResult = CDRF_SKIPDEFAULT;                break;            }            break;        }    }}BOOL CVolumeSlider::OnEraseBkgnd(CDC* pDC){    return FALSE;}void CVolumeSlider::OnMouseMove(UINT nFlags, CPoint point){    SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_HAND)));    CRect rectThumb;    GetThumbRect(&rectThumb);    if (PtInRect(rectThumb, point))    {        m_bHoverThumb = true;    }    else    {        m_bHoverThumb = false;    }    CSliderCtrl::OnMouseMove(nFlags, point);}void CVolumeSlider::OnMouseLeave(){    m_bHoverThumb = false;    CSliderCtrl::OnMouseLeave();}void CVolumeSlider::DrawChannel(CDC *pDC, LPNMCUSTOMDRAW lpcd){    CClientDC dcParent(GetParent());    CRect rectClient;    CRect rectWindow;    GetClientRect(rectClient);    GetWindowRect(rectWindow);    GetParent()->ScreenToClient(rectWindow);    if (m_hDCBk == NULL)    {        m_hDCBk = CreateCompatibleDC(dcParent.m_hDC);        m_hBitmapBk = CreateCompatibleBitmap(dcParent.m_hDC, rectClient.Width(), rectClient.Height());        m_hBitmapBkOld = (HBITMAP)::SelectObject(m_hDCBk, m_hBitmapBk);        ::BitBlt(m_hDCBk, 0, 0, rectClient.Width(), rectClient.Height(), dcParent.m_hDC, rectWindow.left, rectWindow.top, SRCCOPY);    }    //This bit does the tics marks transparently.    //create a memory dc to hold a copy of the oldbitmap data that includes the tics,    //because when we add the background in we will lose the tic marks    HDC hDCSave;    HBITMAP hBitmapSave;    int nWidth = rectClient.Width();    int nHeight = rectClient.Height();    hDCSave = ::CreateCompatibleDC(pDC->m_hDC);    hBitmapSave = ::CreateCompatibleBitmap(hDCSave, nWidth, nHeight);    HBITMAP hBitmpaSaveOld = (HBITMAP)::SelectObject(hDCSave, hBitmapSave);    //set the colours for the monochrome mask bitmap    COLORREF crOldBack = ::SetBkColor(pDC->m_hDC, RGB(0,0,0));    COLORREF crOldText = ::SetTextColor(pDC->m_hDC, RGB(255,255,255));    ::BitBlt(hDCSave, 0, 0, nWidth, nHeight, pDC->m_hDC, rectClient.left, rectClient.top, SRCCOPY);    ::BitBlt(pDC->m_hDC, 0, 0, nWidth, nHeight, m_hDCBk, 0, 0, SRCCOPY);    ::BitBlt(pDC->m_hDC, 0, 0, nWidth, nHeight, hDCSave, 0, 0, SRCAND);    //restore and clean up    ::SetBkColor(pDC->m_hDC, crOldBack);    ::SetTextColor(pDC->m_hDC, crOldText);    ::SelectObject(hDCSave, hBitmpaSaveOld);    ::DeleteObject(hBitmapSave);    ::DeleteDC(hDCSave);    rectClient = lpcd->rc;    if ((rectClient.bottom - rectClient.top) > (rectClient.right - rectClient.left))        rectClient.InflateRect(1, 0, 1, 0);    else            //is there a better way to know vert from horiz sliders??        rectClient.InflateRect(0, 2, 0, 2);    HBRUSH hbrush = CreateSolidBrush(m_crChannelNormal);    HBRUSH hbOld = (HBRUSH)SelectObject(pDC->m_hDC, hbrush);    DrawEdge(pDC->m_hDC, &rectClient, EDGE_SUNKEN, BF_RECT|BF_ADJUST);    InflateRect(rectClient, 0, 1);    pDC->Rectangle(rectClient);    m_rectChannel = rectClient;    SelectObject(pDC->m_hDC, hbOld);    DeleteObject(hbrush);}void CVolumeSlider::DrawThumb(CDC *pDC, LPNMCUSTOMDRAW lpcd){    //TRACE("[CVolumeSlider::DrawThumb] dc %d\n", pDC->m_hDC);    //draw left part of channel    CRect rectThumb;    GetThumbRect(&rectThumb);    HBRUSH hbrushChannelLeft = CreateSolidBrush(m_crChannelLeft);    HBRUSH hbOld = (HBRUSH)SelectObject(pDC->m_hDC, hbrushChannelLeft);    CRect rectLeftChannel = m_rectChannel;    rectLeftChannel.right = rectThumb.left + 1;    pDC->Rectangle(rectLeftChannel);    InvalidateRect(m_rectChannel);    SelectObject(pDC->m_hDC, hbOld);    DeleteObject(hbrushChannelLeft);    COLORREF col;    if ((lpcd->uItemState & CDIS_SELECTED) || (m_bHoverThumb))        col = m_crThumbSelected;    else        col = m_crThumbNormal;    //    HBRUSH hbrush = CreateSolidBrush(col);    hbOld = (HBRUSH)SelectObject(pDC->m_hDC, hbrush);    Ellipse(pDC->m_hDC, rectThumb.left, rectThumb.top, rectThumb.right, rectThumb.bottom);    SelectObject(pDC->m_hDC, hbOld);    DeleteObject(hbrush);}






0 0
原创粉丝点击