2025-11-28 00:35:46 +09:00

165 lines
4.3 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 "Renderer.h"
#include <propvarutil.h>
#define SHAPE_MARGIN 5
COLORREF CRenderer::s_aColors[3] = {
RGB(255, 0, 0), // Red
RGB(0, 255, 0), // Green
RGB(0, 0, 255), // Blue
};
void CRenderer::Initialize(HWND hWnd)
{
m_hWnd = hWnd;
}
void CRenderer::GetRenderParam(__in RenderParam *pParameter)
{
if (pParameter != NULL)
{
*pParameter = m_param;
}
}
void CRenderer::UpdateRenderParam(RenderParam parameter)
{
m_param = parameter;
InvalidateRect(m_hWnd, NULL, TRUE);
}
void CRenderer::DrawShapes(HDC hdc, RECT& rect)
{
SHAPE_TYPE eShapeType = m_param.eShapeType;
int nCount = m_param.eViewLayout + 1;
SIZE size;
size.cx = rect.right - rect.left;
size.cy = rect.bottom - rect.top;
HBRUSH hBrush = CreateSolidBrush(s_aColors[m_param.eShapeColor]);
HGDIOBJ hOldBrush = ::SelectObject(hdc, hBrush);
int nPenStyle;
int nBorderSize = m_param.uBorderSize;
switch (m_param.eBorderStyle)
{
case DASH:
nPenStyle = PS_DASH;
nBorderSize = 1;// Dash pen only works with a width of 1
break;
case SOLID:
nPenStyle = PS_SOLID;
break;
default:
nPenStyle = PS_NULL;
break;
}
HPEN hPen = CreatePen(nPenStyle, nBorderSize, RGB(0, 0, 0));
HGDIOBJ hOldPen = ::SelectObject(hdc, hPen);
// Pick up the shorter length.
int nLength = ( size.cx < size.cy ? size.cx : size.cy) / nCount;
// Take margin into count
nLength -= SHAPE_MARGIN;
if (nLength > 0)
{
// Now scale the length based on the parameter
nLength = nLength * (m_param.eShapeSize + 1) / 3;
}
else
{
nLength = 0;
}
for (int i = 0; i < nCount ; i++)
{
for (int j = 0; j < nCount ; j++)
{
POINT ptCenter;
ptCenter.y = rect.top + (2 * i + 1) * size.cy / (2 * nCount);
ptCenter.x = rect.left + (2 * j + 1) * size.cx / (2 * nCount);
switch (eShapeType)
{
case RECTANGLE:
case ROUNDED_RECTANGLE:
DrawRectangle(hdc, ptCenter, nLength, eShapeType == ROUNDED_RECTANGLE);
break;
case ELLIPSE:
DrawEllipse(hdc, ptCenter, nLength);
break;
case DIAMOND:
DrawDiamond(hdc, ptCenter, nLength);
break;
}
}
}
SelectObject(hdc, hOldPen);
SelectObject(hdc, hOldBrush);
DeleteObject(hPen);
DeleteObject(hBrush);
}
void CRenderer::DrawRectangle(HDC hdc, POINT& ptCenter, int nBoundingBoxLength, BOOL fIsRounded)
{
if (fIsRounded)
{
int nRoundLength = nBoundingBoxLength / 10;
if (nRoundLength < 2)
{
nRoundLength = 2;
}
RoundRect(hdc, ptCenter.x - nBoundingBoxLength / 2, ptCenter.y - nBoundingBoxLength / 2,
ptCenter.x + nBoundingBoxLength / 2, ptCenter.y + nBoundingBoxLength / 2,
nRoundLength, nRoundLength);
}
else
{
Rectangle(hdc, ptCenter.x - nBoundingBoxLength / 2, ptCenter.y - nBoundingBoxLength / 2,
ptCenter.x + nBoundingBoxLength / 2, ptCenter.y + nBoundingBoxLength / 2);
}
}
void CRenderer::DrawEllipse(HDC hdc, POINT& ptCenter, int nBoundingBoxLength)
{
Ellipse(hdc, ptCenter.x - nBoundingBoxLength / 2, ptCenter.y - nBoundingBoxLength / 2,
ptCenter.x + nBoundingBoxLength / 2, ptCenter.y + nBoundingBoxLength / 2);
}
void CRenderer::DrawDiamond(HDC hdc, POINT& ptCenter, int nBoundingBoxLength)
{
POINT pt[4];
int nLength = nBoundingBoxLength / 2;
pt[0].x = ptCenter.x;
pt[0].y = ptCenter.y - nLength;
pt[1].x = ptCenter.x - nLength;
pt[1].y = ptCenter.y;
pt[2].x = ptCenter.x;
pt[2].y = ptCenter.y + nLength;
pt[3].x = ptCenter.x + nLength;
pt[3].y = ptCenter.y;
Polygon(hdc, pt, _countof(pt));
}