mirror of
https://github.com/voiceip/tinyphone
synced 2026-08-07 02:26:03 -04:00
96 lines
3.1 KiB
C++
96 lines
3.1 KiB
C++
#include "CLevelsSliderCtrl.h"
|
|
|
|
BEGIN_MESSAGE_MAP(CLevelsSliderCtrl, CSliderCtrl)
|
|
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
|
|
END_MESSAGE_MAP()
|
|
|
|
void CLevelsSliderCtrl::OnCustomDraw(NMHDR *pNotifyStruct, LRESULT *result)
|
|
{
|
|
NMCUSTOMDRAW *pNmcd = (NMCUSTOMDRAW *)pNotifyStruct;
|
|
|
|
switch (pNmcd->dwDrawStage) {
|
|
case CDDS_PREPAINT:
|
|
if (GetStyle() & TBS_ENABLESELRANGE) {
|
|
*result = CDRF_NOTIFYITEMDRAW;
|
|
}
|
|
break;
|
|
case CDDS_ITEMPREPAINT:
|
|
switch (pNmcd->dwItemSpec) {
|
|
case TBCD_THUMB: {
|
|
CDC *pDC = CDC::FromHandle(pNmcd->hdc);
|
|
CRect rect = pNmcd->rc;
|
|
int dpiX = GetDeviceCaps(pDC->m_hDC, LOGPIXELSX);
|
|
int dpiY = GetDeviceCaps(pDC->m_hDC, LOGPIXELSY);
|
|
if (GetStyle()&TBS_VERT) {
|
|
rect.DeflateRect(MulDiv(6, dpiX, 96), MulDiv(3, dpiX, 96));
|
|
}
|
|
else {
|
|
rect.DeflateRect(MulDiv(3, dpiX, 96), MulDiv(6, dpiX, 96));
|
|
}
|
|
pDC->FillSolidRect(&rect, RGB(170, 170, 170));
|
|
*result = CDRF_SKIPDEFAULT;
|
|
break;
|
|
}
|
|
case TBCD_CHANNEL: {
|
|
CDC *pDC = CDC::FromHandle(pNmcd->hdc);
|
|
int min, max, selmin, selmax;
|
|
bool hot;
|
|
GetRange(min, max);
|
|
GetSelection(selmin, selmax);
|
|
max -= min;
|
|
CRect rect;
|
|
GetChannelRect(&rect);
|
|
if (GetStyle()&TBS_VERT) {
|
|
hot = selmin <= 0;
|
|
// fix windows bug
|
|
if (rect.right > rect.bottom) {
|
|
rect.left ^= rect.top ^= rect.left ^= rect.top; // swap left and top values
|
|
rect.right ^= rect.bottom ^= rect.right ^= rect.bottom; // swap right and bottom values
|
|
}
|
|
rect.DeflateRect(2, 2);
|
|
selmin = (int)(((double)(selmin - min) / max * rect.Height()) + 0.5) + rect.top;
|
|
selmax = (int)(((double)(selmax - min) / max * rect.Height()) + 0.5) + rect.top;
|
|
if (!IsActive) {
|
|
pDC->FillSolidRect(CRect(rect.left, rect.top, rect.right, rect.bottom), pDC->GetBkColor());
|
|
}
|
|
else {
|
|
pDC->FillSolidRect(CRect(rect.left, rect.top, rect.right, rect.bottom), GetSysColor(COLOR_WINDOW));
|
|
}
|
|
pDC->FillSolidRect(CRect(rect.left, selmin, rect.right, selmax), hot ? RGB(255, 0, 0) : GetSysColor(COLOR_HIGHLIGHT));
|
|
pDC->ExcludeClipRect(rect);
|
|
}
|
|
else {
|
|
hot = selmax >= 100;
|
|
// fix windows bug
|
|
if (rect.bottom > rect.right) {
|
|
rect.left ^= rect.top ^= rect.left ^= rect.top; // swap left and top values
|
|
rect.right ^= rect.bottom ^= rect.right ^= rect.bottom; // swap right and bottom values
|
|
}
|
|
rect.DeflateRect(2, 2);
|
|
selmin = (int)(((double)(selmin - min) / max * rect.Width()) + 0.5) + rect.left;
|
|
selmax = (int)(((double)(selmax - min) / max * rect.Width()) + 0.5) + rect.left;
|
|
if (!IsActive) {
|
|
pDC->FillSolidRect(CRect(rect.left, rect.top, rect.right, rect.bottom), pDC->GetBkColor());
|
|
}
|
|
else {
|
|
pDC->FillSolidRect(CRect(rect.left, rect.top, rect.right, rect.bottom), GetSysColor(COLOR_WINDOW));
|
|
}
|
|
pDC->FillSolidRect(CRect(selmin, rect.top, selmax, rect.bottom), hot ? RGB(255, 0, 0) : GetSysColor(COLOR_HIGHLIGHT));
|
|
pDC->ExcludeClipRect(rect);
|
|
}
|
|
*result = CDRF_DODEFAULT | CDRF_NOTIFYPOSTPAINT;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case CDDS_ITEMPOSTPAINT:
|
|
switch (pNmcd->dwItemSpec) {
|
|
case TBCD_CHANNEL: {
|
|
CDC *pDC = CDC::FromHandle(pNmcd->hdc);
|
|
pDC->SelectClipRgn(NULL);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|