// MKBitSlider.cpp : implementation file
//
#include "stdafx.h"
#include "MKBitSlider.h"
#include ".\mkbitslider.h"
// CMKBitSlider
IMPLEMENT_DYNAMIC(CMKBitSlider, CWnd)
CMKBitSlider::CMKBitSlider()
:m_iRLMargin(20)
,m_iBackgBmpWidth(0)
,m_iBackgBmpHeight(0)
,m_iThumbWidth(0)
,m_iThumbHeight(0)
,m_iWidth(0)
,m_iHeight(0)
,m_iPos(0)
,m_iMax(0)
,m_iMin(0)
,m_bLButtonDown(FALSE)
,m_bEnable(TRUE)
, m_iPage(5)
,m_nMouseOffset(0)
,m_iPixel(0)
,m_hcur(NULL)
,m_iTotal(0)
,m_iBtnWidth(MARGIN_WIDTH)
{
}
CMKBitSlider::~CMKBitSlider()
{
m_BackgBmp.DeleteObject();
m_ForegBmp.DeleteObject();
m_ProgrBmp.DeleteObject();
m_ThumBmp.DeleteObject();
m_BackgMemDC.DeleteDC();
m_ForegMemDC.DeleteDC();
m_ProgrMemDC.DeleteDC();
m_ThumbMemDC.DeleteDC();
if( m_hcur != NULL )
DeleteObject( m_hcur);
}
BEGIN_MESSAGE_MAP(CMKBitSlider, CWnd)
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_KEYDOWN()
ON_WM_TIMER()
ON_WM_SETCURSOR()
END_MESSAGE_MAP()
// CMKBitSlider message handlers
int CMKBitSlider::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
m_hcur = AfxGetApp()->LoadStandardCursor(IDC_HAND);
return 0;
}
void CMKBitSlider::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages
CBitmap BmpDst;
BmpDst.DeleteObject();
BmpDst.CreateCompatibleBitmap( &dc, m_iWidth, m_iHeight );
CDC memDC;
memDC.CreateCompatibleDC( &dc );
CBitmap *pBmTmp = memDC.SelectObject( &BmpDst );
//draw left header and right header
memDC.StretchBlt( 0, 0, m_iRLMargin, m_iHeight, &m_ForegMemDC, 0, 0, m_iRLMargin, m_iBackgBmpHeight, SRCCOPY );
memDC.StretchBlt( m_iWidth - m_iRLMargin, 0, m_iRLMargin, m_iHeight,&m_BackgMemDC, m_iBackgBmpWidth - m_iRLMargin, 0, m_iRLMargin, m_iBackgBmpHeight, SRCCOPY );
//draw left channel and right channel
// Directly use the m_iPixel to draw the channel,
// Don't use the Pos2Pixel(m_iPos) function because the value isn't exactitude.
//int iPixel = Pos2Pixel(m_iPos);
memDC.StretchBlt( m_iRLMargin, 0, m_iPixel - m_iRLMargin, m_iHeight, &m_ForegMemDC, m_iRLMargin, 0, m_iRLMargin, m_iBackgBmpHeight, SRCCOPY );
memDC.StretchBlt( m_iPixel, 0, m_iWidth - m_iPixel - m_iRLMargin, m_iHeight, &m_BackgMemDC, m_iRLMargin, 0, m_iRLMargin, m_iBackgBmpHeight, SRCCOPY );
//draw downdload process channel
GM_MapArea::iterator itor = m_AreaMap.begin();
int iStart = 0,iEnd = 0,iWidth,iBmStart = 0, iBmEnd = 0;
for( ; itor != m_AreaMap.end(); itor++ ){
iStart = ( m_iWidth - 2 * m_iRLMargin ) * itor->first / m_iTotal ;
iEnd = ( m_iWidth - 2 * m_iRLMargin ) * itor->second / m_iTotal ;
if( m_iRLMargin + iStart < m_iPixel )
iStart = m_iPixel - m_iRLMargin;
if( iStart >= iEnd ) continue;
if( m_iRLMargin + iEnd > m_iWidth - m_iBtnWidth ) continue;
if( m_iRLMargin + iEnd >= m_iWidth - m_iRLMargin ){ //&& m_iRLMargin + iEnd < m_iWidth - m_iBtnWidth
if( m_iRLMargin + iStart < m_iWidth - m_iRLMargin )
memDC.StretchBlt( m_iRLMargin + iStart, 0, m_iWidth - 2*m_iRLMargin - iStart, m_iHeight, &m_ProgrMemDC, m_iRLMargin , 0, m_iRLMargin + 1, m_iBackgBmpHeight, SRCCOPY );
memDC.StretchBlt( m_iWidth - m_iRLMargin, 0, m_iRLMargin - m_iBtnWidth, m_iHeight, &m_ProgrMemDC, m_iBackgBmpWidth - m_iRLMargin , 0, m_iRLMargin - m_iBtnWidth , m_iBackgBmpHeight, SRCCOPY );//
}
else
memDC.StretchBlt( m_iRLMargin + iStart, 0, iEnd - iStart, m_iHeight, &m_ProgrMemDC, m_iRLMargin , 0, m_iRLMargin + 1, m_iBackgBmpHeight, SRCCOPY );
}
int nXSrc = 0, nYDst = 0;
nYDst = (m_iHeight - m_iThumbHeight) / 2 ;
if( m_bLButtonDown && m_bEnable )
{
nXSrc = m_iThumbWidth;
}
TRACE("LButtonDown postion %d \r\n",m_iPixel - m_iThumbWidth / 2 );
// Directly use the m_iPixel to draw the thumb,
// Don't use the Pos2Pixel(m_iPos) function because the value isn't exactitude.
memDC.BitBlt( m_iPixel - m_iThumbWidth / 2 , nYDst, m_iThumbWidth, m_iBackgBmpHeight, &m_ThumbMemDC, nXSrc, 0, SRCCOPY );
dc.BitBlt( 0, 0, m_iWidth, m_iHeight, &memDC, 0, 0, SRCCOPY );
memDC.SelectObject( pBmTmp );
memDC.DeleteDC();
}
//
// 画CHANNEL中要填充的区域,由外部调用
bool CMKBitSlider::PutDownloadInfo( GM_MapArea & MapArea,__int64 iTotal )
{
m_AreaMap.clear();
m_AreaMap = MapArea;
m_iTotal = iTotal;
if( m_AreaMap.size() <= 0 ){
return true;
}
if( m_bLButtonDown )
return TRUE;
Invalidate();
return true;
}
//
// reset state
void CMKBitSlider::Reset()
{
m_AreaMap.clear();
m_iTotal = 0;
m_iPixel = m_iRLMargin;
SavePos(0);
//Invalidate();
}
BOOL CMKBitSlider::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return CWnd::OnEraseBkgnd(pDC);
}
void CMKBitSlider::OnLButtonDown(UINT nFlags, CPoint point)
{
if( !m_bEnable )
return;
SetCapture();
SetFocus();
m_bLButtonDown = TRUE;
// If mouse button is clicked on the thumb,
// capture the coordinates of mouse pointer and center of thumb
// and calculate distance between them.
if( point.x < MARGIN_WIDTH || point.x > m_iWidth - MARGIN_WIDTH){
if( point.x < m_iRLMargin )
m_iPos -= m_iPage;
else
m_iPos += m_iPage;
//click header recalculate pixel postion
SavePixel(Pos2Pixel( m_iPos ));
SavePos( m_iPos );
::PostMessage(
GetParent()->GetSafeHwnd(), WM_BITMAPSLIDER_MOVING,
GetDlgCtrlID(), m_iPos );
}
else{
if( abs( point.x - Pos2Pixel( m_iPos ) ) <= m_iThumbWidth / 2 ){
int iPixel = Pos2Pixel( m_iPos );
m_nMouseOffset = point.x - Pos2Pixel( m_iPos );
}
else
m_nMouseOffset = 0;
TRACE("LButtonDown postion %d \r\n",point.x );
OnMouseMove( nFlags, point );
Invalidate();
}
CWnd::OnLButtonDown(nFlags, point);
}
void CMKBitSlider::OnLButtonUp(UINT nFlags, CPoint point)
{
if( !m_bEnable )
return;
ReleaseCapture();
m_bLButtonDown = FALSE;
Invalidate();
::PostMessage(
GetParent()->GetSafeHwnd(), WM_BITMAPSLIDER_MOVED,
GetDlgCtrlID(), m_iPos );
CWnd::OnLButtonUp(nFlags, point);
}
void CMKBitSlider::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if( !m_bLButtonDown || !m_bEnable )
return;
int nPixel;
// Boundary check
nPixel = point.x - m_nMouseOffset;
if( nPixel < m_iRLMargin ){
nPixel = m_iRLMargin;
}
if( nPixel > m_iWidth - m_iRLMargin ){
nPixel = m_iWidth - m_iRLMargin;
}
TRACE("--------- X [%d] m_iPos [%d] nPixel [%d]\r\n",point.x,m_iPos,nPixel);
// Apply change
if( Pos2Pixel(m_iPos) != nPixel ) {
//record the pixel postion while the themb be draged or when the slider be seeked
SavePixel(nPixel);
SavePos( Pixel2Pos( nPixel ) );
::PostMessage(
GetParent()->GetSafeHwnd(), WM_BITMAPSLIDER_MOVING,
GetDlgCtrlID(), m_iPos );
}
CWnd::OnMouseMove(nFlags, point);
}
void CMKBitSlider::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
//Update the window size
m_iWidth = cx;
m_iHeight = cy;
//Update the m_iPixel value when the wiondow size be changed;
SavePixel(Pos2Pixel(m_iPos));
}
BOOL CMKBitSlider::SetBitmap( UINT uBackgbmpID,UINT uForegBmpID,UINT uProgrBmpID ,UINT uThumBmpID)
{
// load bitmap
m_BackgBmp.DeleteObject();
m_ForegBmp.DeleteObject();
m_ProgrBmp.DeleteObject();
m_ThumBmp.DeleteObject();
if( !m_BackgBmp.LoadBitmap( uBackgbmpID ) )
return FALSE;
if( !m_ForegBmp.LoadBitmap( uForegBmpID ) )
return FALSE;
if( !m_ProgrBmp.LoadBitmap( uProgrBmpID ) )
return FALSE;
if( !m_ThumBmp.LoadBitmap( uThumBmpID ) )
return FALSE;
// load memery decive context
m_BackgMemDC.DeleteDC();
m_ForegMemDC.DeleteDC();
m_Pro
- 1
- 2
- 3
- 4
前往页