📄 labeledtrackbardisplayitem.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 + -