播放器中的声音控件
来源:互联网 发布:冰点软件干嘛的 编辑:程序博客网 时间: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
- 播放器中的声音控件
- bcb中的播放声音操作
- java应用程序中的声音播放
- Java应用程序中的声音播放
- 播放器的声音
- 播放器声音控制
- 游戏中的声音播放(1)
- 游戏中的声音播放(2)
- IE 播放器没有声音。
- mplayer播放器,没有声音.
- iOS 音乐 播放器 声音
- 播放声音
- 播放声音
- 播放声音
- 播放声音
- 播放声音
- 维修经验:播放器没有声音,但系统有声音
- JavaME 声音播放器的使用
- java基础-------闭包和回调
- POJ 1093 Formatting Text(DP)
- POJ 3259 Wormholes Bellman-Ford找负环
- android 对listview数据的增删改查
- hdoj 1010 Tempter of the Bone (DFS + 剪枝)
- 播放器中的声音控件
- 14.4手机号码归属地查询
- 正则表达式
- Android动态加载页面的几种方法
- Linux 系统更新命令行模式,出错原因,软件更新器更新失败,系统提示已为最新版本,问题如何解决
- Hadoop学习总结
- Mysql 锁表 for update (引擎/事务)
- HiveQL:对数据定义的学习
- 权限