tinyphone/microsip/CLevelsSliderCtrl.cpp
2018-11-21 15:32:29 +05:30

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;
}
}