delete[] g_pBrushes;
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, iMsg, wParam, lParam);
}
return 0;
}
void Diagram(HDC hDC, int x, int y, int r, bool fShadow, const float* pData, const Brush* pBrushes, unsigned int iNumOfPies)
{
HPEN hOldPen, hPen;
char szLabel[BUFSIZ];
int dx, dy;
float e, s;
float k;
unsigned int I;
for (I = 0u, s = 0.0f; I < iNumOfPies; ++i)
s += pData[i];
if (s == 0.0f)
return;
k = (float)(2.0f * M_PI / s);
hPen = CreatePen(PS_SOLID, 2, 0);
hOldPen = (HPEN)SelectObject(hDC, hPen);
for (I = 0u, s = 0.0f; I < iNumOfPies; ++i)
{
e = s + pData[i] * k;
if (I == 1 || I == 3 || I == 6)
{
dx = int(cos((e + s) / 2) * r * 0.25f);
dy = int(sin((e + s) / 2) * r * 0.25f);
}
Else
{
dx = dy = 0;
}
sprintf(szLabel, “%d - %.02f (%.0f%%)”, I + 1u, (float)pData[i], (float)(pData[i] * k * 50.0f / M_PI));
If (fShadow)
DiagramPie(hDC, x + dx, y + dy, r, s, e, 6, 0, NULL);
Else
DiagramPie(hDC, x + dx, y + dy, r, s, e, pBrushes[i].fnStyle, pBrushes[i].clrref, szLabel);
s = e;
}
SelectObject(hDC, hOldPen);
DeleteObject(hPen);
return;
}
void DiagramPie(HDC hDC, int x, int y, int r, float s, float e, int fnStyle, COLORREF clrref, const char* szLabel)
{
HBRUSH hBrush, hOldBrush;
float dx, dy;
float m;
hBrush = CreateHatchBrush(fnStyle, clrref);
hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
Pie(
HDC,
X – r,
Y – r,
x + r,
y + r,
x + int(cosf(e) * r),
y + int(sinf(e) * r),
x + int(cosf(s) * r),
y + int(sinf(s) * r)
);
SelectObject(hDC, hOldBrush);
DeleteObject(hBrush);
if (!szLabel)
return;
m = (e + s) / 2.0f;
dx = cosf(m) * r;
dy = sinf(m) * r;
MoveToEx(
HDC,
x + int(dx * 0.5f),
y + int(dy * 0.5f),
NULL
);
LineTo(
HDC,
x + int(dx * 1.2f),
y + int(dy * 1.2f)
);
TextOut(
HDC,
x + int(dx * 1.25f) + 5,
y + int(dy * 1.25f) – 15,