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