//--------------------------------------------------------------------------- #include #pragma hdrstop #include "ScrollViewUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- __fastcall TScrollView::TScrollView(TComponent* Owner) : TPanelDB( Owner ) { m_ScrollBar = NULL; m_iTotalLine = 0; m_iTopLine = 0; m_iShowLine = 0; FBorder = 0; FScrollBarWidth = 0; } //--------------------------------------------------------------------------- __fastcall TScrollView::~TScrollView() { SAFE_DELETE(m_ScrollBar) } //--------------------------------------------------------------------------- void __fastcall TScrollView::WMEraseBkgnd(TWMEraseBkgnd &Message) { Message.Result = true; } //--------------------------------------------------------------------------- void __fastcall TScrollView::WMSize(Winapi::Messages::TWMSize &Message) { TPanelDB::WMSize(Message); SBSizeChange(); if( FChangeSize ) FChangeSize(this, m_RtContent); } //--------------------------------------------------------------------------- void __fastcall TScrollView::WMVScroll(Winapi::Messages::TWMScroll &Message) { if( !m_ScrollBar ) return; int minpos, maxpos, page, curpos; m_ScrollBar->GetScrollRange(&minpos, &maxpos); page = m_ScrollBar->GetPageSize(); // Get the current position of scroll box. curpos = m_ScrollBar->GetScrollPos(); // Determine the new position of scroll box. switch (Message.ScrollCode) { case SB_TOP: // Scroll to far top. curpos = minpos; break; case SB_BOTTOM: // Scroll to far bottom. curpos = maxpos-page+1; break; case SB_ENDSCROLL: // End scroll. break; case SB_LINEUP: // Scroll left. if (curpos > minpos) curpos--; break; case SB_LINEDOWN: // Scroll right. if (curpos < maxpos-page+1) curpos++; break; case SB_PAGEUP: // Scroll one page left. if (curpos > minpos) curpos = (minpos > curpos-page) ? minpos : curpos-page; //max(minpos, curpos-page); break; case SB_PAGEDOWN: // Scroll one page right. if( curposHandle ){ m_ScrollBar->SetPosition(curpos); } if( m_iTopLine != curpos ){ m_iTopLine = curpos; } Message.Result = true; if( OnChangeSBPos ) OnChangeSBPos( this, Message.ScrollCode, m_iTopLine ); if( FOnMouseWheel ) FOnMouseWheel(this); } //--------------------------------------------------------------------------- void __fastcall TScrollView::WMMouseWheel(TWMMouseWheel &Message) { if( m_ScrollBar && m_ScrollBar->Visible ){ UINT nSBCode; if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP; else nSBCode = SB_LINEDOWN; Perform( WM_VSCROLL, MAKELONG(nSBCode,0), NULL ); } } //--------------------------------------------------------------------------- void __fastcall TScrollView::SBSizeChange() { int nTitle = 0; int nBottom = 0; if( FOnHgtTitle ) nTitle = FOnHgtTitle(this); if( FOnHgtBottom ) nBottom = FOnHgtBottom(this); if(m_ScrollBar && m_iTotalLine>m_iShowLine && m_iTotalLine && m_iShowLine ){ m_ScrollBar->Left = Width - m_ScrollBar->Width - FBorder; if(0==nTitle) { m_ScrollBar->Top = FBorder; } else { m_ScrollBar->Top = nTitle; } if(0==nBottom) m_ScrollBar->Height = Height-m_ScrollBar->Top-FBorder; else m_ScrollBar->Height = Height-m_ScrollBar->Top-nBottom; m_RtContent = TRect(FBorder, m_ScrollBar->Top, FBorder+Width-2*FBorder-m_ScrollBar->Width, m_ScrollBar->Top+m_ScrollBar->Height); }else { int iLeft, iTop, iWidth, iHeight; if(0==nTitle) iTop = FBorder; else iTop = nTitle; if(0==nBottom) iHeight = Height-iTop-FBorder; else iHeight = Height-iTop-nBottom; m_RtContent = TRect(FBorder, iTop, FBorder+Width-2*FBorder, iTop+iHeight); } } //--------------------------------------------------------------------------- bool __fastcall TScrollView::SetSB(int iTotalLine, int iShowLine, int iTopLine) { bool bSucess = false; if( !m_ScrollBar ) { m_ScrollBar = new TSkinScrollBar(this); m_ScrollBar->m_pWndCtrl = this; m_ScrollBar->Parent = this; } m_iTotalLine = iTotalLine; m_iShowLine = iShowLine; m_iTopLine = iTopLine; SBSizeChange(); if( m_iTotalLine>m_iShowLine ) { m_ScrollBar->SetRange(0, iTotalLine-1); m_ScrollBar->SetPageSize(iShowLine); if(iTopLine>iTotalLine-iShowLine+1) { iTopLine = iTotalLine-iShowLine+1; } m_ScrollBar->SetPosition(iTopLine); m_ScrollBar->Visible = true; m_ScrollBar->Invalidate(); bSucess = true; }else{ if(m_ScrollBar) m_ScrollBar->Visible = false; } FScrollBarWidth = m_ScrollBar->Width; return bSucess; } //---------------------------------------------------------------------------