From 2bfcc048743d319117ead6359b806e327d37618e Mon Sep 17 00:00:00 2001 From: Katsuhisa Yuasa Date: Mon, 17 Sep 2018 03:59:08 +0900 Subject: [PATCH 1/4] =?UTF-8?q?SetScrollInfo=20=E3=81=AE=E5=91=BC=E3=81=B3?= =?UTF-8?q?=E5=87=BA=E3=81=97=E3=82=92=E6=8A=91=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/view/CEditView_Scroll.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/sakura_core/view/CEditView_Scroll.cpp b/sakura_core/view/CEditView_Scroll.cpp index e5354c9f00..3a4290ae4b 100644 --- a/sakura_core/view/CEditView_Scroll.cpp +++ b/sakura_core/view/CEditView_Scroll.cpp @@ -312,7 +312,11 @@ void CEditView::AdjustScrollBars() si.nPage = (Int)GetTextArea().m_nViewRowNum / nVScrollRate; /* 表示域の行数 */ si.nPos = (Int)GetTextArea().GetViewTopLine() / nVScrollRate; /* 表示域の一番上の行(0開始) */ si.nTrackPos = 0; - ::SetScrollInfo( m_hwndVScrollBar, SB_CTL, &si, TRUE ); + SCROLLINFO siPrev = si; + ::GetScrollInfo( m_hwndVScrollBar, SB_CTL, &siPrev ); + siPrev.nTrackPos = 0; + if (memcmp(&si, &siPrev, sizeof(si)) != 0) + ::SetScrollInfo( m_hwndVScrollBar, SB_CTL, &si, TRUE ); m_nVScrollRate = nVScrollRate; /* 垂直スクロールバーの縮尺 */ // Nov. 16, 2002 genta @@ -335,8 +339,12 @@ void CEditView::AdjustScrollBars() si.nMax = (Int)GetRightEdgeForScrollBar() - 1; // 2009.08.28 nasukoji スクロールバー制御用の右端座標を取得 si.nPage = (Int)GetTextArea().m_nViewColNum; /* 表示域の桁数 */ si.nPos = (Int)GetTextArea().GetViewLeftCol(); /* 表示域の一番左の桁(0開始) */ - si.nTrackPos = 1; - ::SetScrollInfo( m_hwndHScrollBar, SB_CTL, &si, TRUE ); + si.nTrackPos = 0; + SCROLLINFO siPrev = si; + ::GetScrollInfo( m_hwndHScrollBar, SB_CTL, &siPrev ); + siPrev.nTrackPos = 0; + if (memcmp(&si, &siPrev, sizeof(si)) != 0) + ::SetScrollInfo( m_hwndHScrollBar, SB_CTL, &si, TRUE ); // 2006.1.28 aroka 判定条件誤り修正 (バーが消えてもスクロールしない) bEnable = ( GetTextArea().m_nViewColNum < GetRightEdgeForScrollBar() ); From f24ebf2ef04fc98c630eae6c18f8f8c14b765df9 Mon Sep 17 00:00:00 2001 From: Katsuhisa Yuasa Date: Wed, 19 Sep 2018 02:01:18 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/view/CEditView_Scroll.cpp | 66 ++++++++++++++++----------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/sakura_core/view/CEditView_Scroll.cpp b/sakura_core/view/CEditView_Scroll.cpp index 3a4290ae4b..9b839436ff 100644 --- a/sakura_core/view/CEditView_Scroll.cpp +++ b/sakura_core/view/CEditView_Scroll.cpp @@ -273,6 +273,33 @@ CLayoutInt CEditView::OnHScroll( int nScrollCode, int nPos ) return nScrollVal; } +static void setScrollInfoIfNeeded(HWND hWndScrollBar, int nMax, UINT nPage, int nPos) +{ + SCROLLINFO siPrev; + siPrev.cbSize = sizeof(siPrev); + siPrev.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; + if (!::GetScrollInfo( hWndScrollBar, SB_CTL, &siPrev )) { + return; + } + if (siPrev.nMin != 0 + || siPrev.nMax != nMax + || siPrev.nPage != nPage + || siPrev.nPos != nPos) + { + if (nMax + 1 < (int)nPage) { + nPage = (UINT)(nMax + 1); + } + SCROLLINFO si; + si.cbSize = sizeof( si ); + si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; + si.nMin = 0; + si.nMax = nMax; + si.nPage = nPage; + si.nPos = nPos; + ::SetScrollInfo( hWndScrollBar, SB_CTL, &si, TRUE ); + } +} + /** スクロールバーの状態を更新する タブバーのタブ切替時は SIF_DISABLENOSCROLL フラグでの有効化/無効化が正常に動作しない @@ -289,9 +316,7 @@ void CEditView::AdjustScrollBars() return; } - - SCROLLINFO si; - bool bEnable; + bool bEnable; if( NULL != m_hwndVScrollBar ){ /* 垂直スクロールバー */ @@ -305,18 +330,12 @@ void CEditView::AdjustScrollBars() ++nVScrollRate; } #endif - si.cbSize = sizeof( si ); - si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; - si.nMin = 0; - si.nMax = (Int)nAllLines / nVScrollRate - 1; /* 全行数 */ - si.nPage = (Int)GetTextArea().m_nViewRowNum / nVScrollRate; /* 表示域の行数 */ - si.nPos = (Int)GetTextArea().GetViewTopLine() / nVScrollRate; /* 表示域の一番上の行(0開始) */ - si.nTrackPos = 0; - SCROLLINFO siPrev = si; - ::GetScrollInfo( m_hwndVScrollBar, SB_CTL, &siPrev ); - siPrev.nTrackPos = 0; - if (memcmp(&si, &siPrev, sizeof(si)) != 0) - ::SetScrollInfo( m_hwndVScrollBar, SB_CTL, &si, TRUE ); + + setScrollInfoIfNeeded(m_hwndVScrollBar, + (Int)nAllLines / nVScrollRate - 1, /* 全行数 */ + (Int)GetTextArea().m_nViewRowNum / nVScrollRate, /* 表示域の行数 */ + (Int)GetTextArea().GetViewTopLine() / nVScrollRate /* 表示域の一番上の行(0開始) */ + ); m_nVScrollRate = nVScrollRate; /* 垂直スクロールバーの縮尺 */ // Nov. 16, 2002 genta @@ -333,18 +352,11 @@ void CEditView::AdjustScrollBars() } if( NULL != m_hwndHScrollBar ){ /* 水平スクロールバー */ - si.cbSize = sizeof( si ); - si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; - si.nMin = 0; - si.nMax = (Int)GetRightEdgeForScrollBar() - 1; // 2009.08.28 nasukoji スクロールバー制御用の右端座標を取得 - si.nPage = (Int)GetTextArea().m_nViewColNum; /* 表示域の桁数 */ - si.nPos = (Int)GetTextArea().GetViewLeftCol(); /* 表示域の一番左の桁(0開始) */ - si.nTrackPos = 0; - SCROLLINFO siPrev = si; - ::GetScrollInfo( m_hwndHScrollBar, SB_CTL, &siPrev ); - siPrev.nTrackPos = 0; - if (memcmp(&si, &siPrev, sizeof(si)) != 0) - ::SetScrollInfo( m_hwndHScrollBar, SB_CTL, &si, TRUE ); + setScrollInfoIfNeeded(m_hwndHScrollBar, + (Int)GetRightEdgeForScrollBar() - 1, // 2009.08.28 nasukoji スクロールバー制御用の右端座標を取得 + (Int)GetTextArea().m_nViewColNum, /* 表示域の桁数 */ + (Int)GetTextArea().GetViewLeftCol() /* 表示域の一番左の桁(0開始) */ + ); // 2006.1.28 aroka 判定条件誤り修正 (バーが消えてもスクロールしない) bEnable = ( GetTextArea().m_nViewColNum < GetRightEdgeForScrollBar() ); From b178891f4e370615cdc7cb57dc7ea08386750ac4 Mon Sep 17 00:00:00 2001 From: Katsuhisa Yuasa Date: Thu, 20 Sep 2018 02:16:53 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=E6=94=B9=E8=A1=8C=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/view/CEditView_Scroll.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sakura_core/view/CEditView_Scroll.cpp b/sakura_core/view/CEditView_Scroll.cpp index 9b839436ff..43b1ed05f0 100644 --- a/sakura_core/view/CEditView_Scroll.cpp +++ b/sakura_core/view/CEditView_Scroll.cpp @@ -332,8 +332,8 @@ void CEditView::AdjustScrollBars() #endif setScrollInfoIfNeeded(m_hwndVScrollBar, - (Int)nAllLines / nVScrollRate - 1, /* 全行数 */ - (Int)GetTextArea().m_nViewRowNum / nVScrollRate, /* 表示域の行数 */ + (Int)nAllLines / nVScrollRate - 1, /* 全行数 */ + (Int)GetTextArea().m_nViewRowNum / nVScrollRate, /* 表示域の行数 */ (Int)GetTextArea().GetViewTopLine() / nVScrollRate /* 表示域の一番上の行(0開始) */ ); m_nVScrollRate = nVScrollRate; /* 垂直スクロールバーの縮尺 */ @@ -353,8 +353,8 @@ void CEditView::AdjustScrollBars() if( NULL != m_hwndHScrollBar ){ /* 水平スクロールバー */ setScrollInfoIfNeeded(m_hwndHScrollBar, - (Int)GetRightEdgeForScrollBar() - 1, // 2009.08.28 nasukoji スクロールバー制御用の右端座標を取得 - (Int)GetTextArea().m_nViewColNum, /* 表示域の桁数 */ + (Int)GetRightEdgeForScrollBar() - 1, // 2009.08.28 nasukoji スクロールバー制御用の右端座標を取得 + (Int)GetTextArea().m_nViewColNum, /* 表示域の桁数 */ (Int)GetTextArea().GetViewLeftCol() /* 表示域の一番左の桁(0開始) */ ); From 494e1cf1f39515276546966a5bee173781055d68 Mon Sep 17 00:00:00 2001 From: Katsuhisa Yuasa Date: Thu, 20 Sep 2018 12:27:44 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/view/CEditView_Scroll.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/sakura_core/view/CEditView_Scroll.cpp b/sakura_core/view/CEditView_Scroll.cpp index 43b1ed05f0..dcefb80faa 100644 --- a/sakura_core/view/CEditView_Scroll.cpp +++ b/sakura_core/view/CEditView_Scroll.cpp @@ -281,14 +281,24 @@ static void setScrollInfoIfNeeded(HWND hWndScrollBar, int nMax, UINT nPage, int if (!::GetScrollInfo( hWndScrollBar, SB_CTL, &siPrev )) { return; } + // nPage と nPos を範囲内に収める + // https://docs.microsoft.com/en-ca/windows/desktop/api/winuser/nf-winuser-setscrollinfo#remarks + constexpr int nMin = 0; + const UINT nPageMax = (UINT)(nMax - nMin + 1); + if (nPage > nPageMax) { + nPage = nPageMax; + } + if (nPos < nMin) { + nPos = nMin; + } + if (nPos > nMax) { + nPos = nMax; + } if (siPrev.nMin != 0 || siPrev.nMax != nMax || siPrev.nPage != nPage || siPrev.nPos != nPos) { - if (nMax + 1 < (int)nPage) { - nPage = (UINT)(nMax + 1); - } SCROLLINFO si; si.cbSize = sizeof( si ); si.fMask = SIF_ALL | SIF_DISABLENOSCROLL;