145 lines
3.6 KiB
C++
145 lines
3.6 KiB
C++
|
#include "main.h"
|
||
|
#include ".\infoBox.h"
|
||
|
|
||
|
|
||
|
MLInfoBox::MLInfoBox(void)
|
||
|
{
|
||
|
oldWndProc = NULL;
|
||
|
m_hwnd = NULL;
|
||
|
bodyBrush = NULL;
|
||
|
headerBrush = NULL;
|
||
|
headerText[0] = 0;
|
||
|
|
||
|
SetColors(RGB(0,0,0), RGB(255,255,255), RGB(0,60,0));
|
||
|
|
||
|
SetRect(&rcBody, 0,0,0,0);
|
||
|
|
||
|
drawHeader = TRUE;
|
||
|
SetRect(&rcHeader, 0,0,0,20); // default height
|
||
|
|
||
|
headerFont = NULL;
|
||
|
|
||
|
}
|
||
|
MLInfoBox::~MLInfoBox(void)
|
||
|
{
|
||
|
SetWindowLong(m_hwnd, GWLP_WNDPROC, (LONGX86)(LONG_PTR)oldWndProc);
|
||
|
oldWndProc = NULL;
|
||
|
|
||
|
if (headerBrush) DeleteObject(headerBrush);
|
||
|
headerBrush = NULL;
|
||
|
|
||
|
if (bodyBrush) DeleteObject(bodyBrush);
|
||
|
bodyBrush = NULL;
|
||
|
|
||
|
if (headerFont) DeleteObject(headerFont);
|
||
|
headerFont = NULL;
|
||
|
|
||
|
}
|
||
|
|
||
|
void MLInfoBox::SetColors(COLORREF bodyBG, COLORREF headerFG, COLORREF headerBG)
|
||
|
{
|
||
|
this->bodyBG = bodyBG;
|
||
|
this->headerFG = headerFG;
|
||
|
this->headerBG = headerBG;
|
||
|
|
||
|
if (headerBrush) DeleteObject(headerBrush);
|
||
|
headerBrush = NULL;
|
||
|
headerBrush = CreateSolidBrush(headerBG);
|
||
|
|
||
|
if (bodyBrush) DeleteObject(bodyBrush);
|
||
|
bodyBrush = NULL;
|
||
|
bodyBrush = CreateSolidBrush(bodyBG);
|
||
|
|
||
|
}
|
||
|
|
||
|
void MLInfoBox::Init(HWND hwnd)
|
||
|
{
|
||
|
m_hwnd = hwnd;
|
||
|
|
||
|
HDC hdc = GetDC(hwnd);
|
||
|
long lfHeight;
|
||
|
lfHeight = -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72);
|
||
|
headerFont = CreateFontW(lfHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Arial");
|
||
|
ReleaseDC(hwnd, hdc);
|
||
|
|
||
|
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONGX86)(LONG_PTR)this);
|
||
|
oldWndProc= (WNDPROC)(LONG_PTR)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONGX86)(LONG_PTR)newWndProc);
|
||
|
RECT rc;
|
||
|
GetWindowRect(hwnd, &rc);
|
||
|
SetSize(rc.right - rc.left, rc.bottom - rc.top);
|
||
|
}
|
||
|
|
||
|
void MLInfoBox::SetSize(int cx, int cy)
|
||
|
{
|
||
|
int offset = 0;
|
||
|
if (drawHeader)
|
||
|
{
|
||
|
SetRect(&rcHeader, 0,0, cx, rcHeader.bottom);
|
||
|
offset = rcHeader.bottom;
|
||
|
}
|
||
|
SetRect(&rcBody, 0, offset, cx, cy);
|
||
|
}
|
||
|
LRESULT CALLBACK MLInfoBox::newWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
||
|
{
|
||
|
MLInfoBox *box = (MLInfoBox*)(LONG_PTR)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
|
||
|
|
||
|
switch(uMsg)
|
||
|
{
|
||
|
case WM_SIZE:
|
||
|
if (SIZE_MINIMIZED != wParam)
|
||
|
{
|
||
|
box->SetSize(LOWORD(lParam), HIWORD(lParam));
|
||
|
}
|
||
|
break;
|
||
|
case WM_ERASEBKGND:
|
||
|
{
|
||
|
HDC hdc = GetDC(hwndDlg);
|
||
|
SetTextColor(hdc, box->headerFG);
|
||
|
SetBkColor(hdc, box->headerBG);
|
||
|
RECT txtRect;
|
||
|
SetRect(&txtRect, box->rcHeader.left + 8, box->rcHeader.top + 2, box->rcHeader.right -2, box->rcHeader.bottom -2);
|
||
|
HFONT oldFont = (HFONT)SelectObject(hdc, box->headerFont);
|
||
|
GetWindowTextW(hwndDlg, box->headerText, CAPTION_LENGTH);
|
||
|
DrawTextW(hdc, box->headerText, -1, &txtRect, DT_VCENTER | DT_LEFT | DT_SINGLELINE);
|
||
|
SelectObject(hdc, oldFont);
|
||
|
ReleaseDC(hwndDlg, hdc);
|
||
|
}
|
||
|
return TRUE;
|
||
|
|
||
|
|
||
|
break;
|
||
|
case WM_PAINT:
|
||
|
{
|
||
|
PAINTSTRUCT pt;
|
||
|
HDC hdc = BeginPaint(hwndDlg, &pt);
|
||
|
RECT drawRect ;
|
||
|
if(box->drawHeader && IntersectRect(&drawRect, &box->rcHeader, &pt.rcPaint))
|
||
|
{
|
||
|
FillRect(hdc, &drawRect, box->headerBrush);
|
||
|
|
||
|
SetTextColor(hdc, box->headerFG);
|
||
|
SetBkColor(hdc, box->headerBG);
|
||
|
SetRect(&drawRect, box->rcHeader.left + 8, box->rcHeader.top + 2, box->rcHeader.right -2, box->rcHeader.bottom -2);
|
||
|
HFONT oldFont = (HFONT)SelectObject(hdc, box->headerFont);
|
||
|
GetWindowTextW(hwndDlg, box->headerText, CAPTION_LENGTH);
|
||
|
DrawTextW(hdc, box->headerText, -1, &drawRect, DT_VCENTER | DT_LEFT | DT_SINGLELINE);
|
||
|
SelectObject(hdc, oldFont);
|
||
|
ValidateRect(hwndDlg, &drawRect);
|
||
|
}
|
||
|
|
||
|
|
||
|
if(IntersectRect(&drawRect, &box->rcBody, &pt.rcPaint))
|
||
|
{
|
||
|
FillRect(hdc, &drawRect, box->bodyBrush);
|
||
|
ValidateRect(hwndDlg, &drawRect);
|
||
|
}
|
||
|
|
||
|
EndPaint(hwndDlg, &pt);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return CallWindowProc(box->oldWndProc, hwndDlg, uMsg, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
|