project64/Source/Project64/UserInterface/WTLControls/PartialGroupBox.cpp

112 lines
3.0 KiB
C++
Raw Normal View History

2016-01-27 09:11:59 +00:00
#include "stdafx.h"
BOOL CPartialGroupBox::Attach(HWND hWnd)
{
2021-04-12 11:35:39 +00:00
ATLASSUME(m_hWnd == nullptr);
2016-01-27 09:11:59 +00:00
ATLASSERT(::IsWindow(hWnd));
// Allocate the thunk structure here, where we can fail gracefully
2016-01-27 09:11:59 +00:00
BOOL result = m_thunk.Init(GetWindowProc(), this);
if (result == FALSE)
{
return FALSE;
}
WNDPROC pProc = m_thunk.GetWNDPROC();
WNDPROC pfnWndProc = (WNDPROC)::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)pProc);
2021-04-12 11:35:39 +00:00
if (pfnWndProc == nullptr)
2016-01-27 09:11:59 +00:00
return FALSE;
m_pfnSuperWindowProc = pfnWndProc;
m_hWnd = hWnd;
return TRUE;
}
BOOL CPartialGroupBox::AttachToDlgItem(HWND parent, UINT dlgID)
{
return Attach(::GetDlgItem(parent, dlgID));
}
void CPartialGroupBox::Draw3dLine(CPaintDC & dc, LPCRECT lpRect, COLORREF clrTopLeft, COLORREF /*clrBottomRight*/)
{
int x = lpRect->left;
int y = lpRect->top;
int cx = lpRect->right - lpRect->left;
//int cy = lpRect->bottom - lpRect->top;
dc.FillSolidRect(x, y, cx - 1, 1, clrTopLeft);
//dc.FillSolidRect(x, y, 1, cy - 1, clrTopLeft);
//dc.FillSolidRect(x + cx, y, -1, cy, clrBottomRight);
//dc.FillSolidRect(x, y + cy, cx, -1, clrBottomRight);
}
void CPartialGroupBox::OnPaint(HDC /*hDC*/)
{
CPaintDC dc(m_hWnd);
// Paint group box manually
2016-01-27 09:11:59 +00:00
CRect controlrect;
GetClientRect(controlrect);
//::MapWindowPoints(HWND_DESKTOP, GetParent(), (LPPOINT)(LPRECT)controlrect, (sizeof(RECT)/sizeof(POINT)));
CFontHandle font = GetFont();
dc.SelectFont(font);
dc.SetMapMode(MM_TEXT);
dc.SelectBrush(GetSysColorBrush(COLOR_BTNFACE));
wchar_t grptext[500];
::GetWindowText(m_hWnd, grptext, sizeof(grptext) / sizeof(grptext[0]));
2016-01-27 09:11:59 +00:00
CRect fontsizerect(0, 0, 0, 0);
dc.DrawText(grptext, -1, fontsizerect, DT_SINGLELINE | DT_LEFT | DT_CALCRECT);
2016-01-27 09:11:59 +00:00
CRect framerect(controlrect);
framerect.top += (fontsizerect.Height()) / 2;
long Style = GetStyle();
if ((Style & 0xF000) == BS_FLAT)
{
dc.Draw3dRect(framerect, RGB(0, 0, 0), RGB(0, 0, 0));
framerect.DeflateRect(1, 1);
dc.Draw3dRect(framerect, RGB(255, 255, 255), RGB(255, 255, 255));
}
else
{
Draw3dLine(dc, framerect, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
framerect.DeflateRect(1, 1);
Draw3dLine(dc, framerect, GetSysColor(COLOR_3DHILIGHT), GetSysColor(COLOR_3DSHADOW));
}
if (wcslen(grptext))
{
CRect fontrect(controlrect);
fontrect.bottom = controlrect.top + fontsizerect.Height();
if ((Style & 0xF00) == BS_RIGHT)
{
fontrect.right -= 6;
fontrect.left = fontrect.right - fontsizerect.Width();
}
else if ((Style & 0xF00) == BS_CENTER)
{
fontrect.left += (controlrect.Width() - fontsizerect.Width()) / 2;
fontrect.right = fontrect.left + fontsizerect.Width();
}
else //BS_LEFT or default
{
fontrect.left += 6;
fontrect.right = fontrect.left + fontsizerect.Width();
}
fontrect.InflateRect(2, 0);
dc.FillRect(fontrect, GetSysColor(COLOR_BTNFACE));
fontrect.DeflateRect(2, 0);
// Draw caption
2016-01-27 09:11:59 +00:00
dc.SetBkMode(OPAQUE);
dc.SetBkColor(GetSysColor(COLOR_BTNFACE));
dc.DrawText(grptext, -1, fontrect, DT_SINGLELINE | DT_LEFT);
2016-01-27 09:11:59 +00:00
}
}