diff options
Diffstat (limited to 'Src/Plugins/General/gen_ml/comboskin.cpp')
-rw-r--r-- | Src/Plugins/General/gen_ml/comboskin.cpp | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_ml/comboskin.cpp b/Src/Plugins/General/gen_ml/comboskin.cpp new file mode 100644 index 00000000..886005ce --- /dev/null +++ b/Src/Plugins/General/gen_ml/comboskin.cpp @@ -0,0 +1,148 @@ +#include "main.h" + +#include "comboskin.h" + +static int RectInRect(RECT *rect1, RECT *rect2) +{ + // this has a bias towards true + + // this could probably be optimized a lot + return ((rect1->top >= rect2->top && rect1->top <= rect2->bottom) || + (rect1->bottom >= rect2->top && rect1->bottom <= rect2->bottom) || + (rect2->top >= rect1->top && rect2->top <= rect1->bottom) || + (rect2->bottom >= rect1->top && rect2->bottom <= rect1->bottom)) // vertical intersect + && + ((rect1->left >= rect2->left && rect1->left <= rect2->right) || + (rect1->right >= rect2->left && rect1->right <= rect2->right) || + (rect2->left >= rect1->left && rect2->left <= rect1->right) || + (rect2->right >= rect1->left && rect2->right <= rect1->right)) // horiz intersect + ; +} + +static INT_PTR CALLBACK wndproc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) +{ + ComboSkin *cs=(ComboSkin *)(LONG_PTR)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); + if (uMsg == WM_PAINT) + { + RECT r; + GetClientRect(hwndDlg,&r); + RECT ur; + GetUpdateRect(hwndDlg,&ur,FALSE); + if(RectInRect(&r,&ur)) //hmmm not sure about testing this, should probably use a backbuffer or something + { + //Fill with bg color + HDC hdc=GetDC(hwndDlg); + HBRUSH b=CreateSolidBrush(WADlg_getColor(WADLG_WNDBG)); + HBRUSH b2=CreateSolidBrush(WADlg_getColor(WADLG_HILITE)); //sunken + + //top line + { + RECT a={0,0,r.right-r.left,3}; + FillRect(hdc,&a,b); + ValidateRect(hwndDlg,&a); + } + //bottom lines + { + RECT a={0,r.bottom-2,r.right-r.left,r.bottom}; + FillRect(hdc,&a,b); + ValidateRect(hwndDlg,&a); + } + { + //sunken part + RECT a={0,r.bottom-3,r.right-r.left,r.bottom-2}; + FillRect(hdc,&a,b2); + ValidateRect(hwndDlg,&a); + } + //left + { + RECT a={0,0,2,r.bottom-r.top}; + FillRect(hdc,&a,b); + ValidateRect(hwndDlg,&a); + } + //right + { + RECT a={r.right-2,0,r.right,r.bottom-r.top}; + FillRect(hdc,&a,b); + ValidateRect(hwndDlg,&a); + } + + //paint the arrow + HBITMAP bmp=WADlg_getBitmap(); + HDC hdcbmp = CreateCompatibleDC(hdc); + SelectObject(hdcbmp,bmp); + int pushed=0; + if(GetAsyncKeyState(MK_LBUTTON) & 0x8000) + { + //check if in arrow down area + POINT cursor; + GetCursorPos(&cursor); + ScreenToClient(hwndDlg,&cursor); + if(cursor.x >= r.right-20 && cursor.x <= r.right) + { + pushed=1; + } + } + int startx=14; + int starty=31; + if(pushed) startx+=28; + int left=r.right-18; + int top=r.top+4; + StretchBlt(hdc,left,top,14,14,hdcbmp,startx,starty,14,14,SRCCOPY); + DeleteDC(hdcbmp); + RECT a={left,top,left+14,top+14}; + ValidateRect(hwndDlg,&a); + //paint arrow borders + { + HBRUSH b=CreateSolidBrush(WADlg_getColor(WADLG_ITEMBG)); + RECT a={left,3,left+14,4}; + FillRect(hdc,&a,b); + ValidateRect(hwndDlg,&a); + + RECT c={left,17,left+14,18}; + FillRect(hdc,&c,b); + ValidateRect(hwndDlg,&c); + + RECT d={left+14,3,left+15,18}; + FillRect(hdc,&d,b); + ValidateRect(hwndDlg,&d); + + RECT e={left+15,3,left+16,19}; + FillRect(hdc,&e,b2); + ValidateRect(hwndDlg,&e); + + DeleteObject(b); + } + + DeleteObject(b); + DeleteObject(b2); + ReleaseDC(hwndDlg,hdc); + } + } + + if(uMsg == WM_WINDOWPOSCHANGING) + { + //move it up 1 pixel so it's correctly centered + WINDOWPOS *wp=(WINDOWPOS *)lParam; + wp->y--; + } + + if(uMsg == WM_KILLFOCUS || uMsg == WM_LBUTTONUP) + { + InvalidateRect(hwndDlg,NULL,TRUE); + } + + return CallWindowProc(cs->m_old_wndproc,hwndDlg,uMsg,wParam,lParam); +} + +ComboSkin::ComboSkin(HWND hwnd) +{ + m_hwnd=hwnd; + + SetWindowLongPtr(m_hwnd,GWLP_USERDATA, (LONGX86)(LONG_PTR)this); + m_old_wndproc=(WNDPROC)(LONG_PTR)SetWindowLongPtr(m_hwnd,GWLP_WNDPROC, (LONGX86)(LONG_PTR)wndproc); +} + +ComboSkin::~ComboSkin() +{ + SetWindowLongPtr(m_hwnd,GWLP_WNDPROC, (LONGX86)(LONG_PTR)m_old_wndproc); +} |