diff options
Diffstat (limited to 'Src/Plugins/General/gen_ml/skinneddivider.cpp')
-rw-r--r-- | Src/Plugins/General/gen_ml/skinneddivider.cpp | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_ml/skinneddivider.cpp b/Src/Plugins/General/gen_ml/skinneddivider.cpp new file mode 100644 index 00000000..4e28f51f --- /dev/null +++ b/Src/Plugins/General/gen_ml/skinneddivider.cpp @@ -0,0 +1,128 @@ +#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); +}
\ No newline at end of file |