📄 ecscrolwin.cpp
字号:
else if ( (m_xScrollPosition + nScrollInc) > noPositions ) nScrollInc = noPositions - m_xScrollPosition; // As +ve as we can go } else m_targetWindow->Refresh(); } else { if (m_yScrollPixelsPerLine > 0) { int w, h; m_targetWindow->GetClientSize(&w, &h); int nMaxHeight = m_yScrollLines*m_yScrollPixelsPerLine; int noPositions = (int) ( ((nMaxHeight - h)/(double)m_yScrollPixelsPerLine) + 0.5 ); if (noPositions < 0) noPositions = 0; if ( (m_yScrollPosition + nScrollInc) < 0 ) nScrollInc = -m_yScrollPosition; // As -ve as we can go else if ( (m_yScrollPosition + nScrollInc) > noPositions ) nScrollInc = noPositions - m_yScrollPosition; // As +ve as we can go } else m_targetWindow->Refresh(); } return nScrollInc;}// Adjust the scrollbars - new version.void ecScrolledWindow::AdjustScrollbars(){ int w, h; m_targetWindow->GetClientSize(&w, &h); int oldXScroll = m_xScrollPosition; int oldYScroll = m_yScrollPosition; if (m_xScrollLines > 0) { // Calculate page size i.e. number of scroll units you get on the // current client window int noPagePositions = (int) ( (w/(double)m_xScrollPixelsPerLine) + 0.5 ); if (noPagePositions < 1) noPagePositions = 1; // Correct position if greater than extent of canvas minus // the visible portion of it or if below zero m_xScrollPosition = wxMin( m_xScrollLines-noPagePositions, m_xScrollPosition); m_xScrollPosition = wxMax( 0, m_xScrollPosition ); SetScrollbar(wxHORIZONTAL, m_xScrollPosition, noPagePositions, m_xScrollLines); // The amount by which we scroll when paging SetScrollPageSize(wxHORIZONTAL, noPagePositions); } else { m_xScrollPosition = 0; SetScrollbar (wxHORIZONTAL, 0, 0, 0, FALSE); } if (m_yScrollLines > 0) { // Calculate page size i.e. number of scroll units you get on the // current client window int noPagePositions = (int) ( (h/(double)m_yScrollPixelsPerLine) + 0.5 ); if (noPagePositions < 1) noPagePositions = 1; // Correct position if greater than extent of canvas minus // the visible portion of it or if below zero m_yScrollPosition = wxMin( m_yScrollLines-noPagePositions, m_yScrollPosition ); m_yScrollPosition = wxMax( 0, m_yScrollPosition ); SetScrollbar(wxVERTICAL, m_yScrollPosition, noPagePositions, m_yScrollLines); // The amount by which we scroll when paging SetScrollPageSize(wxVERTICAL, noPagePositions); } else { m_yScrollPosition = 0; SetScrollbar (wxVERTICAL, 0, 0, 0, FALSE); } if (oldXScroll != m_xScrollPosition) { if (m_xScrollingEnabled) m_targetWindow->ScrollWindow( m_xScrollPixelsPerLine * (oldXScroll-m_xScrollPosition), 0, (const wxRect *) NULL ); else m_targetWindow->Refresh(); } if (oldYScroll != m_yScrollPosition) { if (m_yScrollingEnabled) m_targetWindow->ScrollWindow( 0, m_yScrollPixelsPerLine * (oldYScroll-m_yScrollPosition), (const wxRect *) NULL ); else m_targetWindow->Refresh(); }}// Override this function if you don't want to have ecScrolledWindow// automatically change the origin according to the scroll position.void ecScrolledWindow::PrepareDC(wxDC& dc){ dc.SetDeviceOrigin( -m_xScrollPosition * m_xScrollPixelsPerLine, -m_yScrollPosition * m_yScrollPixelsPerLine ); dc.SetUserScale( m_scaleX, m_scaleY );}#if WXWIN_COMPATIBILITYvoid ecScrolledWindow::GetScrollUnitsPerPage (int *x_page, int *y_page) const{ *x_page = GetScrollPageSize(wxHORIZONTAL); *y_page = GetScrollPageSize(wxVERTICAL);}void ecScrolledWindow::CalcUnscrolledPosition(int x, int y, float *xx, float *yy) const{ if ( xx ) *xx = (float)(x + m_xScrollPosition * m_xScrollPixelsPerLine); if ( yy ) *yy = (float)(y + m_yScrollPosition * m_yScrollPixelsPerLine);}#endif // WXWIN_COMPATIBILITYvoid ecScrolledWindow::GetScrollPixelsPerUnit (int *x_unit, int *y_unit) const{ if ( x_unit ) *x_unit = m_xScrollPixelsPerLine; if ( y_unit ) *y_unit = m_yScrollPixelsPerLine;}int ecScrolledWindow::GetScrollPageSize(int orient) const{ if ( orient == wxHORIZONTAL ) return m_xScrollLinesPerPage; else return m_yScrollLinesPerPage;}void ecScrolledWindow::SetScrollPageSize(int orient, int pageSize){ if ( orient == wxHORIZONTAL ) m_xScrollLinesPerPage = pageSize; else m_yScrollLinesPerPage = pageSize;}/* * Scroll to given position (scroll position, not pixel position) */void ecScrolledWindow::Scroll( int x_pos, int y_pos ){ if (!m_targetWindow) return; if (((x_pos == -1) || (x_pos == m_xScrollPosition)) && ((y_pos == -1) || (y_pos == m_yScrollPosition))) return; int w, h; m_targetWindow->GetClientSize(&w, &h); if ((x_pos != -1) && (m_xScrollPixelsPerLine)) { int old_x = m_xScrollPosition; m_xScrollPosition = x_pos; // Calculate page size i.e. number of scroll units you get on the // current client window int noPagePositions = (int) ( (w/(double)m_xScrollPixelsPerLine) + 0.5 ); if (noPagePositions < 1) noPagePositions = 1; // Correct position if greater than extent of canvas minus // the visible portion of it or if below zero m_xScrollPosition = wxMin( m_xScrollLines-noPagePositions, m_xScrollPosition ); m_xScrollPosition = wxMax( 0, m_xScrollPosition ); if (old_x != m_xScrollPosition) { m_targetWindow->SetScrollPos( wxHORIZONTAL, m_xScrollPosition, TRUE ); m_targetWindow->ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0 ); } } if ((y_pos != -1) && (m_yScrollPixelsPerLine)) { int old_y = m_yScrollPosition; m_yScrollPosition = y_pos; // Calculate page size i.e. number of scroll units you get on the // current client window int noPagePositions = (int) ( (h/(double)m_yScrollPixelsPerLine) + 0.5 ); if (noPagePositions < 1) noPagePositions = 1; // Correct position if greater than extent of canvas minus // the visible portion of it or if below zero m_yScrollPosition = wxMin( m_yScrollLines-noPagePositions, m_yScrollPosition ); m_yScrollPosition = wxMax( 0, m_yScrollPosition ); if (old_y != m_yScrollPosition) { m_targetWindow->SetScrollPos( wxVERTICAL, m_yScrollPosition, TRUE ); m_targetWindow->ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine ); } }#ifdef __WXMAC__ m_targetWindow->MacUpdateImmediately();#endif}void ecScrolledWindow::EnableScrolling (bool x_scroll, bool y_scroll){ m_xScrollingEnabled = x_scroll; m_yScrollingEnabled = y_scroll;}void ecScrolledWindow::GetVirtualSize (int *x, int *y) const{ if ( x ) *x = m_xScrollPixelsPerLine * m_xScrollLines; if ( y ) *y = m_yScrollPixelsPerLine * m_yScrollLines;}// Where the current view starts fromvoid ecScrolledWindow::GetViewStart (int *x, int *y) const{ if ( x ) *x = m_xScrollPosition; if ( y ) *y = m_yScrollPosition;}void ecScrolledWindow::CalcScrolledPosition(int x, int y, int *xx, int *yy) const{ if ( xx ) *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine; if ( yy ) *yy = y - m_yScrollPosition * m_yScrollPixelsPerLine;}void ecScrolledWindow::CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const{ if ( xx ) *xx = x + m_xScrollPosition * m_xScrollPixelsPerLine; if ( yy ) *yy = y + m_yScrollPosition * m_yScrollPixelsPerLine;}// ----------------------------------------------------------------------------// event handlers// ----------------------------------------------------------------------------// Default OnSize resets scrollbars, if anyvoid ecScrolledWindow::OnSize(wxSizeEvent& WXUNUSED(event)){#if wxUSE_CONSTRAINTS if (GetAutoLayout()) Layout();#endif AdjustScrollbars();}// This calls OnDraw, having adjusted the origin according to the current// scroll positionvoid ecScrolledWindow::OnPaint(wxPaintEvent& WXUNUSED(event)){ wxPaintDC dc(this); PrepareDC(dc); OnDraw(dc);}// kbd handling: notice that we use OnChar() and not OnKeyDown() for// compatibility here - if we used OnKeyDown(), the programs which process// arrows themselves in their OnChar() would never get the message and like// this they always have the priorityvoid ecScrolledWindow::OnChar(wxKeyEvent& event){ int stx, sty, // view origin szx, szy, // view size (total) clix, cliy; // view size (on screen) ViewStart(&stx, &sty); GetClientSize(&clix, &cliy); GetVirtualSize(&szx, &szy); if( m_xScrollPixelsPerLine ) { clix /= m_xScrollPixelsPerLine; szx /= m_xScrollPixelsPerLine; } else { clix = 0; szx = -1; } if( m_yScrollPixelsPerLine ) { cliy /= m_yScrollPixelsPerLine; szy /= m_yScrollPixelsPerLine; } else { cliy = 0; szy = -1; } int dsty; switch ( event.KeyCode() ) { case WXK_PAGEUP: case WXK_PRIOR: dsty = sty - (5 * cliy / 6); Scroll(-1, (dsty == -1) ? 0 : dsty); break; case WXK_PAGEDOWN: case WXK_NEXT: Scroll(-1, sty + (5 * cliy / 6)); break; case WXK_HOME: Scroll(0, event.ControlDown() ? 0 : -1); break; case WXK_END: Scroll(szx - clix, event.ControlDown() ? szy - cliy : -1); break; case WXK_UP: Scroll(-1, sty - 1); break; case WXK_DOWN: Scroll(-1, sty + 1); break; case WXK_LEFT: Scroll(stx - 1, -1); break; case WXK_RIGHT: Scroll(stx + 1, -1); break; default: // not for us event.Skip(); }}#endif// ecUSE_OWN_SCROLLED_WINDOW
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -