diff --git a/base/applications/mspaint/mouse.cpp b/base/applications/mspaint/mouse.cpp index 083467b0eb1..115e8474f9e 100644 --- a/base/applications/mspaint/mouse.cpp +++ b/base/applications/mspaint/mouse.cpp @@ -611,30 +611,34 @@ struct FillTool : ToolBase // TOOL_COLOR struct ColorTool : ToolBase { - void fetchColor(BOOL bLeftButton, LONG x, LONG y) + COLORREF fetchColor(LONG x, LONG y) { - COLORREF rgbColor; - if (0 <= x && x < imageModel.GetWidth() && 0 <= y && y < imageModel.GetHeight()) - rgbColor = GetPixel(m_hdc, x, y); - else - rgbColor = RGB(255, 255, 255); // Outside is white + return GetPixel(m_hdc, x, y); + return RGB(255, 255, 255); // Outside is white + } - if (bLeftButton) - paletteModel.SetFgColor(rgbColor); - else - paletteModel.SetBgColor(rgbColor); + void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) override + { + COLORREF rgbColor = fetchColor(x, y); + toolSettingsWindow.SendMessage(WM_TOOLSMODELCOLORPICKED, rgbColor, 0); } BOOL OnMouseMove(BOOL bLeftButton, LONG& x, LONG& y) override { - fetchColor(bLeftButton, x, y); + COLORREF rgbColor = fetchColor(x, y); + toolSettingsWindow.SendMessage(WM_TOOLSMODELCOLORPICKED, rgbColor, 0); return TRUE; } BOOL OnButtonUp(BOOL bLeftButton, LONG& x, LONG& y) override { - fetchColor(bLeftButton, x, y); + COLORREF rgbColor = fetchColor(x, y); + if (bLeftButton) + paletteModel.SetFgColor(rgbColor); + else + paletteModel.SetBgColor(rgbColor); + toolsModel.SetActiveTool(toolsModel.GetOldActiveTool()); return TRUE; } diff --git a/base/applications/mspaint/precomp.h b/base/applications/mspaint/precomp.h index 6475b1fee71..5ba669a0d23 100644 --- a/base/applications/mspaint/precomp.h +++ b/base/applications/mspaint/precomp.h @@ -49,8 +49,9 @@ #define WM_TOOLSMODELTOOLCHANGED (WM_APP + 0) #define WM_TOOLSMODELSETTINGSCHANGED (WM_APP + 1) -#define WM_TOOLSMODELZOOMCHANGED (WM_APP + 2) -#define WM_PALETTEMODELCOLORCHANGED (WM_APP + 3) +#define WM_TOOLSMODELCOLORPICKED (WM_APP + 2) +#define WM_TOOLSMODELZOOMCHANGED (WM_APP + 3) +#define WM_PALETTEMODELCOLORCHANGED (WM_APP + 4) enum HITTEST // hit { diff --git a/base/applications/mspaint/toolsettings.cpp b/base/applications/mspaint/toolsettings.cpp index 36caff71221..0656754c24e 100644 --- a/base/applications/mspaint/toolsettings.cpp +++ b/base/applications/mspaint/toolsettings.cpp @@ -391,8 +391,15 @@ LRESULT CToolSettingsWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BO drawBox(hdc, &rect1); drawLine(hdc, &rect2); break; - case TOOL_FILL: case TOOL_COLOR: + if (m_rgbPickColor != CLR_INVALID) + { + HBRUSH hbr = CreateSolidBrush(m_rgbPickColor); + FillRect(hdc, &rect1, hbr); + DeleteObject(hbr); + } + break; + case TOOL_FILL: case TOOL_ZOOM: case TOOL_PEN: break; @@ -469,6 +476,7 @@ LRESULT CToolSettingsWindow::OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lPar LRESULT CToolSettingsWindow::OnToolsModelToolChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { + m_rgbPickColor = CLR_INVALID; Invalidate(); trackbarZoom.ShowWindow((wParam == TOOL_ZOOM) ? SW_SHOW : SW_HIDE); return 0; @@ -480,6 +488,13 @@ LRESULT CToolSettingsWindow::OnToolsModelSettingsChanged(UINT nMsg, WPARAM wPara return 0; } +LRESULT CToolSettingsWindow::OnToolsModelColorPicked(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + m_rgbPickColor = (COLORREF)wParam; + Invalidate(); + return 0; +} + LRESULT CToolSettingsWindow::OnToolsModelZoomChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { int tbPos = MIN_ZOOM_TRACK; diff --git a/base/applications/mspaint/toolsettings.h b/base/applications/mspaint/toolsettings.h index 5d414130f2b..fe8c9287fe1 100644 --- a/base/applications/mspaint/toolsettings.h +++ b/base/applications/mspaint/toolsettings.h @@ -20,6 +20,7 @@ public: MESSAGE_HANDLER(WM_NOTIFY, OnNotify) MESSAGE_HANDLER(WM_TOOLSMODELTOOLCHANGED, OnToolsModelToolChanged) MESSAGE_HANDLER(WM_TOOLSMODELSETTINGSCHANGED, OnToolsModelSettingsChanged) + MESSAGE_HANDLER(WM_TOOLSMODELCOLORPICKED, OnToolsModelColorPicked) MESSAGE_HANDLER(WM_TOOLSMODELZOOMCHANGED, OnToolsModelZoomChanged) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) END_MSG_MAP() @@ -30,6 +31,7 @@ private: CWindow trackbarZoom; HICON m_hNontranspIcon; HICON m_hTranspIcon; + COLORREF m_rgbPickColor = CLR_INVALID; VOID drawTrans(HDC hdc, LPCRECT prc); VOID drawRubber(HDC hdc, LPCRECT prc); @@ -47,5 +49,6 @@ private: LRESULT OnNotify(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnToolsModelToolChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnToolsModelSettingsChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); + LRESULT OnToolsModelColorPicked(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnToolsModelZoomChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); };