%% options copyright owner = Dirk Krause copyright year = 2011-xxxx license = bsd %% header #include #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #include /** Show color setting, show colour chooser on mouse click. */ class DkWxColorView : public wxControl { /** Declare class as dynamic. */ DECLARE_DYNAMIC_CLASS(DkWxColorView) /** Event table for control. */ DECLARE_EVENT_TABLE() protected: /** Parent window. */ wxWindow *pParentWindow; /** Application helper, used to position color chooser dialog. */ DkWxAppHelper *pHelper; /** Class name, used in constructor and Create(). */ static wxChar const DkWxColorViewName[]; /** Height. */ int w; /** Width. */ int h; /** Red component of color to show. */ int r; /** Green component of color to show. */ int g; /** Blue component of color to show. */ int b; /** Previous x position of color chooser dialog. */ int ccdx; /** Previous y position of color chooser dialog. */ int ccdy; public: /** Default constructor. */ DkWxColorView(); /** Constructor. @param pParent Parent window. @param wxid Window ID. @param appHelper Application helper. @param red Red component of color to show. @param green Green component of color to show. @param blue Blue component of color to show. @param pos Object position. @param size Object minimum size. @param style Style for control. @param name Class name. */ DkWxColorView( wxWindow *pParent, wxWindowID wxid, DkWxAppHelper *appHelper, int red, int green, int blue, wxPoint const & pos = wxDefaultPosition, wxSize const & size = wxDefaultSize, long style = wxBORDER_NONE, wxChar const *name = DkWxColorViewName ); /** Create object after using default constructor. @param pParent Parent window. @param wxid Window ID. @param appHelper Application helper. @param red Red component of color to show. @param green Green component of color to show. @param blue Blue component of color to show. @param pos Object position. @param size Object minimum size. @param style Style for control. @param name Class name. @return true on success, false on error. */ bool Create( wxWindow *pParent, wxWindowID wxid, DkWxAppHelper *appHelper, int red = 255, int green = 255, int blue = 255, wxPoint const & pos = wxDefaultPosition, wxSize const & size = wxDefaultSize, long style = wxBORDER_NONE, wxChar const *name = DkWxColorViewName ); /** Find minimum size. */ wxSize DoGetBestSize() const; /** Get red component of current color. @return Red. */ int getRed() const; /** Get green component of current color. @return Green. */ int getGreen() const; /** Get blue component of current color. @return Blue. */ int getBlue() const; /** Set new current color. @param red Red. @param green Green. @param blue Blue. */ void setRGB(int red, int green, int blue); /** Handler for erase event. @param event Event to process. */ void OnErase(wxEraseEvent & event); /** Handler for paint event. @param event Event to process. */ void OnPaint(wxPaintEvent & event); /** Handler for mouse click event. @param event Event to process. */ void OnLeftMouseButtonDown(wxMouseEvent & event); }; %% module #include "DkWxColorView.h" #include #include $!trace-include BEGIN_EVENT_TABLE(DkWxColorView, wxControl) EVT_ERASE_BACKGROUND(DkWxColorView::OnErase) EVT_PAINT(DkWxColorView::OnPaint) EVT_LEFT_DOWN(DkWxColorView::OnLeftMouseButtonDown) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(DkWxColorView, wxControl) wxChar const DkWxColorView::DkWxColorViewName[] = { wxT("DkWxColorView") } ; DkWxColorView::DkWxColorView() { pParentWindow = NULL; pHelper = NULL; w = -1; h = -1; r = 255; g = 255; b = 255; ccdx = -1; ccdy = -1; } DkWxColorView::DkWxColorView( wxWindow *pParent, wxWindowID wxid, DkWxAppHelper *appHelper, int red, int green, int blue, wxPoint const & pos, wxSize const & size, long style, wxChar const *name ) : wxControl( pParent, wxid, pos, size, style, wxDefaultValidator, wxString(name) ) { pParentWindow = pParent; pHelper = appHelper; w = size.x; h = size.y; r = red; g = green; b = blue; ccdx = -1; ccdy = -1; } bool DkWxColorView::Create( wxWindow *pParent, wxWindowID wxid, DkWxAppHelper *appHelper, int red, int green, int blue, wxPoint const & pos, wxSize const & size, long style, wxChar const *name ) { bool back; back = wxControl::Create( pParent, wxid, pos, size, style, wxDefaultValidator, wxString(name) ); pParentWindow = pParent; pHelper = appHelper; w = size.x; h = size.y; r = red; g = green; b = blue; return back; } wxSize DkWxColorView::DoGetBestSize() const { wxSize back(((-1 < w) ? w : 20), ((-1 < h) ? h : 20)); return back; } void DkWxColorView::OnErase(wxEraseEvent & event) { } void DkWxColorView::OnPaint(wxPaintEvent & event) { wxBufferedPaintDC useDC(this); wxSize sz = GetClientSize(); wxColour mycolor(r, g, b); wxBrush myBrush(mycolor, wxSOLID); const wxBrush oldBrush = useDC.GetBrush(); useDC.SetBrush(myBrush); useDC.DrawRectangle(0, 0, sz.GetWidth(), sz.GetHeight()); useDC.SetBrush(wxNullBrush); } void DkWxColorView::OnLeftMouseButtonDown(wxMouseEvent & event) { $? "+ DkWxColorView::OnLeftMouseButtonDown" wxColourDialog dlg(this); if(pParentWindow) { if(pHelper) { $? ". pParent pHelper %d %d", ccdx, ccdy pHelper->setRelatedPosition(pParentWindow, &dlg, &ccdx, &ccdy); } } if(dlg.ShowModal() == wxID_OK) { wxColour col = dlg.GetColourData().GetColour(); r = col.Red(); g = col.Green(); b = col.Blue(); dlg.GetPosition(&ccdx, &ccdy); Refresh(); Update(); } else { dlg.GetPosition(&ccdx, &ccdy); } $? "- DkWxColorView::OnLeftMouseButtonDown" } int DkWxColorView::getRed() const { return r; } int DkWxColorView::getGreen() const { return g; } int DkWxColorView::getBlue() const { return b; } void DkWxColorView::setRGB(int red, int green, int blue) { r = red; g = green; b = blue; if(r < 0) r = 0; if(g < 0) g = 0; if(b < 0) b = 0; if(r > 255) r = 255; if(g > 255) g = 255; if(b > 255) b = 255; }