Files

129 lines
2.9 KiB
C++

/*---------------------------------------------------------------------------*/
// Author : hiyohiyo
// Mail : hiyohiyo@crystalmark.info
// Web : https://crystalmark.info/
// License : MIT License
/*---------------------------------------------------------------------------*/
#include "stdafx.h"
#include "SliderCtrlFx.h"
#include "OsInfoFx.h"
IMPLEMENT_DYNAMIC(CSliderCtrlFx, CSliderCtrl)
CSliderCtrlFx::CSliderCtrlFx()
{
m_X = 0;
m_Y = 0;
m_BkDC = NULL;
m_RenderMode = SystemDraw;
m_bHighContrast = FALSE;
m_bDarkMode = FALSE;
m_bBkBitmapInit = FALSE;
}
CSliderCtrlFx::~CSliderCtrlFx()
{
m_BkBrush.DeleteObject();
}
BEGIN_MESSAGE_MAP(CSliderCtrlFx, CSliderCtrl)
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
BOOL CSliderCtrlFx::InitControl(int x, int y, int width, int height, double zoomRatio, CDC* bkDC, int renderMode, BOOL bHighContrast, BOOL bDarkMode, int min, int max, int pos)
{
m_X = (int)(x * zoomRatio);
m_Y = (int)(y * zoomRatio);
m_CtrlSize.cx = (int)(width * zoomRatio);
m_CtrlSize.cy = (int)(height * zoomRatio);
MoveWindow(m_X, m_Y, m_CtrlSize.cx, m_CtrlSize.cy);
SendMessage(TBM_SETTHUMBLENGTH, m_CtrlSize.cy, 0);
m_BkDC = bkDC;
m_RenderMode = renderMode;
m_bHighContrast = bHighContrast;
m_bDarkMode = bDarkMode;
SetBkReload();
LoadCtrlBk(bkDC);
m_BkBrush.DeleteObject();
if (bDarkMode)
{
// m_BkBrush.CreateSolidBrush(RGB(32, 32, 32));
m_BkBrush.CreatePatternBrush(&m_BkBitmap);
}
else
{
// m_BkBrush.CreateSolidBrush(RGB(255, 255, 255));
m_BkBrush.CreatePatternBrush(&m_BkBitmap);
}
// Range, Pos
SetRange(min, max, TRUE);
SetPos(pos);
Invalidate();
return TRUE;
}
void CSliderCtrlFx::SetBkReload(void)
{
m_bBkBitmapInit = FALSE;
m_bBkLoad = FALSE;
}
void CSliderCtrlFx::LoadCtrlBk(CDC* drawDC)
{
if (m_bHighContrast) { SetBkReload(); return; }
if (m_BkBitmap.m_hObject != NULL)
{
BITMAP bitmapInfo;
m_BkBitmap.GetBitmap(&bitmapInfo);
if (bitmapInfo.bmBitsPixel != drawDC->GetDeviceCaps(BITSPIXEL))
{
SetBkReload();
}
}
if (&m_CtrlBitmap != NULL)
{
if (!m_bBkBitmapInit)
{
m_BkBitmap.DeleteObject();
m_BkBitmap.CreateCompatibleBitmap(drawDC, m_CtrlSize.cx, m_CtrlSize.cy);
m_bBkBitmapInit = TRUE;
}
if (!m_bBkLoad)
{
CBitmap* pOldBitmap;
CDC* pMemDC = new CDC;
pMemDC->CreateCompatibleDC(drawDC);
pOldBitmap = pMemDC->SelectObject(&m_BkBitmap);
pMemDC->BitBlt(0, 0, m_CtrlSize.cx, m_CtrlSize.cy, m_BkDC, m_X, m_Y, SRCCOPY);
pMemDC->SelectObject(pOldBitmap);
pMemDC->DeleteDC();
delete pMemDC;
m_bBkLoad = TRUE;
}
}
}
void CSliderCtrlFx::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_UP)
{
PostMessage(WM_KEYDOWN, VK_RIGHT, nFlags);
return;
}
else if (nChar == VK_DOWN)
{
PostMessage(WM_KEYDOWN, VK_LEFT, nFlags);
return;
}
CSliderCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}