diff --git a/base/applications/mspaint/drawing.cpp b/base/applications/mspaint/drawing.cpp index 296a6f57a1e..f94da436eca 100644 --- a/base/applications/mspaint/drawing.cpp +++ b/base/applications/mspaint/drawing.cpp @@ -123,9 +123,11 @@ Erase(HDC hdc, LONG x1, LONG y1, LONG x2, LONG y2, COLORREF color, LONG radius) b = max(1, max(abs(x2 - x1), abs(y2 - y1))); oldPen = (HPEN) SelectObject(hdc, CreatePen(PS_SOLID, 1, color)); for(a = 0; a <= b; a++) - Rectangle(hdc, (x1 * (b - a) + x2 * a) / b - radius + 1, - (y1 * (b - a) + y2 * a) / b - radius + 1, (x1 * (b - a) + x2 * a) / b + radius + 1, - (y1 * (b - a) + y2 * a) / b + radius + 1); + Rectangle(hdc, + (x1 * (b - a) + x2 * a) / b - radius, + (y1 * (b - a) + y2 * a) / b - radius, + (x1 * (b - a) + x2 * a) / b + radius, + (y1 * (b - a) + y2 * a) / b + radius); DeleteObject(SelectObject(hdc, oldBrush)); DeleteObject(SelectObject(hdc, oldPen)); } @@ -172,8 +174,11 @@ Brush(HDC hdc, LONG x1, LONG y1, LONG x2, LONG y2, COLORREF color, LONG style) break; case 1: for(a = 0; a <= b; a++) - Ellipse(hdc, (x1 * (b - a) + x2 * a) / b - 1, (y1 * (b - a) + y2 * a) / b - 1, - (x1 * (b - a) + x2 * a) / b + 3, (y1 * (b - a) + y2 * a) / b + 3); + Ellipse(hdc, + (x1 * (b - a) + x2 * a) / b - 2, + (y1 * (b - a) + y2 * a) / b - 2, + (x1 * (b - a) + x2 * a) / b + 2, + (y1 * (b - a) + y2 * a) / b + 2); break; case 2: MoveToEx(hdc, x1, y1, NULL); @@ -182,8 +187,11 @@ Brush(HDC hdc, LONG x1, LONG y1, LONG x2, LONG y2, COLORREF color, LONG style) break; case 3: for(a = 0; a <= b; a++) - Rectangle(hdc, (x1 * (b - a) + x2 * a) / b - 3, (y1 * (b - a) + y2 * a) / b - 3, - (x1 * (b - a) + x2 * a) / b + 5, (y1 * (b - a) + y2 * a) / b + 5); + Rectangle(hdc, + (x1 * (b - a) + x2 * a) / b - 4, + (y1 * (b - a) + y2 * a) / b - 4, + (x1 * (b - a) + x2 * a) / b + 4, + (y1 * (b - a) + y2 * a) / b + 4); break; case 4: for(a = 0; a <= b; a++) @@ -202,10 +210,10 @@ Brush(HDC hdc, LONG x1, LONG y1, LONG x2, LONG y2, COLORREF color, LONG style) case 10: case 11: { - POINT offsTop[] = {{4, -3}, {2, -2}, {0, 0}, - {-3, -3}, {-2, -2}, {-1, 0}}; - POINT offsBtm[] = {{-3, 4}, {-2, 2}, {-1, 1}, - {4, 4}, {2, 2}, {0, 1}}; + POINT offsTop[] = {{3, -3}, {2, -2}, {0, 0}, + {-4, -4}, {-2, -2}, {-1, 0}}; + POINT offsBtm[] = {{-3, 3}, {-2, 2}, {-1, 1}, + {3, 3}, {2, 2}, {0, 1}}; LONG idx = style - 6; POINT pts[4]; pts[0].x = x1 + offsTop[idx].x; diff --git a/base/applications/mspaint/main.cpp b/base/applications/mspaint/main.cpp index f24a12b1a1f..1099f6af3f8 100644 --- a/base/applications/mspaint/main.cpp +++ b/base/applications/mspaint/main.cpp @@ -180,13 +180,8 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument SetMenu(hwnd, menu); haccel = LoadAccelerators(hThisInstance, MAKEINTRESOURCE(800)); - RECT toolBoxContainerPos = {2, 2, 2 + 52, 2 + 350}; - toolBoxContainer.Create(hwnd, toolBoxContainerPos, NULL, WS_CHILD); - if (registrySettings.ShowToolBox) - toolBoxContainer.ShowWindow(SW_SHOWNOACTIVATE); - /* creating the tool settings child window */ - RECT toolSettingsWindowPos = {5, 208, 5 + 42, 208 + 140}; - toolSettingsWindow.Create(toolBoxContainer.m_hWnd, toolSettingsWindowPos, NULL, WS_CHILD | WS_VISIBLE); + /* Create ToolBox */ + toolBoxContainer.DoCreate(hwnd); /* creating the palette child window */ RECT paletteWindowPos = {56, 9, 56 + 255, 9 + 32}; diff --git a/base/applications/mspaint/toolbox.cpp b/base/applications/mspaint/toolbox.cpp index 4af48b5917a..793c62bbfda 100644 --- a/base/applications/mspaint/toolbox.cpp +++ b/base/applications/mspaint/toolbox.cpp @@ -13,6 +13,13 @@ /* FUNCTIONS ********************************************************/ +BOOL CToolBox::DoCreate(HWND hwndParent) +{ + RECT toolBoxContainerPos = { 0, 0, 0, 0 }; + DWORD style = WS_CHILD | (registrySettings.ShowToolBox ? WS_VISIBLE : 0); + return !!Create(hwndParent, toolBoxContainerPos, NULL, style); +} + LRESULT CToolBox::OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { HIMAGELIST hImageList; @@ -20,6 +27,8 @@ LRESULT CToolBox::OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandl int i; TCHAR tooltips[NUM_TOOLS][30]; + toolSettingsWindow.DoCreate(m_hWnd); + /* NOTE: The horizontal line above the toolbar is hidden by CCS_NODIVIDER style. */ RECT toolbarPos = {0, 0, CX_TOOLBAR, CY_TOOLBAR}; DWORD style = WS_CHILD | WS_VISIBLE | CCS_NOPARENTALIGN | CCS_VERT | CCS_NORESIZE | diff --git a/base/applications/mspaint/toolbox.h b/base/applications/mspaint/toolbox.h index ac40ab19e5a..b6699c67455 100644 --- a/base/applications/mspaint/toolbox.h +++ b/base/applications/mspaint/toolbox.h @@ -12,8 +12,8 @@ #define TOOLBAR_ROWS 8 #define TOOLBAR_COLUMNS 2 #define CXY_TB_BUTTON 25 -#define CX_TOOLBAR ((TOOLBAR_COLUMNS * CXY_TB_BUTTON) + 2) -#define CY_TOOLBAR ((TOOLBAR_ROWS * CXY_TB_BUTTON) + 2) +#define CX_TOOLBAR (TOOLBAR_COLUMNS * CXY_TB_BUTTON) +#define CY_TOOLBAR (TOOLBAR_ROWS * CXY_TB_BUTTON) class CToolBox : public CWindowImpl { @@ -27,6 +27,9 @@ public: MESSAGE_HANDLER(WM_TOOLSMODELTOOLCHANGED, OnToolsModelToolChanged) END_MSG_MAP() + BOOL DoCreate(HWND hwndParent); + +private: CWindow toolbar; LRESULT OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); diff --git a/base/applications/mspaint/toolsettings.cpp b/base/applications/mspaint/toolsettings.cpp index dc1883bf47e..c8b3978e8b6 100644 --- a/base/applications/mspaint/toolsettings.cpp +++ b/base/applications/mspaint/toolsettings.cpp @@ -5,21 +5,264 @@ * PURPOSE: Window procedure of the tool settings window * PROGRAMMERS: Benedikt Freisen * Stanislav Motylkov + * Katayama Hirofumi MZ */ /* INCLUDES *********************************************************/ #include "precomp.h" +#define X_TOOLSETTINGS 0 +#define Y_TOOLSETTINGS (CY_TOOLBAR + 3) +#define CX_TOOLSETTINGS CX_TOOLBAR +#define CY_TOOLSETTINGS 140 + +#define CX_TRANS_ICON 40 +#define CY_TRANS_ICON 30 +#define MARGIN1 3 +#define MARGIN2 2 + +static const BYTE s_AirRadius[4] = { 5, 8, 3, 12 }; + /* FUNCTIONS ********************************************************/ +BOOL CToolSettingsWindow::DoCreate(HWND hwndParent) +{ + /* creating the tool settings child window */ + RECT toolSettingsWindowPos = + { + X_TOOLSETTINGS, Y_TOOLSETTINGS, + X_TOOLSETTINGS + CX_TOOLSETTINGS, Y_TOOLSETTINGS + CY_TOOLSETTINGS + }; + return !!Create(toolBoxContainer, toolSettingsWindowPos, NULL, WS_CHILD | WS_VISIBLE); +} + +static INT +getSplitRects(RECT *rects, INT cColumns, INT cRows, LPCRECT prc, LPPOINT ppt) +{ + INT cx = prc->right - prc->left, cy = prc->bottom - prc->top; + for (INT i = 0, iRow = 0; iRow < cRows; ++iRow) + { + for (INT iColumn = 0; iColumn < cColumns; ++iColumn) + { + RECT& rc = rects[i]; + rc.left = prc->left + (iColumn * cx / cColumns); + rc.top = prc->top + (iRow * cy / cRows); + rc.right = prc->left + ((iColumn + 1) * cx / cColumns); + rc.bottom = prc->top + ((iRow + 1) * cy / cRows); + if (ppt && ::PtInRect(&rc, *ppt)) + return i; + ++i; + } + } + return -1; +} + +static inline INT getTransRects(RECT rects[2], LPCRECT prc, LPPOINT ppt = NULL) +{ + return getSplitRects(rects, 1, 2, prc, ppt); +} + +VOID CToolSettingsWindow::drawTrans(HDC hdc, LPCRECT prc) +{ + RECT rc[2]; + getTransRects(rc, prc); + + HBRUSH hbrHigh = ::GetSysColorBrush(COLOR_HIGHLIGHT); + ::FillRect(hdc, &rc[toolsModel.IsBackgroundTransparent()], hbrHigh); + ::DrawIconEx(hdc, rc[0].left, rc[0].top, m_hNontranspIcon, + CX_TRANS_ICON, CY_TRANS_ICON, 0, NULL, DI_NORMAL); + ::DrawIconEx(hdc, rc[1].left, rc[1].top, m_hTranspIcon, + CX_TRANS_ICON, CY_TRANS_ICON, 0, NULL, DI_NORMAL); +} + +static inline INT getRubberRects(RECT rects[4], LPCRECT prc, LPPOINT ppt = NULL) +{ + return getSplitRects(rects, 1, 4, prc, ppt); +} + +VOID CToolSettingsWindow::drawRubber(HDC hdc, LPCRECT prc) +{ + RECT rects[4], rcRubber; + getRubberRects(rects, prc); + INT xCenter = (prc->left + prc->right) / 2; + for (INT i = 0; i < 4; i++) + { + INT iColor, radius = i + 2; + if (toolsModel.GetRubberRadius() == radius) + { + ::FillRect(hdc, &rects[i], ::GetSysColorBrush(COLOR_HIGHLIGHT)); + iColor = COLOR_HIGHLIGHTTEXT; + } + else + { + iColor = COLOR_WINDOWTEXT; + } + + INT yCenter = (rects[i].top + rects[i].bottom) / 2; + rcRubber.left = xCenter - radius; + rcRubber.top = yCenter - radius; + rcRubber.right = rcRubber.left + radius * 2; + rcRubber.bottom = rcRubber.top + radius * 2; + ::FillRect(hdc, &rcRubber, GetSysColorBrush(iColor)); + } +} + +static inline INT getBrushRects(RECT rects[12], LPCRECT prc, LPPOINT ppt = NULL) +{ + return getSplitRects(rects, 3, 4, prc, ppt); +} + +VOID CToolSettingsWindow::drawBrush(HDC hdc, LPCRECT prc) +{ + RECT rects[12]; + getBrushRects(rects, prc); + + HBRUSH hbrHigh = ::GetSysColorBrush(COLOR_HIGHLIGHT); + ::FillRect(hdc, &rects[toolsModel.GetBrushStyle()], hbrHigh); + + for (INT i = 0; i < 12; i++) + { + RECT rcItem = rects[i]; + INT x = (rcItem.left + rcItem.right) / 2, y = (rcItem.top + rcItem.bottom) / 2; + INT iColor; + if (i == toolsModel.GetBrushStyle()) + iColor = COLOR_HIGHLIGHTTEXT; + else + iColor = COLOR_WINDOWTEXT; + Brush(hdc, x, y, x, y, ::GetSysColor(iColor), i); + } +} + +static inline INT getLineRects(RECT rects[5], LPCRECT prc, LPPOINT ppt = NULL) +{ + return getSplitRects(rects, 1, 5, prc, ppt); +} + +VOID CToolSettingsWindow::drawLine(HDC hdc, LPCRECT prc) +{ + RECT rects[5]; + getLineRects(rects, prc); + + for (INT i = 0; i < 5; i++) + { + INT penWidth = i + 1; + RECT rcLine = rects[i]; + ::InflateRect(&rcLine, -2, 0); + rcLine.top = (rcLine.top + rcLine.bottom - penWidth) / 2; + rcLine.bottom = rcLine.top + penWidth; + if (toolsModel.GetLineWidth() == penWidth) + { + ::FillRect(hdc, &rects[i], ::GetSysColorBrush(COLOR_HIGHLIGHT)); + ::FillRect(hdc, &rcLine, ::GetSysColorBrush(COLOR_HIGHLIGHTTEXT)); + } + else + { + ::FillRect(hdc, &rcLine, ::GetSysColorBrush(COLOR_WINDOWTEXT)); + } + } +} + +static INT getAirBrushRects(RECT rects[4], LPCRECT prc, LPPOINT ppt = NULL) +{ + INT cx = (prc->right - prc->left), cy = (prc->bottom - prc->top); + + rects[0] = rects[1] = rects[2] = rects[3] = *prc; + + rects[0].right = rects[1].left = prc->left + cx * 3 / 8; + rects[0].bottom = rects[1].bottom = prc->top + cy / 2; + + rects[2].top = rects[3].top = prc->top + cy / 2; + rects[2].right = rects[3].left = prc->left + cx * 2 / 8; + + if (ppt) + { + for (INT i = 0; i < 4; ++i) + { + if (::PtInRect(&rects[i], *ppt)) + return i; + } + } + return -1; +} + +VOID CToolSettingsWindow::drawAirBrush(HDC hdc, LPCRECT prc) +{ + RECT rects[4]; + getAirBrushRects(rects, prc); + + srand(0); + for (size_t i = 0; i < 4; ++i) + { + RECT& rc = rects[i]; + INT x = (rc.left + rc.right) / 2; + INT y = (rc.top + rc.bottom) / 2; + BOOL bHigh = (s_AirRadius[i] == toolsModel.GetAirBrushWidth()); + if (bHigh) + { + ::FillRect(hdc, &rc, ::GetSysColorBrush(COLOR_HIGHLIGHT)); + Airbrush(hdc, x, y, ::GetSysColor(COLOR_HIGHLIGHTTEXT), s_AirRadius[i]); + } + else + { + Airbrush(hdc, x, y, ::GetSysColor(COLOR_WINDOWTEXT), s_AirRadius[i]); + } + } +} + +static inline INT getBoxRects(RECT rects[3], LPCRECT prc, LPPOINT ppt = NULL) +{ + return getSplitRects(rects, 1, 3, prc, ppt); +} + +VOID CToolSettingsWindow::drawBox(HDC hdc, LPCRECT prc) +{ + RECT rects[3]; + getBoxRects(rects, prc); + + for (INT iItem = 0; iItem < 3; ++iItem) + { + RECT& rcItem = rects[iItem]; + + if (toolsModel.GetShapeStyle() == iItem) + ::FillRect(hdc, &rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHT)); + + ::InflateRect(&rcItem, -5, -5); + + if (iItem <= 1) + { + COLORREF rgbPen; + if (toolsModel.GetShapeStyle() == iItem) + rgbPen = ::GetSysColor(COLOR_HIGHLIGHTTEXT); + else + rgbPen = ::GetSysColor(COLOR_WINDOWTEXT); + HGDIOBJ hOldBrush; + if (iItem == 0) + hOldBrush = ::SelectObject(hdc, ::GetStockObject(NULL_BRUSH)); + else + hOldBrush = ::SelectObject(hdc, ::GetSysColorBrush(COLOR_APPWORKSPACE)); + HGDIOBJ hOldPen = ::SelectObject(hdc, ::CreatePen(PS_SOLID, 1, rgbPen)); + ::Rectangle(hdc, rcItem.left, rcItem.top, rcItem.right, rcItem.bottom); + ::DeleteObject(::SelectObject(hdc, hOldPen)); + ::SelectObject(hdc, hOldBrush); + } + else + { + if (toolsModel.GetShapeStyle() == iItem) + ::FillRect(hdc, &rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHTTEXT)); + else + ::FillRect(hdc, &rcItem, ::GetSysColorBrush(COLOR_WINDOWTEXT)); + } + } +} + LRESULT CToolSettingsWindow::OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, WINBOOL& bHandled) { /* preloading the draw transparent/nontransparent icons for later use */ m_hNontranspIcon = (HICON)LoadImage(hProgInstance, MAKEINTRESOURCE(IDI_NONTRANSPARENT), - IMAGE_ICON, 40, 30, LR_DEFAULTCOLOR); + IMAGE_ICON, CX_TRANS_ICON, CY_TRANS_ICON, LR_DEFAULTCOLOR); m_hTranspIcon = (HICON)LoadImage(hProgInstance, MAKEINTRESOURCE(IDI_TRANSPARENT), - IMAGE_ICON, 40, 30, LR_DEFAULTCOLOR); + IMAGE_ICON, CX_TRANS_ICON, CY_TRANS_ICON, LR_DEFAULTCOLOR); RECT trackbarZoomPos = {1, 1, 1 + 40, 1 + 64}; trackbarZoom.Create(TRACKBAR_CLASS, m_hWnd, trackbarZoomPos, NULL, WS_CHILD | TBS_VERT | TBS_AUTOTICKS); @@ -44,149 +287,65 @@ LRESULT CToolSettingsWindow::OnVScroll(UINT nMsg, WPARAM wParam, LPARAM lParam, return 0; } +VOID CToolSettingsWindow::calculateTwoBoxes(RECT& rect1, RECT& rect2) +{ + RECT rcClient; + GetClientRect(&rcClient); + ::InflateRect(&rcClient, -MARGIN1, -MARGIN1); + + INT yCenter = (rcClient.top + rcClient.bottom) / 2; + ::SetRect(&rect1, rcClient.left, rcClient.top, rcClient.right, yCenter); + ::SetRect(&rect2, rcClient.left, yCenter, rcClient.right, rcClient.bottom); + + ::InflateRect(&rect1, -MARGIN2, -MARGIN2); + ::InflateRect(&rect2, -MARGIN2, -MARGIN2); +} + LRESULT CToolSettingsWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - PAINTSTRUCT ps; - RECT rect1 = { 0, 0, 42, 66 }; - RECT rect2 = { 0, 70, 42, 136 }; + RECT rect1, rect2; + calculateTwoBoxes(rect1, rect2); + PAINTSTRUCT ps; HDC hdc = BeginPaint(&ps); - 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); + + if (toolsModel.GetActiveTool() == TOOL_ZOOM) + ::DrawEdge(hdc, &rect1, BDR_SUNKENOUTER, BF_RECT); + else + ::DrawEdge(hdc, &rect1, BDR_SUNKENOUTER, BF_RECT | BF_MIDDLE); + + if (toolsModel.GetActiveTool() >= TOOL_RECT) + ::DrawEdge(hdc, &rect2, BDR_SUNKENOUTER, BF_RECT | BF_MIDDLE); + + ::InflateRect(&rect1, -MARGIN2, -MARGIN2); + ::InflateRect(&rect2, -MARGIN2, -MARGIN2); 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, m_hNontranspIcon, 40, 30, 0, NULL, DI_NORMAL); - DrawIconEx(hdc, 1, 33, m_hTranspIcon, 40, 30, 0, NULL, DI_NORMAL); + drawTrans(hdc, &rect1); 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)); + drawRubber(hdc, &rect1); 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); + drawBrush(hdc, &rect1); 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)); + drawAirBrush(hdc, &rect1); 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)); + drawLine(hdc, &rect1); 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)); + drawBox(hdc, &rect1); + drawLine(hdc, &rect2); break; - } case TOOL_FILL: case TOOL_COLOR: case TOOL_ZOOM: @@ -199,56 +358,54 @@ LRESULT CToolSettingsWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BO LRESULT CToolSettingsWindow::OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - int x = GET_X_LPARAM(lParam); - int y = GET_Y_LPARAM(lParam); + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + + RECT rect1, rect2; + calculateTwoBoxes(rect1, rect2); + RECT rects[12]; + + INT iItem; switch (toolsModel.GetActiveTool()) { case TOOL_FREESEL: case TOOL_RECTSEL: case TOOL_TEXT: - if ((y > 1) && (y < 64)) - toolsModel.SetBackgroundTransparent((y - 2) / 31); + iItem = getTransRects(rects, &rect1, &pt); + if (iItem != -1) + toolsModel.SetBackgroundTransparent(iItem); break; case TOOL_RUBBER: - if ((y > 1) && (y < 62)) - toolsModel.SetRubberRadius((y - 2) / 15 + 2); + iItem = getRubberRects(rects, &rect1, &pt); + if (iItem != -1) + toolsModel.SetRubberRadius(iItem + 2); break; case TOOL_BRUSH: - if ((x > 1) && (x < 40) && (y > 1) && (y < 62)) - toolsModel.SetBrushStyle((y - 2) / 15 * 3 + (x - 2) / 13); + iItem = getBrushRects(rects, &rect1, &pt); + if (iItem != -1) + toolsModel.SetBrushStyle(iItem); 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); - } - } + iItem = getAirBrushRects(rects, &rect1, &pt); + if (iItem != -1) + toolsModel.SetAirBrushWidth(s_AirRadius[iItem]); break; case TOOL_LINE: case TOOL_BEZIER: - if (y <= 62) - toolsModel.SetLineWidth((y - 2) / 12 + 1); + iItem = getLineRects(rects, &rect1, &pt); + if (iItem != -1) + toolsModel.SetLineWidth(iItem + 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); + iItem = getBoxRects(rects, &rect1, &pt); + if (iItem != -1) + toolsModel.SetShapeStyle(iItem); + + iItem = getLineRects(rects, &rect2, &pt); + if (iItem != -1) + toolsModel.SetLineWidth(iItem + 1); break; case TOOL_FILL: case TOOL_COLOR: diff --git a/base/applications/mspaint/toolsettings.h b/base/applications/mspaint/toolsettings.h index bd92d61a6ac..6ad02e22e09 100644 --- a/base/applications/mspaint/toolsettings.h +++ b/base/applications/mspaint/toolsettings.h @@ -24,10 +24,21 @@ public: MESSAGE_HANDLER(WM_DESTROY, OnDestroy) END_MSG_MAP() + BOOL DoCreate(HWND hwndParent); + +private: CWindow trackbarZoom; HICON m_hNontranspIcon; HICON m_hTranspIcon; + VOID drawTrans(HDC hdc, LPCRECT prc); + VOID drawRubber(HDC hdc, LPCRECT prc); + VOID drawBrush(HDC hdc, LPCRECT prc); + VOID drawLine(HDC hdc, LPCRECT prc); + VOID drawBox(HDC hdc, LPCRECT prc); + VOID drawAirBrush(HDC hdc, LPCRECT prc); + VOID calculateTwoBoxes(RECT& rect1, RECT& rect2); + LRESULT OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnDestroy(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnVScroll(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); diff --git a/base/applications/mspaint/winproc.cpp b/base/applications/mspaint/winproc.cpp index ee4e9daa87a..5208e37d610 100644 --- a/base/applications/mspaint/winproc.cpp +++ b/base/applications/mspaint/winproc.cpp @@ -426,7 +426,7 @@ LRESULT CMainWindow::OnGetMinMaxInfo(UINT nMsg, WPARAM wParam, LPARAM lParam, BO { MINMAXINFO *mm = (LPMINMAXINFO) lParam; mm->ptMinTrackSize.x = 330; - mm->ptMinTrackSize.y = 430; + mm->ptMinTrackSize.y = 360; return 0; }