⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecscrolwin.cpp

📁 ecos实时嵌入式操作系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            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 + -