⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 labeledtrackbardisplayitem.cpp

📁 一个WinCE6。0下的IP phone的源代码
💻 CPP
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
#include <windows.h>
#include <commctrl.h>

#define INITGUID
#include <initguid.h>
#include "DisplayItem.hpp"
#undef INITGUID

#include "LabeledTrackBarDisplayItem.hpp"
#include "resource.h"
#include "Layout.hpp"

const UINT c_siLabel    = 0;
const UINT c_siTrackbar = 1;

HRESULT FormatRectForLabeledControl(
    const RECT *prcOriginal,
    RECT *prcAdjust,
    const WCHAR *c_wszLabel
    )
{
    HDC     hdc = CreateCompatibleDC(NULL);
    HRESULT  hr = (hdc != NULL) ?
                    S_OK : 
                    HRESULT_FROM_WIN32(GetLastError());

    if (SUCCEEDED(hr))
    {
        hr = (::DrawText(
            hdc,
            c_wszLabel,
            -1,
            prcAdjust,
            DT_LEFT | DT_WORDBREAK | DT_CALCRECT | DT_NOPREFIX
            )) ?
            S_OK : 
            HRESULT_FROM_WIN32(GetLastError());
    }

    if (SUCCEEDED(hr))
    {
        prcAdjust->left   = prcAdjust->right    + Layout_t::LabeledControlMarginWidth();
        prcAdjust->right  = prcOriginal->right  - Layout_t::LabeledControlMarginWidth();
        prcAdjust->top    = prcOriginal->top    + Layout_t::LabeledControlMarginHeight();
        prcAdjust->bottom = prcOriginal->bottom - Layout_t::LabeledControlMarginHeight();
    }

    DeleteDC(hdc);
    
    return hr;
}

/*------------------------------------------------------------------------------
    LabeledTrackBarDisplayItem_t::LabeledTrackBarDisplayItem_t
    
    Ctor
------------------------------------------------------------------------------*/
LabeledTrackBarDisplayItem_t::LabeledTrackBarDisplayItem_t(
    const WCHAR * c_wszLabel, 
    INT cxDefaultWidth
    )
{   
    PREFAST_ASSERT(c_wszLabel);
    m_wstrText.assign(c_wszLabel);
    
    m_dwCookie = 0;
    m_fCreatedControl = FALSE;
    m_fShutdown       = FALSE;
    m_cxLabelWidth    = cxDefaultWidth;
    
    ZeroMemory(&m_rcPosition, sizeof(m_rcPosition));
}

LabeledTrackBarDisplayItem_t::~LabeledTrackBarDisplayItem_t()
{
}

HRESULT
LabeledTrackBarDisplayItem_t::QueryInterface(
    REFIID riid,
    void** ppvObject
    )
{
    if (!ppvObject)
    {
        return E_INVALIDARG;
    }

    HRESULT hr = S_OK;

    if (riid == IID_IVoIPDisplayControl)
    {
        *ppvObject = (IVoIPDisplayControl*)this;
    }
    else
    {
        *ppvObject = NULL;
        hr = E_NOTIMPL;
    }

    return hr;
}

/*------------------------------------------------------------------------------
    LabeledTrackBarDisplayItem_t::SetTrackbarBoundaries
    
    Sets the boundaries for the trackbar
------------------------------------------------------------------------------*/
HRESULT 
LabeledTrackBarDisplayItem_t::SetTrackbarBoundaries(
    UINT cMin, 
    UINT cMax
    )
{
    if (cMin >= cMax)
    {
        return E_INVALIDARG;
    }
    
    m_cMin = cMin;
    m_cMax = cMax;

    if ((HWND)m_trackbar)
    {
        SendMessage((HWND)m_trackbar, TBM_SETRANGEMIN, FALSE, cMin);
        SendMessage((HWND)m_trackbar, TBM_SETRANGEMAX, FALSE, m_cMax);
    }

    return S_OK;
}

/*------------------------------------------------------------------------------
    LabeledTrackBarDisplayItem_t::GetTrackbarPosition
    
    Gets the position of the slider from the internal trackbar
------------------------------------------------------------------------------*/
INT 
LabeledTrackBarDisplayItem_t::GetTrackbarPosition()
{
    return SendMessage((HWND)m_trackbar, TBM_GETPOS, 0, 0L);
}

/*------------------------------------------------------------------------------
    LabeledTrackBarDisplayItem_t::SetTrackbarPosition
    
    Sets the slider position for the internal trackbar
------------------------------------------------------------------------------*/
HRESULT 
LabeledTrackBarDisplayItem_t::SetTrackbarPosition(UINT cPosition)
{
    m_cPosition = cPosition;
    if ((HWND)m_trackbar)
    {
        SendMessage((HWND)m_trackbar, TBM_SETPOS, TRUE, cPosition);
    }

    return S_OK;
}

/*------------------------------------------------------------------------------
    LabeledTrackBarDisplayItem_t::SetCookie
    
    Set a cookie associated with this item
------------------------------------------------------------------------------*/
HRESULT 
LabeledTrackBarDisplayItem_t::SetCookie(
    DWORD   dwCookie
    )
{
    m_dwCookie = dwCookie;
    return S_OK;
}

/*------------------------------------------------------------------------------
    LabeledTrackBarDisplayItem_t::GetCookie
    
    Get the cookie associated with this item
------------------------------------------------------------------------------*/
DWORD 
LabeledTrackBarDisplayItem_t::GetCookie() const
{
    return m_dwCookie;
}

/*------------------------------------------------------------------------------
    LabeledTrackBarDisplayItem_t::RemoveControls
    
    Removes the internal trackbar
------------------------------------------------------------------------------*/
HRESULT 
LabeledTrackBarDisplayItem_t::RemoveControls()
{
    if (m_fCreatedControl)
    {
        m_fCreatedControl = FALSE;
        m_fShutdown = TRUE;
        m_trackbar.Destroy();
    }

    return S_OK;
}

/*------------------------------------------------------------------------------
    LabeledTrackBarDisplayItem_t::ShowControls
    
    Shows the internal track bar
------------------------------------------------------------------------------*/
HRESULT 
LabeledTrackBarDisplayItem_t::ShowControls(
    BOOL fVisible
    )
{
    if (! m_fCreatedControl || m_fShutdown)
    {
        return S_FALSE;
    }

    (fVisible) ? ShowWindow((HWND)m_trackbar, SW_SHOW)  : ShowWindow((HWND)m_trackbar, SW_HIDE);
    return S_OK;
}

/*------------------------------------------------------------------------------
    LabeledTrackBarDisplayItem_t::PositionControls
    
    Positions the internal trackbar
------------------------------------------------------------------------------*/
HRESULT 
LabeledTrackBarDisplayItem_t::PositionControls(
    HWND   hwndLV,
    RECT * prc
    )
{
    HRESULT hr = S_OK;

    RECT rcDraw = *prc;

    hr = FormatRectForLabeledControl(
            prc, 
            &rcDraw, 
            m_wstrText
            );
    if (FAILED(hr))
    {
        return hr;
    }
        
    if (m_cxLabelWidth != -1)
    {
        rcDraw.left = prc->left + m_cxLabelWidth;
    }

    if (!m_fCreatedControl)
    {
        hr = m_trackbar.Create(
            WNDCLASS_TRACKBAR,
            NULL,
            WS_VISIBLE | WS_CHILD | TBS_AUTOTICKS | TBS_HORZ,
            0,
            hwndLV,
            rcDraw.left,
            rcDraw.top,
            rcDraw.right - rcDraw.left,
            rcDraw.bottom - rcDraw.top
            );

        m_fCreatedControl = SUCCEEDED(hr);
        ShowWindow((HWND)m_trackbar, SW_HIDE);
                
        if (SUCCEEDED(hr))
        {
            m_trackbar.SetCallbackPointer((INT_PTR)this);
            SendMessage((HWND)m_trackbar, TBM_SETRANGEMIN, FALSE, m_cMin);
            SendMessage((HWND)m_trackbar, TBM_SETRANGEMAX, FALSE, m_cMax);
            SendMessage((HWND)m_trackbar, TBM_SETPOS, TRUE, m_cPosition);
        }
    }
    else
    {
        if (memcmp(&m_rcPosition, &rcDraw, sizeof(RECT)) != 0)
        {
            memcpy(&m_rcPosition, &rcDraw, sizeof(RECT));
            hr = MoveWindow(
                m_trackbar,
                rcDraw.left,
                rcDraw.top,
                rcDraw.right - rcDraw.left,
                rcDraw.bottom - rcDraw.top,
                TRUE
                ) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
        }
    }
    
    return hr;
}

/*------------------------------------------------------------------------------
    LabeledTrackBarDisplayItem_t::SetFocus
    
    Sets the focus to the internal trackbar
------------------------------------------------------------------------------*/
BOOL 
LabeledTrackBarDisplayItem_t::SetFocus()
{
    if (m_fCreatedControl && !m_fShutdown)
    {
        ::SetFocus(m_trackbar);
        return TRUE;
    }
    
    return FALSE;
}

/*------------------------------------------------------------------------------
    LabeledTrackBarDisplayItem_t::Draw
    
    Draws the displayitem
------------------------------------------------------------------------------*/
HRESULT 
LabeledTrackBarDisplayItem_t::Draw(
    HDC hdc,
    const RECT *prc,
    BOOL fSelected, 
    BOOL fTopItem
    )
{
    HRESULT     hr = S_OK;
    HFONT       hfntText = PHGetFont(phfStandardText);
    HFONT       hfntOld  = NULL;
    RECT        rcClient = *prc;
    
    hr = DrawBand(
        hdc,
        prc,
        fSelected, 
        fTopItem
        );

    if (SUCCEEDED(hr))
    {
        hfntOld = (HFONT)SelectObject(hdc, hfntText);
        INT bkOld = SetBkMode(hdc, TRANSPARENT);
        INT crOld = SetTextColor(hdc, (fSelected) ? PHGetColor(phcDisplayItemSelectedTextColor): PHGetColor(phcDisplayItemTextColor));
        
        rcClient.left += Layout_t::LabeledControlLabelMarginWidth();
        if (m_wstrText[0])
        {
            if (!::DrawText(
                hdc,
                m_wstrText,
                -1,
                &rcClient,
                DT_BOTTOM | DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX
                ))
            {
                hr = HRESULT_FROM_WIN32(GetLastError());
            }
        }

        SelectObject(hdc, hfntOld);
        SetBkMode   (hdc, bkOld);
        SetTextColor(hdc, crOld);

    }

    return hr;
}

HRESULT 
LabeledTrackBarDisplayItem_t::GetSubItemText(
    UINT idxSubItem, 
    __in_ecount(cchBuffer) WCHAR* wszBuffer, 
    UINT cchBuffer
    )
{
    HRESULT hr = S_FALSE;
#ifdef AUTOMATION

    hr = S_OK;
    switch (idxSubItem)
    {
    case c_siLabel:
        wcsncpy(wszBuffer, m_wstrText, cchBuffer);
        break;

    case c_siTrackbar:
        if (m_fCreatedControl && !m_fShutdown)
        {
            _snwprintf(
                wszBuffer, 
                cchBuffer, 
                L"Value:%d",
                SendMessage((HWND)m_trackbar, TBM_GETPOS, 0, 0L)              
                );
        }
        else
        {
            hr = S_FALSE;
        }
        break;

    default:
        hr = S_FALSE;
        break;
    }
#endif

    wszBuffer[cchBuffer - 1] = 0;
    return hr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -