像 Media Player 那样的炫酷位图滑块...






3.53/5 (16投票s)
2004年7月24日

81073

5807
像 Windows Media Player 那样的炫酷位图滑块。
引言
你喜欢 Windows Media Player 9.0 中的炫酷滑块吗?是的!!
让我们按照本文档来构建它。
使用的自定义类
CBitItem
不继承自任何类。管理位图资源,一个或多个位图。
CBitWnd
继承自
CWnd
。管理所有者绘制的位图窗口。CBitSlider
继承自
CSliderCtrl
。管理所有者绘制的位图滑块。
顺便说一句
CBitItem
和 CBitWnd
是任何希望创建位图所有者绘制窗口的通用工具类...
示例演示代码
步骤 1:从操作系统获取手型光标
HCURSOR CCoolSliderDlg::GetSysHandCursor() { TCHAR strWinDir[MAX_PATH] = {0}; HCURSOR hHandCursor = NULL; hHandCursor = ::LoadCursor(NULL, MAKEINTRESOURCE(32649)); // Still no cursor handle - load the WinHelp hand cursor if( hHandCursor == NULL ) { GetWindowsDirectory(strWinDir, MAX_PATH); strcat(strWinDir, _T("\\winhlp32.exe")); // This retrieves cursor #106 from winhlp32.exe, // which is a hand pointer HMODULE hModule = ::LoadLibrary(strWinDir); DWORD dwErr = GetLastError(); if( hModule != NULL ) { HCURSOR hTempCur = ::LoadCursor(hModule, MAKEINTRESOURCE(106)); hHandCursor = (hTempCur != NULL) ? CopyCursor(hTempCur) : NULL; FreeLibrary(hModule); } } return hHandCursor; }
步骤 2:使用独占位图资源构建炫酷滑块
void CCoolSliderDlg::BuildCoolSlider() { m_hHandCur = this->GetSysHandCursor(); ASSERT( m_hHandCur != NULL ); m_ctlSlider.SetFlipCursor(m_hHandCur); m_ctlSlider.BuildThumbItem(IDB_BITMAP_THUMB, 6, 12); m_ctlSlider.BuildBackItem(IDB_BITMAP_NORMAL, IDB_BITMAP_ACTIVE); m_ctlSlider.SetTopOffset(3); m_ctlSlider.SetRange(0, 100); m_ctlSlider.SetLineSize(0); m_ctlSlider.SetPos(20); }
步骤 3:使用共享位图资源构建一些炫酷滑块(3 个滑块使用相同的位图资源)
void CCoolSliderDlg::BuildShareSlider() { ASSERT( m_hHandCur != NULL ); ASSERT( m_lpActive == NULL ); ASSERT( m_lpNormal == NULL ); ASSERT( m_lpThumb == NULL ); m_lpActive = new CBitItem(IDB_BITMAP_ACTIVE, 0, 0); m_lpNormal = new CBitItem(IDB_BITMAP_NORMAL, 0, 0); m_lpThumb = new CBitItem(IDB_BITMAP_THUMB, 6, 12); m_ctlShare1.SetFlipCursor(m_hHandCur); m_ctlShare1.BuildThumbItem(m_lpThumb); m_ctlShare1.BuildBackItem(m_lpNormal, m_lpActive); m_ctlShare1.SetTopOffset(3); m_ctlShare1.SetRange(0, 100); m_ctlShare1.SetLineSize(0); m_ctlShare1.SetPos(40); m_ctlShare2.SetFlipCursor(m_hHandCur); m_ctlShare2.BuildThumbItem(m_lpThumb); m_ctlShare2.BuildBackItem(m_lpNormal, m_lpActive); m_ctlShare2.SetTopOffset(3); m_ctlShare2.SetRange(0, 100); m_ctlShare2.SetLineSize(0); m_ctlShare2.SetPos(60); m_ctlShare3.SetFlipCursor(m_hHandCur); m_ctlShare3.BuildThumbItem(m_lpThumb); m_ctlShare3.BuildBackItem(m_lpNormal, m_lpActive); m_ctlShare3.SetTopOffset(3); m_ctlShare3.SetRange(0, 100); m_ctlShare3.SetLineSize(0); m_ctlShare3.SetPos(80); }
步骤 4:使用滑块位图的背景色擦除对话框背景
BOOL CCoolSliderDlg::OnEraseBkgnd(CDC* pDC) { CRect rcRect; this->GetClientRect(rcRect); pDC->FillSolidRect(rcRect, RGB(96, 123, 189)); return TRUE; }
步骤 5:在程序退出时释放所有已分配的资源
CCoolSliderDlg::~CCoolSliderDlg() { if( m_lpNormal != NULL ) { delete m_lpNormal; m_lpNormal = NULL; } if( m_lpActive != NULL ) { delete m_lpActive; m_lpActive = NULL; } if( m_lpThumb != NULL ) { delete m_lpThumb; m_lpThumb = NULL; } }
想了解更多细节吗?请查看演示项目!!
错误报告或评论,请联系我:Jackey。
享受吧!!
历史
- 07/24/2004
第一个版本... (仅支持水平滑块:))
- 07/25/2004
添加了垂直滑块支持,感谢 PJ Arends。
- 待续...