winamp/Src/Plugins/General/gen_ml/skinneddivider.cpp
2024-09-24 14:54:57 +02:00

128 lines
No EOL
3.2 KiB
C++

#include "./skinneddivider.h"
#include "../winamp/wa_dlg.h"
#include "./skinning.h"
SkinnedDivider::SkinnedDivider(void) : SkinnedWnd(FALSE)
{
callback = NULL;
userParam = 0L;
clickoffs = 0;
}
SkinnedDivider::~SkinnedDivider(void)
{
}
BOOL SkinnedDivider::Attach(HWND hwndDivider)
{
if(!SkinnedWnd::Attach(hwndDivider)) return FALSE;
SetType(SKINNEDWND_TYPE_DIVIDER);
SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
return TRUE;
}
BOOL SkinnedDivider::OnMediaLibraryIPC(INT msg, INT_PTR param, LRESULT *pResult)
{
switch(msg)
{
case ML_IPC_SKINNEDDIVIDER_SETCALLBACK:
if ( 0 != param)
{
callback = ((MLDIVIDERCALLBACK*)param)->fnCallback;
userParam = ((MLDIVIDERCALLBACK*)param)->userParam;
}
else { callback = NULL; userParam= 0L;}
return TRUE;
}
return __super::OnMediaLibraryIPC(msg, param, pResult);
}
void SkinnedDivider::OnPaint(void)
{
PAINTSTRUCT ps;
RECT rc, rh;
HDC hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rc);
SetBkColor(hdc, WADlg_getColor(WADLG_WNDBG));
if (SWDIV_NOHILITE & style)
{
ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rc, L"", 0, NULL);
}
else
{
int l;
HPEN pen = (HPEN)MlStockObjects_Get(HILITE_PEN),
penOld = (HPEN)SelectObject(hdc, pen);
if (SWDIV_VERT & style)
{
l = (rc.right - rc.left)/2 - 1;
SetRect(&rh, ps.rcPaint.left, ps.rcPaint.top, l, ps.rcPaint.bottom);
if (rh.left < rh.right) ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rh, L"", 0, 0);
SetRect(&rh, l + 1, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom);
if (rh.left < rh.right) ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rh, L"", 0, 0);
MoveToEx(hdc, l, rc.top, NULL);
LineTo(hdc, l, rc.bottom);
}
else
{
l = (rc.bottom - rc.top)/2 - 1;
SetRect(&rh, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, l);
if (rh.top < rh.bottom) ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rh, L"", 0, 0);
SetRect(&rh, ps.rcPaint.left, l + 1, ps.rcPaint.right, ps.rcPaint.bottom);
if (rh.left < rh.right) ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rh, L"", 0, 0);
MoveToEx(hdc, rc.left, l, NULL);
LineTo(hdc, rc.right, l);
}
SelectObject(hdc, penOld);
}
EndPaint(hwnd, &ps);
}
LRESULT SkinnedDivider::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_NCHITTEST: return HTCLIENT;
case WM_ERASEBKGND: return 0;
case WM_PAINT: OnPaint(); return 0;
case WM_LBUTTONDOWN:
clickoffs = (SWDIV_VERT & style) ? LOWORD(lParam) : HIWORD(lParam);
SetCapture(hwnd);
break;
case WM_LBUTTONUP:
ReleaseCapture();
clickoffs = 0;
break;
case WM_SETCURSOR:
SetCursor(LoadCursor(NULL, (SWDIV_VERT & style) ? IDC_SIZEWE : IDC_SIZENS));
return TRUE;
case WM_MOUSEMOVE:
if (GetCapture() == hwnd)
{
RECT rw;
BOOL vert = (SWDIV_VERT & style);
GetWindowRect(hwnd, &rw);
GetCursorPos(((LPPOINT)&rw) + 1);
(SWDIV_VERT & style) ? rw.right -= clickoffs : rw.bottom -= clickoffs;
if ((vert && rw.left != rw.right) || (!vert && rw.top != rw.bottom))
{
MapWindowPoints(HWND_DESKTOP, GetParent(hwnd), ((LPPOINT)&rw) + 1, 1);
if (callback) callback(hwnd, (vert) ? rw.right : rw.bottom, userParam);
}
}
break;
}
return __super::WindowProc(uMsg, wParam, lParam);
}