/* * PROJECT: PAINT for ReactOS * LICENSE: LGPL * FILE: base/applications/mspaint/toolsettings.cpp * PURPOSE: Window procedure of the tool settings window * PROGRAMMERS: Benedikt Freisen * Stanislav Motylkov */ /* INCLUDES *********************************************************/ #include "precomp.h" /* FUNCTIONS ********************************************************/ LRESULT CToolSettingsWindow::OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, WINBOOL& bHandled) { RECT trackbarZoomPos = {1, 1, 1 + 40, 1 + 64}; trackbarZoom.Create(TRACKBAR_CLASS, m_hWnd, trackbarZoomPos, NULL, WS_CHILD | TBS_VERT | TBS_AUTOTICKS); trackbarZoom.SendMessage(TBM_SETRANGE, (WPARAM) TRUE, MAKELPARAM(0, 6)); trackbarZoom.SendMessage(TBM_SETPOS, (WPARAM) TRUE, (LPARAM) 3); return 0; } LRESULT CToolSettingsWindow::OnVScroll(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (!zoomTo(125 << trackbarZoom.SendMessage(TBM_GETPOS, 0, 0), 0, 0)) { OnToolsModelZoomChanged(nMsg, wParam, lParam, bHandled); } return 0; } LRESULT CToolSettingsWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { HDC hdc = GetDC(); RECT rect1 = { 0, 0, 42, 66 }; RECT rect2 = { 0, 70, 42, 136 }; DefWindowProc(WM_PAINT, wParam, lParam); DrawEdge(hdc, &rect1, BDR_SUNKENOUTER, (toolsModel.GetActiveTool() == TOOL_ZOOM) ? BF_RECT : BF_RECT | BF_MIDDLE); DrawEdge(hdc, &rect2, (toolsModel.GetActiveTool() >= TOOL_RECT) ? BDR_SUNKENOUTER : 0, BF_RECT | BF_MIDDLE); switch (toolsModel.GetActiveTool()) { case TOOL_FREESEL: case TOOL_RECTSEL: case TOOL_TEXT: { HPEN oldPen = (HPEN) SelectObject(hdc, CreatePen(PS_NULL, 0, 0)); SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT)); Rectangle(hdc, 2, toolsModel.IsBackgroundTransparent() * 31 + 2, 41, toolsModel.IsBackgroundTransparent() * 31 + 33); DeleteObject(SelectObject(hdc, oldPen)); DrawIconEx(hdc, 1, 2, hNontranspIcon, 40, 30, 0, NULL, DI_NORMAL); DrawIconEx(hdc, 1, 33, hTranspIcon, 40, 30, 0, NULL, DI_NORMAL); break; } case TOOL_RUBBER: { int i; HPEN oldPen = (HPEN) SelectObject(hdc, CreatePen(PS_NULL, 0, 0)); for(i = 0; i < 4; i++) { if (toolsModel.GetRubberRadius() == i + 2) { SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT)); Rectangle(hdc, 14, i * 15 + 2, 29, i * 15 + 17); SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHTTEXT)); } else SelectObject(hdc, GetSysColorBrush(COLOR_WINDOWTEXT)); Rectangle(hdc, 19 - i, i * 14 + 7, 24 + i, i * 16 + 12); } DeleteObject(SelectObject(hdc, oldPen)); break; } case TOOL_BRUSH: { int i; HPEN oldPen = (HPEN) SelectObject(hdc, CreatePen(PS_NULL, 0, 0)); SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT)); Rectangle(hdc, toolsModel.GetBrushStyle() % 3 * 13 + 2, toolsModel.GetBrushStyle() / 3 * 15 + 2, toolsModel.GetBrushStyle() % 3 * 13 + 15, toolsModel.GetBrushStyle() / 3 * 15 + 17); DeleteObject(SelectObject(hdc, oldPen)); for(i = 0; i < 12; i++) Brush(hdc, i % 3 * 13 + 7, i / 3 * 15 + 8, i % 3 * 13 + 7, i / 3 * 15 + 8, GetSysColor((i == toolsModel.GetBrushStyle()) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT), i); break; } case TOOL_AIRBRUSH: { HPEN oldPen = (HPEN) SelectObject(hdc, CreatePen(PS_NULL, 0, 0)); SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT)); switch (toolsModel.GetAirBrushWidth()) { case 5: Rectangle(hdc, 2, 2, 21, 31); break; case 8: Rectangle(hdc, 20, 2, 41, 31); break; case 3: Rectangle(hdc, 2, 30, 16, 61); break; case 12: Rectangle(hdc, 15, 30, 41, 61); break; } Airbrush(hdc, 10, 15, GetSysColor((toolsModel.GetAirBrushWidth() == 5) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT), 5); Airbrush(hdc, 30, 15, GetSysColor((toolsModel.GetAirBrushWidth() == 8) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT), 8); Airbrush(hdc, 8, 45, GetSysColor((toolsModel.GetAirBrushWidth() == 3) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT), 3); Airbrush(hdc, 27, 45, GetSysColor((toolsModel.GetAirBrushWidth() == 12) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT), 12); DeleteObject(SelectObject(hdc, oldPen)); break; } case TOOL_LINE: case TOOL_BEZIER: { int i; HPEN oldPen = (HPEN) SelectObject(hdc, CreatePen(PS_NULL, 0, 0)); for(i = 0; i < 5; i++) { if (toolsModel.GetLineWidth() == i + 1) { SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT)); Rectangle(hdc, 2, i * 12 + 2, 41, i * 12 + 14); SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHTTEXT)); } else SelectObject(hdc, GetSysColorBrush(COLOR_WINDOWTEXT)); Rectangle(hdc, 5, i * 12 + 6, 38, i * 12 + 8 + i); } DeleteObject(SelectObject(hdc, oldPen)); break; } case TOOL_RECT: case TOOL_SHAPE: case TOOL_ELLIPSE: case TOOL_RRECT: { int i; HPEN oldPen = (HPEN) SelectObject(hdc, CreatePen(PS_NULL, 0, 0)); for(i = 0; i < 3; i++) { if (toolsModel.GetShapeStyle() == i) { SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT)); Rectangle(hdc, 2, i * 20 + 2, 41, i * 20 + 22); } } Rect(hdc, 5, 6, 37, 16, GetSysColor((toolsModel.GetShapeStyle() == 0) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, 0); Rect(hdc, 5, 26, 37, 36, GetSysColor((toolsModel.GetShapeStyle() == 1) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, 1); Rect(hdc, 5, 46, 37, 56, GetSysColor(COLOR_APPWORKSPACE), GetSysColor(COLOR_APPWORKSPACE), 1, 1); for(i = 0; i < 5; i++) { if (toolsModel.GetLineWidth() == i + 1) { SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT)); Rectangle(hdc, 2, i * 12 + 72, 41, i * 12 + 84); SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHTTEXT)); } else SelectObject(hdc, GetSysColorBrush(COLOR_WINDOWTEXT)); Rectangle(hdc, 5, i * 12 + 76, 38, i * 12 + 78 + i); } DeleteObject(SelectObject(hdc, oldPen)); break; } } ReleaseDC(hdc); return 0; } LRESULT CToolSettingsWindow::OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); switch (toolsModel.GetActiveTool()) { case TOOL_FREESEL: case TOOL_RECTSEL: case TOOL_TEXT: if ((y > 1) && (y < 64)) toolsModel.SetBackgroundTransparent((y - 2) / 31); break; case TOOL_RUBBER: if ((y > 1) && (y < 62)) toolsModel.SetRubberRadius((y - 2) / 15 + 2); break; case TOOL_BRUSH: if ((x > 1) && (x < 40) && (y > 1) && (y < 62)) toolsModel.SetBrushStyle((y - 2) / 15 * 3 + (x - 2) / 13); break; case TOOL_AIRBRUSH: if (y < 62) { if (y < 30) { if (x < 20) toolsModel.SetAirBrushWidth(5); else toolsModel.SetAirBrushWidth(8); } else { if (x < 15) toolsModel.SetAirBrushWidth(3); else toolsModel.SetAirBrushWidth(12); } } break; case TOOL_LINE: case TOOL_BEZIER: if (y <= 62) toolsModel.SetLineWidth((y - 2) / 12 + 1); break; case TOOL_RECT: case TOOL_SHAPE: case TOOL_ELLIPSE: case TOOL_RRECT: if (y <= 60) toolsModel.SetShapeStyle((y - 2) / 20); if ((y >= 70) && (y <= 132)) toolsModel.SetLineWidth((y - 72) / 12 + 1); break; } return 0; } LRESULT CToolSettingsWindow::OnToolsModelToolChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { Invalidate(); trackbarZoom.ShowWindow((wParam == TOOL_ZOOM) ? SW_SHOW : SW_HIDE); return 0; } LRESULT CToolSettingsWindow::OnToolsModelSettingsChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { Invalidate(); return 0; } LRESULT CToolSettingsWindow::OnToolsModelZoomChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { int tbPos = 0; int tempZoom = toolsModel.GetZoom(); while (tempZoom > 125) { tbPos++; tempZoom = tempZoom >> 1; } trackbarZoom.SendMessage(TBM_SETPOS, (WPARAM) TRUE, (LPARAM) tbPos); return 0; }