// ColorButton.h #ifndef ColorButtonh #define ColorButtonh #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "resource.h" #include "Colors.h" #include // Colours in a button with either a pure colour or a rainbow to denote that no colour is chosen. class CColorButton : public CColors, public CButton { COLORREF Color; public: CColorButton() : Color(NoColor) {} virtual ~CColorButton() {} static const char* DefaultText(const char* DefaultText=0) { static const char* Text="&Default"; // Init if(DefaultText) Text=DefaultText; // Set return Text; // Get } COLORREF GetColor() const {return Color;} void SetColor(COLORREF c) {Color=c;} bool OnClick() { // returns true if Color changed. CColorDialog ColorDlg; ColorDlg.m_cc.Flags |= CC_FULLOPEN | CC_RGBINIT | CC_SHOWHELP | CC_ENABLEHOOK; ColorDlg.m_cc.rgbResult=Color; ColorDlg.m_cc.lCustData=(LPARAM)this; ColorDlg.m_cc.lpfnHook=CColorButton::CCHookProc; if(ColorDlg.DoModal()==IDOK) Color=ColorDlg.GetColor(); // Color==NoColor means [Default] was pressed else if(ColorDlg.m_cc.rgbResult==Color) return false; // Unchanged AfxGetApp()->RestoreWaitCursor(); // After a Dialog Box the WaitCursor gets messed up. RedrawWindow(); return true; } static UINT_PTR CALLBACK CCHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) { static CColorButton* Me=0; switch(uiMsg) { case WM_INITDIALOG: { Me=(CColorButton*)((reinterpret_cast(lParam))->lCustData); ::SetDlgItemText(hdlg,pshHelp, Me ? Me->DefaultText() : "&Default"); return TRUE; } case WM_COMMAND: { if(wParam!=pshHelp) break; if(Me) Me->SetColor(NoColor); // Default Layer Colours ::PostMessage(hdlg,WM_COMMAND,IDABORT,0); } } return FALSE; } void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC dc; dc.Attach(lpDrawItemStruct->hDC); dc.SaveDC(); CRect Rect(lpDrawItemStruct->rcItem); dc.DrawFrameControl(&lpDrawItemStruct->rcItem, DFCS_BUTTONPUSH, (lpDrawItemStruct->itemState & ODS_SELECTED) ? DFCS_BUTTONPUSH|DFCS_PUSHED|DFCS_ADJUSTRECT : DFCS_BUTTONPUSH|DFCS_ADJUSTRECT); int xBorder=-GetSystemMetrics(SM_CXEDGE), yBorder=-GetSystemMetrics(SM_CYEDGE); Rect.InflateRect(xBorder,yBorder, xBorder-1,yBorder-1); if(Color==-1) { // Using default colours. Draw a rainbow: for(int y=Rect.top; yrcItem, DT_CENTER|DT_SINGLELINE|DT_VCENTER); if(lpDrawItemStruct->itemState & ODS_FOCUS) dc.DrawFocusRect(&Rect); dc.RestoreDC(-1); dc.Detach(); } void Line(CDC& dc, int x0, int x1, int y, unsigned Rows, unsigned Row) { // Draws horizontal rainbow lines CPen Pen(PS_SOLID, 1, GetRainbowColor(double(Row)/Rows)); HGDIOBJ OldPen=dc.SelectObject(&Pen); dc.MoveTo(x0,y); dc.LineTo(x1,y); dc.SelectObject(OldPen); } }; #endif // ndef ColorButtonh