203 lines
4.9 KiB
C++
203 lines
4.9 KiB
C++
/*---------------------------------------------------------------------------*/
|
|
// Author : hiyohiyo
|
|
// Mail : hiyohiyo@crystalmark.info
|
|
// Web : https://crystalmark.info/
|
|
// License : MIT License
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#include "stdafx.h"
|
|
#include "HeaderCtrlFx.h"
|
|
#include "OsInfoFx.h"
|
|
|
|
IMPLEMENT_DYNAMIC(CHeaderCtrlFx, CHeaderCtrl)
|
|
|
|
CHeaderCtrlFx::CHeaderCtrlFx()
|
|
{
|
|
m_X = 0;
|
|
m_Y = 0;
|
|
|
|
m_TextColor = RGB(0, 0, 0);
|
|
m_LineColor = RGB(224, 224, 224);
|
|
m_BkColor = RGB(255, 255, 255);
|
|
m_ZoomRatio = 1.0;
|
|
m_FontRatio = 1.0;
|
|
m_FontSize = 12;
|
|
m_BkDC = NULL;
|
|
m_CtrlBitmap = NULL;
|
|
m_bHighContrast = FALSE;
|
|
m_bDarkMode = FALSE;
|
|
m_RenderMode = SystemDraw;
|
|
}
|
|
|
|
CHeaderCtrlFx::~CHeaderCtrlFx()
|
|
{
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CHeaderCtrlFx, CHeaderCtrl)
|
|
ON_WM_PAINT()
|
|
ON_MESSAGE(HDM_LAYOUT, OnLayout)
|
|
END_MESSAGE_MAP()
|
|
|
|
void CHeaderCtrlFx::InitControl(int x, int y, double zoomRatio, CDC* bkDC, CBitmap* ctrlBitmap, COLORREF textColor, COLORREF bkColor, COLORREF lineColor, int renderMode, BOOL bHighContrast, BOOL bDarkMode)
|
|
{
|
|
m_X = (int)(x * zoomRatio);
|
|
m_Y = (int)(y * zoomRatio);
|
|
m_ZoomRatio = zoomRatio;
|
|
m_BkDC = bkDC;
|
|
m_TextColor = textColor;
|
|
m_LineColor = lineColor;
|
|
m_BkColor = bkColor;
|
|
|
|
m_CtrlBitmap = ctrlBitmap;
|
|
m_RenderMode = renderMode;
|
|
m_bHighContrast = bHighContrast;
|
|
m_bDarkMode = bDarkMode;
|
|
}
|
|
|
|
void CHeaderCtrlFx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
|
|
{
|
|
if (m_bHighContrast || m_RenderMode & SystemDraw)
|
|
{
|
|
return CHeaderCtrl::DrawItem(lpDrawItemStruct);
|
|
}
|
|
|
|
CDC* drawDC = CDC::FromHandle(lpDrawItemStruct->hDC);
|
|
|
|
drawDC->SetBkMode(TRANSPARENT);
|
|
drawDC->SetTextColor(m_TextColor);
|
|
|
|
CRect clientRect;
|
|
GetClientRect(&clientRect);
|
|
|
|
CDC BkDC;
|
|
BkDC.CreateCompatibleDC(m_BkDC);
|
|
BkDC.SelectObject(m_CtrlBitmap);
|
|
CRect rc = lpDrawItemStruct->rcItem;
|
|
CBrush br;
|
|
|
|
if (m_CtrlBitmap != NULL)
|
|
{
|
|
drawDC->BitBlt(rc.left, rc.top, rc.right, rc.bottom, &BkDC, rc.left, rc.top, SRCCOPY);
|
|
}
|
|
else
|
|
{
|
|
br.CreateSolidBrush(m_BkColor);
|
|
drawDC->FillRect(&rc, &br);
|
|
}
|
|
|
|
br.DeleteObject();
|
|
br.CreateSolidBrush(m_LineColor);
|
|
|
|
CRect rect = lpDrawItemStruct->rcItem;
|
|
rect.left = rect.right - 1;
|
|
drawDC->FillRect(&rect, &br);
|
|
|
|
rect = lpDrawItemStruct->rcItem;
|
|
rect.top = rect.bottom - 1;
|
|
drawDC->FillRect(&rect, &br);
|
|
|
|
HDITEM hi{};
|
|
TCHAR str[256]{};
|
|
hi.mask = HDI_TEXT | HDI_FORMAT;
|
|
hi.pszText = str;
|
|
hi.cchTextMax = 256;
|
|
GetItem(lpDrawItemStruct->itemID, &hi);
|
|
|
|
rect = (CRect)(lpDrawItemStruct->rcItem);
|
|
|
|
if (hi.fmt & HDF_CENTER)
|
|
{
|
|
drawDC->DrawText(hi.pszText, lstrlen(hi.pszText), rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
|
|
}
|
|
else if (hi.fmt & HDF_RIGHT)
|
|
{
|
|
rect.right -= 6;
|
|
drawDC->DrawText(hi.pszText, lstrlen(hi.pszText), rect, DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
|
|
}
|
|
else
|
|
{
|
|
rect.left += 6;
|
|
drawDC->DrawText(hi.pszText, lstrlen(hi.pszText), rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
|
|
}
|
|
}
|
|
|
|
void CHeaderCtrlFx::OnPaint()
|
|
{
|
|
if (m_bHighContrast || m_RenderMode & SystemDraw)
|
|
{
|
|
return CHeaderCtrl::OnPaint();
|
|
}
|
|
|
|
CHeaderCtrl::OnPaint();
|
|
|
|
RECT rectRightItem;
|
|
int iItemCount = Header_GetItemCount(this->m_hWnd);
|
|
if (iItemCount > 0)
|
|
{
|
|
Header_GetItemRect(this->m_hWnd, (WPARAM)iItemCount - 1, &rectRightItem);
|
|
RECT rectClient;
|
|
GetClientRect(&rectClient);
|
|
if (rectRightItem.right < rectClient.right)
|
|
{
|
|
CDC* drawDC = GetDC();
|
|
if (m_CtrlBitmap != NULL)
|
|
{
|
|
CDC BkDC;
|
|
BkDC.CreateCompatibleDC(m_BkDC);
|
|
BkDC.SelectObject(m_CtrlBitmap);
|
|
drawDC->BitBlt(rectRightItem.right, rectClient.top, rectClient.right, rectClient.bottom, &BkDC, rectRightItem.right, rectRightItem.top, SRCCOPY);
|
|
}
|
|
else
|
|
{
|
|
CBrush br;
|
|
br.CreateSolidBrush(m_BkColor);
|
|
rectClient.left = rectRightItem.right;
|
|
drawDC->FillRect(&rectClient, &br);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
LRESULT CHeaderCtrlFx::OnLayout(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LRESULT lResult = CHeaderCtrl::DefWindowProc(HDM_LAYOUT, 0, lParam);
|
|
|
|
if (IsWinXpLuna())
|
|
{
|
|
HD_LAYOUT& hdl = *(HD_LAYOUT*)lParam;
|
|
RECT* prc = hdl.prc;
|
|
WINDOWPOS* pwpos = hdl.pwpos;
|
|
|
|
int nHeight = (int)(pwpos->cy * (m_ZoomRatio * m_FontRatio));
|
|
|
|
pwpos->cy = nHeight;
|
|
prc->top = nHeight;
|
|
}
|
|
|
|
return lResult;
|
|
}
|
|
|
|
void CHeaderCtrlFx::SetFontEx(CString face, int size, double zoomRatio, double fontRatio, LONG fontWeight, BYTE fontRender)
|
|
{
|
|
m_FontSize = size;
|
|
m_ZoomRatio = zoomRatio;
|
|
m_FontRatio = fontRatio;
|
|
|
|
LOGFONT logFont = { 0 };
|
|
logFont.lfCharSet = DEFAULT_CHARSET;
|
|
logFont.lfHeight = (LONG)(-1 * size * zoomRatio * fontRatio);
|
|
logFont.lfQuality = fontRender;
|
|
logFont.lfWeight = fontWeight;
|
|
if (face.GetLength() < 32)
|
|
{
|
|
wsprintf(logFont.lfFaceName, _T("%s"), (LPCTSTR)face);
|
|
}
|
|
else
|
|
{
|
|
wsprintf(logFont.lfFaceName, _T(""));
|
|
}
|
|
|
|
m_Font.DeleteObject();
|
|
m_Font.CreateFontIndirect(&logFont);
|
|
SetFont(&m_Font);
|
|
} |