--- /dev/null
+//
+// CardLib - CardButton class
+//
+// Freeware
+// Copyright J Brown 2001
+//
+
+#include "cardlib.h"
+
+HPALETTE UseNicePalette(HDC, HPALETTE);
+void RestorePalette(HDC, HPALETTE);
+
+void PaintRect(HDC hdc, RECT *rect, COLORREF colour);
+
+CardButton::CardButton(CardWindow &parent, int Id, TCHAR *szText, UINT Style, bool visible,
+ int x, int y, int width, int height)
+
+ : parentWnd(parent), id(Id), uStyle(Style), fVisible(visible), ButtonCallback(0)
+{
+ crText = RGB(255,255,255);
+ crBack = RGB(0, 128, 0);
+
+ xadjust = 0;
+ yadjust = 0;
+ xjustify = 0;
+ yjustify = 0;
+
+ fMouseDown = false;
+ fButtonDown = false;
+
+ hIcon = 0;
+
+ SetText(szText);
+ Move(x, y, width, height);
+
+ mxlock = CreateMutex(0, FALSE, 0);
+
+ hFont = 0;
+}
+
+CardButton::~CardButton()
+{
+ CloseHandle(mxlock);
+}
+
+void CardButton::DrawRect(HDC hdc, RECT *rect, bool fNormal)
+{
+ RECT fill;
+
+ HANDLE hOld;
+
+ HPEN hhi = CreatePen(0, 0, MAKE_PALETTERGB(crHighlight));
+ HPEN hsh = CreatePen(0, 0, MAKE_PALETTERGB(crShadow));
+ HPEN hbl = (HPEN)GetStockObject(BLACK_PEN);
+
+ int x = rect->left;
+ int y = rect->top;
+ int width = rect->right-rect->left - 1;
+ int height = rect->bottom-rect->top - 1;
+
+ SetRect(&fill, x+1, y+1, x+width-1, y+height-1);
+
+ int one = 1;
+
+ if(!fNormal)
+ {
+ x += width;
+ y += height;
+ width = -width;
+ height = -height;
+ one = -1;
+ OffsetRect(&fill, 1, 1);
+ }
+
+ if(fNormal)
+ hOld = SelectObject(hdc, hhi);
+ else
+ hOld = SelectObject(hdc, hsh);
+
+ MoveToEx(hdc, x, y+height, 0);
+ LineTo(hdc, x, y);
+ LineTo(hdc, x+width, y);
+ SelectObject(hdc, hOld);
+
+ hOld = SelectObject(hdc, hbl);
+ LineTo(hdc, x+width, y+height);
+ LineTo(hdc, x-one, y+height);
+ SelectObject(hdc, hOld);
+
+ hOld = SelectObject(hdc, hsh);
+ MoveToEx(hdc, x+one, y+height-one, 0);
+ LineTo(hdc, x+width-one, y+height-one);
+ LineTo(hdc, x+width-one, y);
+ SelectObject(hdc, hOld);
+
+ PaintRect(hdc, &fill, MAKE_PALETTERGB(crBack));
+
+ DeleteObject(hhi);
+ DeleteObject(hsh);
+}
+
+void CardButton::Clip(HDC hdc)
+{
+ if(fVisible == false) return;
+
+ ExcludeClipRect(hdc, rect.left, rect.top, rect.right, rect.bottom);
+}
+
+void CardButton::Draw(HDC hdc, bool fNormal)
+{
+ SIZE textsize;
+ int x, y; //text x, y
+ int ix, iy; //icon x, y
+ int iconwidth = 0;
+
+ RECT cliprect;
+
+ if(fVisible == 0) return;
+
+ if(hFont == 0)
+ SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT));
+ else
+ SelectObject(hdc, hFont);
+
+ GetTextExtentPoint32(hdc, szText, lstrlen(szText), &textsize);
+
+ if(hIcon)
+ {
+ x = rect.left + 32 + 8;
+ }
+ else
+ {
+ if(uStyle & CB_ALIGN_LEFT)
+ {
+ x = rect.left + iconwidth;
+ }
+ else if(uStyle & CB_ALIGN_RIGHT)
+ {
+ x = rect.left + (rect.right-rect.left-iconwidth-textsize.cx);
+ }
+ else //centered
+ {
+ x = rect.right - rect.left - iconwidth;
+ x = (x - textsize.cx) / 2;
+ x += rect.left + iconwidth;
+ }
+ }
+
+ y = rect.bottom - rect.top;
+ y = (y - textsize.cy) / 2;
+ y += rect.top;
+
+ //calc icon position..
+ ix = rect.left + 4;
+ iy = rect.top + (rect.bottom-rect.top-32) / 2;
+
+ //if button is pressed, then shift text
+ if(fNormal == false && (uStyle & CB_PUSHBUTTON))
+ {
+ x += 1;
+ y += 1;
+ ix += 1;
+ iy += 1;
+ }
+
+ SetRect(&cliprect, x, y, x+textsize.cx, y+textsize.cy);
+ ExcludeClipRect(hdc, x, y, x+textsize.cx, y+textsize.cy);
+
+ //
+ // Calc icon pos
+ //
+
+ if(hIcon)
+ {
+ ExcludeClipRect(hdc, ix, iy, ix + 32, iy + 32);
+ }
+
+ if(uStyle & CB_PUSHBUTTON)
+ {
+ DrawRect(hdc, &rect, fNormal);
+
+ SetBkColor(hdc, MAKE_PALETTERGB(crBack));
+ SetTextColor(hdc, crText);//MAKE_PALETTERGB(crText));
+
+ SelectClipRgn(hdc, 0);
+
+ ExtTextOut(hdc, x, y, ETO_OPAQUE, &cliprect, szText, lstrlen(szText), 0);
+ }
+ else
+ {
+ SetBkColor(hdc, MAKE_PALETTERGB(crBack));
+ SetTextColor(hdc, crText);//MAKE_PALETTERGB(crText));
+
+ SelectClipRgn(hdc, 0);
+
+ ExtTextOut(hdc, x, y, ETO_OPAQUE, &rect, szText, lstrlen(szText), 0);
+ }
+
+ if(hIcon)
+ {
+ HBRUSH hbr = CreateSolidBrush(MAKE_PALETTERGB(crBack));
+ DrawIconEx(hdc, ix, iy, hIcon, 32, 32, 0, hbr, 0);
+ DeleteObject(hbr);
+ }
+
+}
+
+void CardButton::AdjustPosition(int winwidth, int winheight)
+{
+ int width = rect.right-rect.left;
+ int height = rect.bottom-rect.top;
+
+ width = width & ~0x1;
+
+ switch(xjustify)
+ {
+ case CS_XJUST_NONE:
+ break;
+
+ case CS_XJUST_CENTER: //centered
+ rect.left = (winwidth - (width)) / 2;
+ rect.left += xadjust;
+ rect.right = rect.left+width;
+ break;
+
+ case CS_XJUST_RIGHT: //right-aligned
+ rect.left = winwidth - width;
+ rect.left += xadjust;
+ rect.right = rect.left+width;
+ break;
+ }
+
+ switch(yjustify)
+ {
+ case CS_YJUST_NONE:
+ break;
+
+ case CS_YJUST_CENTER: //centered
+ rect.top = (winheight - (height)) / 2;
+ rect.top += yadjust;
+ rect.bottom = rect.top+height;
+ break;
+
+ case CS_YJUST_BOTTOM: //right-aligned
+ rect.top = winheight - height;
+ rect.top += yadjust;
+ rect.bottom = rect.top+height;
+ break;
+ }
+
+}
+
+int CardButton::OnLButtonDown(HWND hwnd, int x, int y)
+{
+ if((uStyle & CB_PUSHBUTTON) == 0)
+ return 0;
+
+ //make sure that the user is allowed to do something
+ if(WaitForSingleObject(mxlock, 0) != WAIT_OBJECT_0)
+ {
+ return 0;
+ }
+ else
+ {
+ ReleaseMutex(mxlock);
+ }
+
+ fMouseDown = true;
+ fButtonDown = true;
+
+ Redraw();
+
+ SetCapture(hwnd);
+
+ return 1;
+}
+
+int CardButton::OnMouseMove(HWND hwnd, int x, int y)
+{
+ if(fMouseDown)
+ {
+ bool fOldButtonDown = fButtonDown;
+
+ POINT pt;
+
+ pt.x = x;
+ pt.y = y;
+
+ if(PtInRect(&rect, pt))
+ fButtonDown = true;
+ else
+ fButtonDown = false;
+
+ if(fButtonDown != fOldButtonDown)
+ Redraw();
+ }
+
+ return 0;
+}
+
+int CardButton::OnLButtonUp(HWND hwnd, int x, int y)
+{
+ if(fMouseDown)
+ {
+ fMouseDown = false;
+ fButtonDown = false;
+
+ if(uStyle & CB_PUSHBUTTON)
+ {
+ Redraw();
+ ReleaseCapture();
+ }
+
+ //if have clicked the button
+ if(parentWnd.CardButtonFromPoint(x, y) == this)
+ {
+ if(ButtonCallback)
+ {
+ ButtonCallback(*this);
+ }
+ else
+ {
+ HWND hwnd = (HWND)parentWnd;
+ SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(id, BN_CLICKED), (LONG_PTR)hwnd);
+ }
+ }
+ }
+
+ return 0;
+}
+
+//#define _countof(array) (sizeof(array)/sizeof(array[0]))
+
+CardButton *CardWindow::CreateButton(int id, TCHAR *szText, UINT uStyle, bool fVisible, int x, int y, int width, int height)
+{
+ CardButton *cb;
+
+ if(nNumButtons == MAXBUTTONS)
+ return 0;
+
+ cb = new CardButton(*this, id, szText, uStyle, fVisible, x, y, width, height);
+ Buttons[nNumButtons++] = cb;
+
+ if(uStyle & CB_PUSHBUTTON)
+ {
+ cb->SetBackColor(CardButton::GetFace(crBackgnd));
+ //cb->SetBackColor(ScaleLumRGB(crBackgnd, 0.1));
+ cb->SetForeColor(RGB(255,255,255));
+ }
+ else
+ {
+ cb->SetBackColor(crBackgnd);
+ cb->SetForeColor(RGB(255,255,255));
+ }
+
+ return cb;
+}
+
+void CardButton::SetText(TCHAR *lpszFormat, ...)
+{
+ int count;
+
+ va_list args;
+ va_start(args, lpszFormat);
+
+ count = wvsprintf(szText, lpszFormat, args);
+ va_end(args);
+}
+
+int CardButton::Id()
+{
+ return id;
+}
+
+void CardButton::Show(bool fShow)
+{
+ fVisible = fShow;
+}
+
+void CardButton::Move(int x, int y, int width, int height)
+{
+ SetRect(&rect, x, y, x+width, y+height);
+}
+
+void CardButton::Redraw()
+{
+ HDC hdc = GetDC((HWND)parentWnd);
+
+ HPALETTE hOldPal = UseNicePalette(hdc, __hPalette);
+
+ Draw(hdc, !fButtonDown);
+
+ RestorePalette(hdc, hOldPal);
+
+ ReleaseDC((HWND)parentWnd, hdc);
+}
+
+void CardButton::SetForeColor(COLORREF cr)
+{
+ crText = cr;
+}
+
+void CardButton::SetBackColor(COLORREF cr)
+{
+ crBack = cr;
+
+ crHighlight = GetHighlight(cr);
+ crShadow = GetShadow(cr);
+
+ //crHighlight = ScaleLumRGB(cr, +0.25);
+ //crShadow = ScaleLumRGB(cr, -0.25);
+}
+
+// Static member
+COLORREF CardButton::GetHighlight(COLORREF crBase)
+{
+ return ColorScaleRGB(crBase, RGB(255,255,255), 0.25);
+}
+
+// Static member
+COLORREF CardButton::GetShadow(COLORREF crBase)
+{
+ return ColorScaleRGB(crBase, RGB(0, 0, 0), 0.25);
+}
+
+COLORREF CardButton::GetFace(COLORREF crBase)
+{
+ return ColorScaleRGB(crBase, RGB(255,255,255), 0.1);
+}
+
+void CardButton::SetPlacement(UINT xJustify, UINT yJustify, int xAdjust, int yAdjust)
+{
+ xadjust = xAdjust;
+ yadjust = yAdjust;
+ xjustify = xJustify;
+ yjustify = yJustify;
+}
+
+void CardButton::SetIcon(HICON hicon, bool fRedraw)
+{
+ hIcon = hicon;
+
+ if(fRedraw)
+ Redraw();
+}
+
+void CardButton::SetFont(HFONT font)
+{
+ //don't delete the existing font..
+ hFont = font;
+}
+
+void CardButton::SetButtonProc(pButtonProc proc)
+{
+ ButtonCallback = proc;
+}
+
+bool CardButton::Lock()
+{
+ DWORD dw = WaitForSingleObject(mxlock, 0);
+
+ if(dw == WAIT_OBJECT_0)
+ return true;
+ else
+ return false;
+}
+
+bool CardButton::UnLock()
+{
+ if(ReleaseMutex(mxlock))
+ return true;
+ else
+ return false;
+}
+
+void CardButton::SetStyle(UINT style)
+{
+ uStyle = style;
+}
+
+UINT CardButton::GetStyle()
+{
+ return uStyle;
+}