65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.53/5 (16投票s)

2004年7月24日

viewsIcon

81073

downloadIcon

5807

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

Sample Image - CoolSlider.gif

引言

你喜欢 Windows Media Player 9.0 中的炫酷滑块吗?是的!!

让我们按照本文档来构建它。

使用的自定义类

  • CBitItem

    不继承自任何类。管理位图资源,一个或多个位图。

  • CBitWnd

    继承自 CWnd。管理所有者绘制的位图窗口。

  • CBitSlider

    继承自 CSliderCtrl。管理所有者绘制的位图滑块。

顺便说一句

CBitItemCBitWnd 是任何希望创建位图所有者绘制窗口的通用工具类...

示例演示代码

步骤 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

  • 待续...
© . All rights reserved.