像 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。 
- 待续...
