Windows-classic-samples/Samples/DynamicDPI/cpp/SampleCustomColorFontButton.cpp
2025-11-28 00:35:46 +09:00

160 lines
4.9 KiB
C++

//// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
//// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
//// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
//// PARTICULAR PURPOSE.
////
//// Copyright (c) Microsoft Corporation. All rights reserved
#include "pch.h"
#include "SampleCustomColorFontButton.h"
using namespace std;
using namespace Microsoft::WRL;
using namespace D2D1;
CSampleCustomColorFontButton::CSampleCustomColorFontButton(void) :
CSampleHoverElement(),
m_pressed(false),
m_size(18.0F)
{
}
CSampleCustomColorFontButton::CSampleCustomColorFontButton(float left, float top, float size, CustomGlyphId id) :
CSampleHoverElement(),
m_pressed(false),
m_size(size)
{
m_left = left;
m_top = top;
// The custom font 'ColorToolbarIcons' defines a set code points in the private range starting at 0xE000.
// The 'CustomGlphyId' enum provides mnemonics for the defined icons. This code converts enum to the appropriate
// code point. glyphs[1] is set to 0x0000 to null terminate the string so it can properly be used to generate a wstring.
wchar_t glyphs[2];
glyphs[0] = 0xE000 + static_cast<wchar_t>(id);
glyphs[1] = 0x0000;
m_text = wstring(glyphs);
}
CSampleCustomColorFontButton::~CSampleCustomColorFontButton(void)
{
ReleaseDeviceIndependentResources();
}
void CSampleCustomColorFontButton::SetClickHandler(function<void ()> handler)
{
m_mouseClickedFunction = handler;
}
void CSampleCustomColorFontButton::CreateDeviceIndependentResources(const std::shared_ptr<DeviceResources>& deviceResources)
{
CSampleHoverElement::CreateDeviceIndependentResources(deviceResources);
auto dwriteFactory = m_deviceResources->GetDWriteFactory();
DX::ThrowIfFailed(
dwriteFactory->CreateTextFormat(
L"Color Toolbar Icons",
m_deviceResources->GetFontCollection(),
DWRITE_FONT_WEIGHT_LIGHT,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
m_size,
L"en-us",
&m_textFormat
)
);
ComPtr<IDWriteTextFormat1> textFormat;
DX::ThrowIfFailed(m_textFormat.As(&textFormat));
DX::ThrowIfFailed(textFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING));
DX::ThrowIfFailed(textFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_NEAR));
}
void CSampleCustomColorFontButton::ReleaseDeviceIndependentResources()
{
m_textFormat.Reset();
m_textLayout.Reset();
CSampleHoverElement::ReleaseDeviceIndependentResources();
}
void CSampleCustomColorFontButton::CreateDeviceResources()
{
CSampleHoverElement::CreateDeviceResources();
DX::ThrowIfFailed(m_deviceResources->GetD2DDeviceContext()->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black), &m_blackBrush));
}
void CSampleCustomColorFontButton::ReleaseDeviceResources()
{
m_blackBrush.Reset();
//Important: without this bad leaks can happen via captured sceneelements holding on to sceneEngines.
m_mouseClickedFunction = nullptr;
CSampleHoverElement::ReleaseDeviceResources();
}
void CSampleCustomColorFontButton::DoDraw()
{
if (!m_textLayout)
{
DX::ThrowIfFailed(
m_deviceResources->GetDWriteFactory()->CreateTextLayout(
m_text.c_str(),
static_cast<unsigned int>(m_text.length()),
m_textFormat.Get(),
m_size * m_text.length() * 2.0f,
m_size * 2.0f,
&m_textLayout
)
);
// Set the rectangle of the button to tightly contain the text.
DWRITE_TEXT_METRICS metrics = { 0 };
DX::ThrowIfFailed(m_textLayout->GetMetrics(&metrics));
m_width = metrics.width + 6.0f;
m_height = metrics.height + 6.0f;
}
CSampleHoverElement::DoDraw();
auto context = m_deviceResources->GetD2DDeviceContext();
if (m_pressed == false)
{
context->DrawTextLayout(
Point2F(m_left + 3.0f, m_top + 3.0F),
m_textLayout.Get(),
m_blackBrush.Get(),
D2D1_DRAW_TEXT_OPTIONS::D2D1_DRAW_TEXT_OPTIONS_CLIP | D2D1_DRAW_TEXT_OPTIONS::D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT
);
}
else
{
context->FillRectangle(
D2D1::RectF(m_left, m_top, m_left + m_width, m_top + m_height),
m_defaultBrush.Get()
);
context->DrawTextLayout(
Point2F(m_left + 3.0f, m_top + 3.0F),
m_textLayout.Get(),
m_blackBrush.Get(),
D2D1_DRAW_TEXT_OPTIONS::D2D1_DRAW_TEXT_OPTIONS_CLIP | D2D1_DRAW_TEXT_OPTIONS::D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT
);
}
}
void CSampleCustomColorFontButton::OnPointerDown(float /* x */, float /* y */)
{
m_pressed = true;
}
void CSampleCustomColorFontButton::OnPointerUp(float /* x */, float /* y */)
{
m_pressed = false;
if (m_mouseClickedFunction)
{
m_mouseClickedFunction();
}
}