Files

135 lines
3.7 KiB
C++

/*---------------------------------------------------------------------------*/
// Author : hiyohiyo
// Mail : hiyohiyo@crystalmark.info
// Web : https://crystalmark.info/
// License : MIT License
/*---------------------------------------------------------------------------*/
#include "stdafx.h"
#include "FontComboBoxFx.h"
////------------------------------------------------
// CFontComboBox
////------------------------------------------------
IMPLEMENT_DYNAMIC(CFontComboBox, CComboBoxFx)
CFontComboBox::CFontComboBox()
{
m_Brush = NULL;
}
CFontComboBox::~CFontComboBox()
{
m_BkBrush.DeleteObject();
}
BEGIN_MESSAGE_MAP(CFontComboBox, CComboBoxFx)
END_MESSAGE_MAP()
void CFontComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (lpDrawItemStruct->itemID == -1) { return; }
static COLORREF textColor;
static COLORREF textColorSelected;
static COLORREF bkColor;
static COLORREF bkColorSelected;
if (m_bHighContrast)
{
textColor = GetTextColor(lpDrawItemStruct->hDC);
textColorSelected = RGB(0, 0, 0);
bkColor = GetBkColor(lpDrawItemStruct->hDC);
bkColorSelected = RGB(0, 255, 255);
if (bkColor <= RGB(0x80, 0x80, 0x80)) { textColor = RGB(255, 255, 255); }
else { textColor = RGB(0, 0, 0); }
}
else if (m_bDarkMode)
{
textColor = RGB(255, 255, 255);
textColorSelected = RGB(255, 255, 255);
bkColor = RGB(32, 32, 32);
bkColorSelected = RGB(77, 77, 77);
}
else
{
textColor = m_TextColor;
textColorSelected = m_TextColorSelected;
bkColor = m_BkColor;
bkColorSelected = m_BkColorSelected;
}
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
LoadCtrlBk(pDC);
CString title;
GetLBText(lpDrawItemStruct->itemID, title);
CFont font;
LOGFONT logfont;
memset(&logfont, 0, sizeof(logfont));
logfont.lfHeight = m_FontHeight;
logfont.lfWidth = 0;
logfont.lfWeight = FW_NORMAL;
logfont.lfQuality = m_FontRender;
logfont.lfCharSet = DEFAULT_CHARSET;
#if _MSC_VER <= 1310
_tcscpy(logfont.lfFaceName, (LPCTSTR)title);
#else
_tcscpy_s(logfont.lfFaceName, 32, (LPCTSTR)title);
#endif
font.CreateFontIndirect(&logfont);
HGDIOBJ oldFont = pDC->SelectObject(&font);
CBrush Brush;
CBrush* pOldBrush;
if (lpDrawItemStruct->rcItem.left != 0 && !m_bHighContrast)
{
DrawControl(title, pDC, lpDrawItemStruct, m_CtrlBitmap, m_BkBitmap, ControlImageNormal);
Brush.CreateSolidBrush(bkColorSelected);
pOldBrush = pDC->SelectObject(&Brush);
if (lpDrawItemStruct->itemState & ODS_SELECTED)
{
RECT rc = lpDrawItemStruct->rcItem;
// rc.top = (LONG)(rc.bottom - 2 * m_ZoomRatio);
rc.right = (LONG)(rc.left + 3 * m_ZoomRatio);
FillRect(lpDrawItemStruct->hDC, &rc, (HBRUSH)Brush);
}
DrawString(title, pDC, lpDrawItemStruct, textColor);
#if _MSC_VER <= 1310
if (IsNT3() && IsWindowEnabled())
{
DWORD oldTextAlign = m_TextAlign;
HGDIOBJ myoldFont = pDC->SelectStockObject(SYSTEM_FONT);
m_TextAlign = ES_RIGHT;
DrawString(_T("v"), pDC, lpDrawItemStruct, textColor);
m_TextAlign = oldTextAlign;
pDC->SelectObject(myoldFont);
}
#endif
}
else
{
if (lpDrawItemStruct->itemState & ODS_SELECTED)
{
Brush.CreateSolidBrush(bkColorSelected);
pOldBrush = pDC->SelectObject(&Brush);
FillRect(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem, (HBRUSH)Brush);
DrawString(title, pDC, lpDrawItemStruct, textColorSelected);
}
else
{
Brush.CreateSolidBrush(bkColor);
pOldBrush = pDC->SelectObject(&Brush);
FillRect(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem, (HBRUSH)Brush);
DrawString(title, pDC, lpDrawItemStruct, textColor);
}
}
pDC->SelectObject(pOldBrush);
Brush.DeleteObject();
pDC->SelectObject(oldFont);
}