https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3d48aa2992d8c9c20d6cf7...
commit 3d48aa2992d8c9c20d6cf72065dc02fc07d3553b Author: Ștefan Fulea reactos-contributor@programmer.net AuthorDate: Sat Nov 17 00:05:51 2018 +0200 Commit: Hermès BÉLUSCA - MAÏTO hermes.belusca-maito@reactos.org CommitDate: Fri Nov 16 23:05:51 2018 +0100
[MSPAINT] Fix scrollbar presence on canvas/view fitting (#878)
* [MSPAINT] Fix scrollbar presence on canvas/view fitting
This is a small fix for a scrollbar related edge case functionality exhibited in mspaint (and in a lesser degree also elsewhere in instances of) scrollbar controlled content. As known, the scrollbars presence is given by the size ratio between the accommodating outer frame and the scroll-controlled contents inside it, and it works for the most part. There is, however, a case where the presence of both toolbars is kept even when the contents would fit the frame (if not for the scrollba [...]
* [MSPAINT] Fix a small mistake and improve readability in UpdateScrollbox()
Although with no visible impact on testing, I've used a wrong constant related to vertical scrollbox width in one instance (SM_CXHSCROLL instead of SM_CXVSCROLL), and this fixes it. Also, prefer using constants, to improve a bit readability and performance (by avoiding repeated function calls). --- base/applications/mspaint/scrollbox.cpp | 84 ++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 13 deletions(-)
diff --git a/base/applications/mspaint/scrollbox.cpp b/base/applications/mspaint/scrollbox.cpp index b0ef7373c7..351c59c717 100644 --- a/base/applications/mspaint/scrollbox.cpp +++ b/base/applications/mspaint/scrollbox.cpp @@ -9,31 +9,89 @@ /* INCLUDES *********************************************************/
#include "precomp.h" +#include <atltypes.h> + +/* + * Scrollbar functional modes: + * 0 view < canvas + * 1 view < canvas + scroll width + * 2 view >= canvas + scroll width + * + * Matrix of scrollbar presence (VERTICAL,HORIZONTAL) given by + * vertical & horizontal scrollbar modes (view:canvas ratio): + * + * horizontal mode + * | 0 | 1 | 2 + * vertical ---+-------------+-------------+------------ + * mode 0 | TRUE,TRUE | TRUE,TRUE | TRUE,FALSE + * ---+-------------+-------------+------------ + * 1 | TRUE,TRUE | FALSE,FALSE | FALSE,FALSE + * ---+-------------+-------------+------------ + * 2 | FALSE,TRUE | FALSE,FALSE | FALSE,FALSE + */ + +struct ScrollbarPresence +{ + BOOL bVert; + BOOL bHoriz; +}; + +CONST ScrollbarPresence sp_mx[3][3] = +{ + { { TRUE,TRUE }, { TRUE,TRUE }, { TRUE,FALSE } }, + { { TRUE,TRUE }, { FALSE,FALSE }, { FALSE,FALSE } }, + { { FALSE,TRUE }, { FALSE,FALSE }, { FALSE,FALSE } } +}; + +CONST INT HSCROLL_WIDTH = ::GetSystemMetrics(SM_CYHSCROLL); +CONST INT VSCROLL_WIDTH = ::GetSystemMetrics(SM_CXVSCROLL); +
/* FUNCTIONS ********************************************************/
void UpdateScrollbox() { - RECT clientRectScrollbox; - RECT clientRectImageArea; + CONST INT EXTRASIZE = 5; /* 3 px of selection markers + 2 px of border */ + + CRect tempRect; + CSize sizeImageArea; + CSize sizeScrollBox; + INT vmode, hmode; SCROLLINFO si; - scrollboxWindow.GetClientRect(&clientRectScrollbox); - imageArea.GetClientRect(&clientRectImageArea); + + scrollboxWindow.GetWindowRect(&tempRect); + sizeScrollBox = CSize(tempRect.Width(), tempRect.Height()); + + imageArea.GetClientRect(&tempRect); + sizeImageArea = CSize(tempRect.Width(), tempRect.Height()); + sizeImageArea += CSize(EXTRASIZE * 2, EXTRASIZE * 2); + + /* show/hide the scrollbars */ + vmode = (sizeScrollBox.cy < sizeImageArea.cy ? 0 : + (sizeScrollBox.cy < sizeImageArea.cy + HSCROLL_WIDTH ? 1 : 2)); + hmode = (sizeScrollBox.cx < sizeImageArea.cx ? 0 : + (sizeScrollBox.cx < sizeImageArea.cx + VSCROLL_WIDTH ? 1 : 2)); + scrollboxWindow.ShowScrollBar(SB_VERT, sp_mx[vmode][hmode].bVert); + scrollboxWindow.ShowScrollBar(SB_HORZ, sp_mx[vmode][hmode].bHoriz); + si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_PAGE | SIF_RANGE; - si.nMax = clientRectImageArea.right + 6 - 1; si.nMin = 0; - si.nPage = clientRectScrollbox.right; + + si.nMax = sizeImageArea.cx + + (sp_mx[vmode][hmode].bVert == TRUE ? HSCROLL_WIDTH : 0); + si.nPage = sizeScrollBox.cx; scrollboxWindow.SetScrollInfo(SB_HORZ, &si); - scrollboxWindow.GetClientRect(&clientRectScrollbox); - si.nMax = clientRectImageArea.bottom + 6 - 1; - si.nPage = clientRectScrollbox.bottom; + + si.nMax = sizeImageArea.cy + + (sp_mx[vmode][hmode].bHoriz == TRUE ? VSCROLL_WIDTH : 0); + si.nPage = sizeScrollBox.cy; scrollboxWindow.SetScrollInfo(SB_VERT, &si); - scrlClientWindow.MoveWindow( - -scrollboxWindow.GetScrollPos(SB_HORZ), -scrollboxWindow.GetScrollPos(SB_VERT), - max(clientRectImageArea.right + 6, clientRectScrollbox.right), - max(clientRectImageArea.bottom + 6, clientRectScrollbox.bottom), TRUE); + + scrlClientWindow.MoveWindow(-scrollboxWindow.GetScrollPos(SB_HORZ), + -scrollboxWindow.GetScrollPos(SB_VERT), + sizeImageArea.cx, sizeImageArea.cy, TRUE); }
LRESULT CScrollboxWindow::OnSize(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)