//--------------------------------------------------------------------------- #include #pragma hdrstop #include #include "SkinScrollBarUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //add by tj 2013/11/21 #define PIXEL_EXTERNAL_FRAME 1 #define PIXEL_EX2INTERNAL 1 #define PIXEL_INTERNAL_FARME 1 #define PIXEL_INTERNAL_BOUND 1 #define PIXEL_INTERNAL_LINE 6 //add by tj 2013/12/10 static const COLORREF RGB_EXTERNAL_FRAME = RGB(29,31,35), RGB_EXTERNAL_NOR = RGB(60,66,72), RGB_EXTERNAL_HIG = RGB(74,80,88), RGB_INTERNAL_NOR = RGB(39,42,47), //272a2f RGB_INTERNAL_HIG = RGB(74,80,88), //4a5058 RGB_INTERNAL_PUSH = RGB(50,54,60), //32363c RGB_INTERNAL_LINE_NOR = RGB(25,27,30), //191b1e RGB_INTERNAL_LINE_HIG = RGB(58,63,69), //3a3f45 RGB_INTERNAL_LINE_PUSH = RGB(38,41,45), //26292d RGB_INTERNAL_LINE_NOR_TRANS[6] ={ RGB(44,47,53), //2c2f35 RGB(47,51,57), RGB(52,55,62), RGB(56,59,67), RGB(57,59,69), RGB(59,61,71) }, RGB_INTERNAL_LINE_HIG_TRANS[6] ={ RGB(79,86,94),//4f565e RGB(83,90,99), RGB(87,94,104), RGB(91,99,109), RGB(92,100,111), RGB(94,104,115), }, RGB_INTERNAL_LINE_PUSH_TRANS[6] ={ RGB(55,59,66), //373b42 RGB(60,65,72), RGB(64,69,77), RGB(69,75,83), RGB(70,77,86), RGB(72,79,88) }, RGB_INTERNAL_FRAME_NOR = RGB(34,36,41), RGB_INTERNAL_ROUND_BKG_N_NOR = RGB(41,44,49), RGB_INTERNAL_ROUND_BKG_N_HIG = RGB(51,55,61), RGB_INTERNAL_ROUND_BKG_H_NOR = RGB(43,46,52), RGB_INTERNAL_ROUND_BKG_H_HIG = RGB(56,61,67); //--------------------------------------------------------------------------- TBitmap *u_pPicLineUp = NULL, *u_pPicLineDown = NULL, *u_pPicLineLeft = NULL, *u_pPicLineRight = NULL; int u_nPicRef = 0; void InitialPictures() { if( u_nPicRef==0 ){ u_pPicLineUp = new TBitmap(); u_pPicLineUp->LoadFromResourceName(int(HInstance), L"SBLineUp"); u_pPicLineDown = new TBitmap(); u_pPicLineDown->LoadFromResourceName(int(HInstance), L"SBLineDown"); u_pPicLineLeft = new TBitmap(); u_pPicLineLeft->LoadFromResourceName(int(HInstance), L"SBLineLeft"); u_pPicLineRight = new TBitmap(); u_pPicLineRight->LoadFromResourceName(int(HInstance), L"SBLineRight"); } u_nPicRef++; } void ReleasePictures() { u_nPicRef--; if( u_nPicRef==0 ){ delete u_pPicLineUp; delete u_pPicLineDown; delete u_pPicLineLeft; delete u_pPicLineRight; } } //--------------------------------------------------------------------------- __fastcall TSkinScrollBar::TSkinScrollBar(TComponent* AOwner, bool bVertical) : TScrollBar(AOwner) { Visible = false; ParentCtl3D = false; //add by tj 2013/11/14 InitialPictures(); Kind = bVertical ? sbVertical : sbHorizontal; if( bVertical ) Width = u_pPicLineUp->Height;//add by tj 2013/11/19 else Height = u_pPicLineLeft->Width; DoubleBuffered = TRUE; m_nThumbSize = 0; m_nThumbPos = bVertical ? Width : Height; m_nPreThumbPos = bVertical ? Width : Height; // m_nTileHeight = 18; //add by tj 2013/11/14 m_nTrackPos = m_nMax = m_nMin = m_nPos = m_nPage = 0; m_iClicked = -1; m_iHitPrev = -1; m_bAction = m_bPause = m_bNotify = m_bDrag = m_bTrace = false; m_pCanvas = new TControlCanvas(); m_pCanvas->Control = this; Ctl3D = false; //鼠标长期按下的计时器 m_pTimer = new TTimer(this); m_pTimer->Enabled = false; m_pTimer->OnTimer = TimerProc; OnMouseEnter = CMMouseEnter; OnMouseLeave = CMMouseLeave; } //--------------------------------------------------------------------------- __fastcall TSkinScrollBar::~TSkinScrollBar() { if( m_pCanvas ){ delete m_pCanvas; m_pCanvas = NULL; } if( m_pTimer ){ delete m_pTimer; m_pTimer = NULL; } ReleasePictures(); } //--------------------------------------------------------------------------- int TSkinScrollBar::HitTest( int X, int Y ) { if( Kind==sbVertical ){ if( Y<0 ) return -1; else if( YWidth/3 ) m_pCanvas->Draw( x, y, pPic ); else{ TRect tmpRect; if( bVertical ){ tmpRect.Left = x; tmpRect.Right = tmpRect.Left + wid*3; tmpRect.Top = y; tmpRect.Bottom = tmpRect.top + wid; } else{ tmpRect.Left = x; tmpRect.Right = tmpRect.Left + wid; tmpRect.Top = y; tmpRect.Bottom = tmpRect.top + wid*3; } m_pCanvas->StretchDraw( tmpRect, pPic); } } //--------------------------------------------------------------------------- void TSkinScrollBar::DrawThumb( int iState, bool bEraseBk, int iPageUD ) { bool bVertical = Kind==sbVertical; TRect rectDraw; int wid = bVertical ? Width : Height, len = bVertical ? Height : Width; LONG &rFixBegin = bVertical ? rectDraw.Left : rectDraw.Top, &rFixEnd = bVertical ? rectDraw.Right : rectDraw.Bottom, &rVarBegin = bVertical ? rectDraw.Top : rectDraw.Left, &rVarEnd = bVertical ? rectDraw.Bottom : rectDraw.Right; //=========================== //绘制 轨道 rFixBegin = PIXEL_EXTERNAL_FRAME; rFixEnd = wid - rFixBegin;//rectDraw.Left; //绘制 上/左轨道 // if(iPageUD == SB_PAGEUP || iState== STATE_PUSH ){ m_pCanvas->Brush->Color = RGB_EXTERNAL_HIG; m_pCanvas->Pen->Color = RGB_EXTERNAL_HIG; // }else { // m_pCanvas->Brush->Color = RGB_EXTERNAL_NOR; // m_pCanvas->Pen->Color = RGB_EXTERNAL_NOR; // } if( bEraseBk ) //重绘轨道 rVarBegin = wid; else if( m_nPreThumbPosRectangle(rectDraw.Left, rectDraw.Top, rectDraw.Right, rectDraw.Bottom); } //绘制 下/右轨道 // if( iPageUD==SB_PAGEDOWN || iState==STATE_PUSH ){ m_pCanvas->Brush->Color = RGB_EXTERNAL_HIG; m_pCanvas->Pen->Color = RGB_EXTERNAL_HIG; // }else { // m_pCanvas->Brush->Color = RGB_EXTERNAL_NOR; // m_pCanvas->Pen->Color = RGB_EXTERNAL_NOR; // } rVarBegin = m_nThumbPos + m_nThumbSize; if( bEraseBk ) rVarEnd = len - wid; else if( m_nPreThumbPos>m_nThumbPos ){ //如果向上/左,则为当前滑动块底部的值 rVarEnd = m_nThumbSize + m_nPreThumbPos; if( rVarEnd > len-wid ) rVarEnd = len - wid; }else rVarEnd = len - wid; //如果向下/右,则为当前滑动块底部的值 if( rVarEnd > rVarBegin ){ m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, rectDraw.Right, rectDraw.Bottom); } //=========================== //绘制 滑块 if( m_nThumbSize>0 ){ //=========================== //绘制 滑块左右/上下区域 if( iState==STATE_NORMAL || iState == STATE_HIGHLIGHT ){ m_pCanvas->Brush->Color = RGB_EXTERNAL_NOR; m_pCanvas->Pen->Color = RGB_EXTERNAL_NOR; }else if( iState== STATE_PUSH ){ m_pCanvas->Brush->Color = RGB_EXTERNAL_HIG; m_pCanvas->Pen->Color = RGB_EXTERNAL_HIG; } rVarBegin = m_nThumbPos; rVarEnd = m_nThumbPos + m_nThumbSize; //左/上区域 rFixBegin = PIXEL_EXTERNAL_FRAME; rFixEnd = rFixBegin + PIXEL_EX2INTERNAL; m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, rectDraw.Right, rectDraw.Bottom); //右/下区域 rFixBegin = wid - PIXEL_EXTERNAL_FRAME-PIXEL_EX2INTERNAL; rFixEnd = wid - PIXEL_EXTERNAL_FRAME; m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, rectDraw.Right, rectDraw.Bottom); //=========================== //绘制 滑块矩形区域 if(iState == STATE_NORMAL){ m_pCanvas->Brush->Color = RGB_INTERNAL_NOR; m_pCanvas->Pen->Color = RGB_INTERNAL_NOR; }else if(iState == STATE_HIGHLIGHT){ m_pCanvas->Brush->Color = RGB_INTERNAL_NOR;//HIG; m_pCanvas->Pen->Color = RGB_INTERNAL_NOR;//HIG; }else if(iState == STATE_PUSH){ m_pCanvas->Brush->Color = RGB_INTERNAL_PUSH; m_pCanvas->Pen->Color = RGB_INTERNAL_PUSH; } rFixBegin = PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL+PIXEL_INTERNAL_FARME; rFixEnd = wid - rFixBegin; rVarBegin = m_nThumbPos + PIXEL_INTERNAL_BOUND; rVarEnd = m_nThumbPos + m_nThumbSize - PIXEL_INTERNAL_BOUND; m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, rectDraw.Right, rectDraw.Bottom); //add by tj 2013/12/10 //绘制 滑块矩形区域 横/竖线 //=========================== //绘制 滑块矩形区域 COLORREF colLine, *colLineTrans, *colLineLight; if(iState == STATE_NORMAL){ colLine = RGB_INTERNAL_LINE_NOR; colLineTrans = (COLORREF *)RGB_INTERNAL_LINE_NOR_TRANS; }else{// if(iState == STATE_HIGHLIGHT){ colLine = RGB_INTERNAL_LINE_HIG; colLineTrans = (COLORREF *)RGB_INTERNAL_LINE_HIG_TRANS; // }else if(iState == STATE_PUSH){ // colLine = RGB_INTERNAL_LINE_PUSH; // colLineTrans = (COLORREF *)RGB_INTERNAL_LINE_PUSH_TRANS; } int X = rFixBegin + (wid - 2*rFixBegin - PIXEL_INTERNAL_LINE) / 2, Y = m_nThumbPos + m_nThumbSize/2 - 3; for(int i=0; i<3; i++){ int iPixlX = bVertical ? X : Y+1, iPixlY = bVertical ? Y+1 : X; for(int j=0; j<6; j++){ m_pCanvas->Pixels[iPixlX][iPixlY] = colLineTrans[j]; if( bVertical ) iPixlX++; else iPixlY++; } iPixlX = bVertical ? X : Y; iPixlY = bVertical ? Y : X; m_pCanvas->Pen->Color = colLine; m_pCanvas->MoveTo(iPixlX,iPixlY); if( bVertical ) iPixlX = wid - iPixlX; else iPixlY = wid - iPixlY; m_pCanvas->LineTo(iPixlX,iPixlY); Y += 3; } //=========================== //绘制 滑块边框 m_pCanvas->Brush->Color = RGB_INTERNAL_FRAME_NOR; m_pCanvas->Pen->Color = RGB_INTERNAL_FRAME_NOR; rFixBegin = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL; rFixEnd = wid - (PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL); rVarBegin = m_nThumbPos; rVarEnd = m_nThumbPos + m_nThumbSize; m_pCanvas->FrameRect( rectDraw ); /* //左/上边框 rFixBegin = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL; rFixEnd = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL + PIXEL_INTERNAL_FARME; m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, rectDraw.Right, rectDraw.Bottom); //右/下边框 rFixBegin = wid - (PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL+PIXEL_INTERNAL_FARME); rFixEnd = wid - (PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL); m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, rectDraw.Right, rectDraw.Bottom); //上/左边框 rFixBegin = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL + PIXEL_INTERNAL_FARME; rFixEnd = wid - rFixBegin; rVarBegin = m_nThumbPos; rVarEnd = m_nThumbPos + PIXEL_INTERNAL_BOUND; m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, rectDraw.Right, rectDraw.Bottom); //下/右边框 rVarBegin = m_nThumbPos + m_nThumbSize-PIXEL_INTERNAL_BOUND; rVarEnd = m_nThumbPos + m_nThumbSize; m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, rectDraw.Right, rectDraw.Bottom); */ //=========================== //绘制 滑块角 /* if(iState == STATE_NORMAL){ m_pCanvas->Pen->Color = RGB_INTERNAL_ROUND_BKG_N_NOR; }else if(iState == STATE_HIGHLIGHT ){ m_pCanvas->Pen->Color = RGB_INTERNAL_ROUND_BKG_N_HIG; }else if( iState == STATE_PUSH){ m_pCanvas->Pen->Color = RGB_INTERNAL_ROUND_BKG_H_HIG; } //左上角 rFixBegin = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL; rVarBegin = m_nThumbPos; m_pCanvas->Pixels[rectDraw.Left][rectDraw.Top] = m_pCanvas->Pen->Color; //左下角 rVarBegin = m_nThumbPos + m_nThumbSize - PIXEL_INTERNAL_BOUND; m_pCanvas->Pixels[rectDraw.Left][rectDraw.Top] = m_pCanvas->Pen->Color; //右上角 rFixBegin = Width - (PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL+PIXEL_INTERNAL_BOUND); rVarBegin = m_nThumbPos; m_pCanvas->Pixels[rectDraw.Left][rectDraw.Top] = m_pCanvas->Pen->Color; //右下角 rVarBegin = m_nThumbPos + m_nThumbSize - PIXEL_INTERNAL_BOUND; m_pCanvas->Pixels[rectDraw.Left][rectDraw.Top] = m_pCanvas->Pen->Color; */ } m_nPreThumbPos = m_nThumbPos; } //--------------------------------------------------------------------------- void TSkinScrollBar::DrawBound() { bool bVertical = Kind==sbVertical; TRect rectDraw; int wid = bVertical ? Width : Height, len = bVertical ? Height : Width; LONG &rFixBegin = bVertical ? rectDraw.Left : rectDraw.Top, &rFixEnd = bVertical ? rectDraw.Right : rectDraw.Bottom, &rVarBegin = bVertical ? rectDraw.Top : rectDraw.Left, &rVarEnd = bVertical ? rectDraw.Bottom : rectDraw.Right; m_pCanvas->Brush->Color = RGB_EXTERNAL_FRAME; m_pCanvas->Pen->Color = RGB_EXTERNAL_FRAME; rVarBegin = wid; rVarEnd = len - wid; rFixBegin = 0; rFixEnd = rFixBegin + PIXEL_EXTERNAL_FRAME; m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, rectDraw.Right, rectDraw.Bottom); rFixBegin = wid - PIXEL_EXTERNAL_FRAME; rFixEnd = wid; m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, rectDraw.Right, rectDraw.Bottom); } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::PaintWindow(HDC DC) { if( !m_pCanvas->Handle ) m_pCanvas->Handle = DC; // 绘制上/左箭头 int iState = m_iHitPrev==SB_LINEUP ? STATE_HIGHLIGHT : STATE_NORMAL; DrawArrow( SB_LINEUP, iState ); // 绘制滑块 iState = m_iHitPrev==SB_THUMBTRACK ? STATE_HIGHLIGHT : STATE_NORMAL; DrawThumb( iState, true ); // 绘制下/右箭头 iState = m_iHitPrev==SB_LINEDOWN ? STATE_HIGHLIGHT : STATE_NORMAL; DrawArrow( SB_LINEDOWN, iState ); //绘制 外面左右/上下边框 DrawBound(); } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::WMPaint(TWMPaint &Message) { PaintHandler(Message); } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::SetPosition(int Value, bool bRedraw) { if( m_nPos!=Value ){ m_nPos = Value; CalcThumbPos(); if( bRedraw ) DrawThumb( STATE_NORMAL, false ); } } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::SetPageSize(int Value, bool bRedraw) { if( m_nPage!=Value ){ m_nPage = Value; CalcThumbSize(); if( bRedraw ){ DrawThumb( STATE_NORMAL, true ); Invalidate(); } } } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::SetRange(int AMin, int AMax, bool bRedraw) { if( m_nMin!=AMin || m_nMax!=AMax ){ m_nMin = AMin; m_nMax = AMax; CalcThumbSize(); if( bRedraw ){ DrawThumb( STATE_NORMAL, true ); Invalidate(); } } } //--------------------------------------------------------------------------- int __fastcall TSkinScrollBar::GetScrollPos() { return m_nPos; } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::GetScrollRange(int* nMin, int* nMax) { *nMin = m_nMin; *nMax = m_nMax; } //--------------------------------------------------------------------------- int __fastcall TSkinScrollBar::GetPageSize() { return m_nPage; } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::WMLButtonDown(TWMMouse &Message) { SetCapture(Handle); m_bAction = true; m_pWndCtrl->SetFocus(); bool bVertical = Kind==sbVertical; int iHit = HitTest( Message.XPos, Message.YPos ); if( iHit==SB_THUMBTRACK ){ m_bDrag = TRUE; m_nDragPoint = bVertical ? Message.YPos : Message.XPos; m_nDragPos = m_nPos; m_nTrackPos = m_nDragPos; DrawThumb( STATE_PUSH, false ); } else{ m_iClicked = iHit; if( m_pWndCtrl ) m_pWndCtrl->Perform( bVertical ? WM_VSCROLL : WM_HSCROLL, MAKELONG(m_iClicked,0), LPARAM(Handle) ); m_pTimer->Interval = TIME_DELAY; m_pTimer->Enabled = true; m_bPause = false; int nNewPos = m_nPos; if( iHit==SB_LINEUP || iHit==SB_LINEDOWN ){ DrawArrow( iHit, STATE_PUSH ); nNewPos += (iHit==SB_LINEUP) ? -1 : 1; } else if( iHit==SB_PAGEUP || iHit==SB_PAGEDOWN ){ nNewPos += (iHit==SB_PAGEUP) ? -m_nPage : m_nPage; } int nLenInSi = m_nMax-m_nMin-m_nPage+1; if( nNewPosnLenInSi ) nNewPos = nLenInSi; if( nNewPos!=m_nPos ){ m_nPos = nNewPos; CalcThumbPos(); //add by tj 2013/11/14 DrawThumb( STATE_NORMAL, false, iHit ); } } } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::WMLButtonUp(TWMMouse &Message) { ReleaseCapture(); if( m_bDrag ){ m_bDrag = false; m_pWndCtrl->Perform( Kind==sbVertical ? WM_VSCROLL : WM_HSCROLL, MAKELONG(SB_THUMBPOSITION, m_nTrackPos), LPARAM(Handle) ); if( m_nTrackPos!=m_nPos ){ m_nPos = m_nTrackPos; } m_nTrackPos = 0; CalcThumbPos(); int iHit = HitTest( Message.XPos, Message.YPos ); if( iHit==SB_THUMBTRACK ) DrawThumb( STATE_HIGHLIGHT, false ); else DrawThumb( STATE_NORMAL, false ); } else if( m_iClicked!=-1 ){ m_pTimer->Enabled = false; if( m_bNotify ){ m_bNotify = false; } if( m_iClicked==SB_LINEUP || m_iClicked==SB_LINEDOWN ) DrawArrow( m_iClicked, STATE_NORMAL ); //add by tj 2013/11/14 if( m_iClicked==SB_PAGEUP || m_iClicked==SB_PAGEDOWN ) DrawThumb( STATE_NORMAL, false); m_iClicked = -1; } m_bAction = false; } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::WMLButtonDblClk(TWMMouse &Message) { int uHit = HitTest( Message.XPos, Message.YPos ); if( uHit!=SB_THUMBTRACK ){ m_iClicked = uHit; WMLButtonDown( Message ); m_bAction = false; } } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::WMMouseMove(TWMMouse &Message) { Commctrl::TTrackMouseEvent tme; if( !m_bTrace && (Message.Keys & MK_LBUTTON) ){ tme.cbSize = sizeof(tme); tme.hwndTrack = Handle; tme.dwFlags = TME_LEAVE; tme.dwHoverTime = 1; m_bTrace = _TrackMouseEvent(&tme); } if( m_bDrag ){ bool bVertical = Kind==sbVertical; int nDragLen = (bVertical ? Message.YPos : Message.XPos) - m_nDragPoint, nTrackLen = (bVertical ? Height-2*Width : Width-2*Height) - m_nThumbSize, nLenInSi = m_nMax - m_nMin - m_nPage + 1, nSlide = nTrackLen==0 ? 0 : nDragLen * nLenInSi / nTrackLen, nNewPos = m_nDragPos + nSlide; if( nNewPosnLenInSi ) nNewPos = nLenInSi; if( nNewPos!=m_nTrackPos ){ m_nTrackPos = nNewPos; CalcThumbPos(); DrawThumb( STATE_PUSH, false ); m_pWndCtrl->Perform( bVertical ? WM_VSCROLL : WM_HSCROLL, MAKELONG(SB_THUMBTRACK, m_nTrackPos), LPARAM(Handle) ); } } else if( m_iClicked!=-1 ){ int iState, iHit = HitTest( Message.XPos, Message.YPos ); if( iHit==m_iClicked ){ m_bPause = false; iState = STATE_PUSH; //add by tj 2013/11/18 } else{ m_bPause = true; iState = STATE_NORMAL; } if( m_iClicked==SB_LINEUP || m_iClicked==SB_LINEDOWN ) DrawArrow( m_iClicked, iState ); } else{ int iHit = HitTest( Message.XPos, Message.YPos ); if( iHit!=m_iHitPrev ){ if( m_iHitPrev!=-1 ){ if( m_iHitPrev==SB_THUMBTRACK ) DrawThumb( STATE_NORMAL, FALSE ); else if( m_iHitPrev==SB_LINEUP || m_iHitPrev==SB_LINEDOWN ) DrawArrow( m_iHitPrev, STATE_NORMAL ); } if( iHit!=-1 ){ if( iHit==SB_THUMBTRACK ) DrawThumb( STATE_HIGHLIGHT, FALSE ); else if( iHit==SB_LINEUP || iHit==SB_LINEDOWN ) DrawArrow( iHit, STATE_HIGHLIGHT ); } m_iHitPrev = iHit; } } } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::CMMouseEnter(TObject *Sender) { TPoint pt( Mouse->CursorPos.x, Mouse->CursorPos.y ); pt = ScreenToClient( pt ); int iHit = HitTest( pt.x, pt.y ); if( iHit!=-1 ){ if( iHit==SB_THUMBTRACK ) DrawThumb( STATE_HIGHLIGHT, FALSE ); else if( iHit==SB_LINEUP || iHit==SB_LINEDOWN ) DrawArrow( iHit, STATE_HIGHLIGHT ); m_iHitPrev = iHit; } } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::CMMouseLeave(TObject *Sender) { if( m_iHitPrev!=-1 ){ if( m_iHitPrev==SB_THUMBTRACK ) DrawThumb( STATE_NORMAL, false ); else if( m_iHitPrev==SB_LINEUP || m_iHitPrev==SB_LINEDOWN ) DrawArrow( m_iHitPrev, STATE_NORMAL ); m_iHitPrev = -1; } } //--------------------------------------------------------------------------- void __fastcall TSkinScrollBar::TimerProc(TObject* Sender) { if( m_pTimer->Interval==TIME_DELAY ){ m_bNotify = true; m_pTimer->Enabled = false; m_pTimer->Interval = TIME_NOTIFY; m_pTimer->Enabled = true; } else if( m_pTimer->Interval==TIME_NOTIFY && !m_bPause ){ int nNewPos = m_nPos; //add by tj 2013/11/14 bool bPageUD = false; int iHit; switch( m_iClicked ){ case SB_LINEUP: nNewPos -= 1; if( m_nPos==m_nMin ){ m_pTimer->Enabled = false; return; } break; case SB_LINEDOWN: nNewPos += 1; if( m_nPos==m_nMax ){ m_pTimer->Enabled = false; return; } break; case SB_PAGEUP: case SB_PAGEDOWN: { TPoint pt; GetCursorPos(&pt); pt = ScreenToClient(pt); iHit = HitTest( pt.X, pt.Y ); if( iHit==SB_THUMBTRACK ){ m_pTimer->Enabled = false; return; } nNewPos += (m_iClicked==SB_PAGEUP) ? -m_nPage+1 : m_nPage-1; bPageUD = true; } break; } int nLenInSi = m_nMax-m_nMin-m_nPage+1; if( nNewPosnLenInSi ) nNewPos = nLenInSi; if( nNewPos!=m_nPos ){ m_nPos = nNewPos; CalcThumbPos(); //add by tj 2013/11/14 if(bPageUD) DrawThumb( STATE_NORMAL, false, iHit ); else DrawThumb( STATE_NORMAL, false ); } m_pWndCtrl->Perform( Kind==sbVertical ? WM_VSCROLL : WM_HSCROLL, MAKELONG(m_iClicked,0), LPARAM(Handle) ); } } //---------------------------------------------------------------------------