| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 |
- // SkinSliderCtrl.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "SkinUI.h"
- #include "SkinSliderCtrl.h"
- // CSkinSliderCtrl
- IMPLEMENT_DYNAMIC(CSkinSliderCtrl, CSliderCtrl)
- CSkinSliderCtrl::CSkinSliderCtrl()
- {
- m_pBackImg = m_pThumImg = m_pDisImg = m_pBtImg = m_pTraceImg = NULL;
- m_bPress = m_bHover = m_bMouseTracking = FALSE;
- m_bDragging = false;
- m_rcThumRect.SetRect(0,0,0,0);
- m_szThum.SetSize(0,0);
- }
- CSkinSliderCtrl::~CSkinSliderCtrl()
- {
- }
- BEGIN_MESSAGE_MAP(CSkinSliderCtrl, CSliderCtrl)
- ON_WM_PAINT()
- ON_WM_DESTROY()
- ON_WM_MOUSEMOVE()
- ON_WM_LBUTTONDOWN()
- ON_WM_LBUTTONUP()
- ON_WM_ERASEBKGND()
- ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
- END_MESSAGE_MAP()
- BOOL CSkinSliderCtrl::SetBackImage( LPCTSTR lpszFileName,bool bFixed/* = true*/ )
- {
- RenderEngine->RemoveImage(m_pBackImg);
- m_pBackImg = RenderEngine->GetImage(lpszFileName);
- if (NULL == m_pBackImg)
- return FALSE;
- else
- {
- if(bFixed) SetWindowPos(NULL,0,0,m_pBackImg->GetWidth(),m_pBackImg->GetHeight(),SWP_NOMOVE);
-
- return TRUE;
- }
- }
- BOOL CSkinSliderCtrl::SetThumImage( LPCTSTR lpszFileName )
- {
- RenderEngine->RemoveImage(m_pThumImg);
- m_pThumImg = RenderEngine->GetImage(lpszFileName);
- if (NULL == m_pThumImg)
- return FALSE;
- else
- {
- m_szThum.SetSize(m_pThumImg->GetWidth(),m_pThumImg->GetHeight());
- m_rcThumRect.SetRect(0,0,m_szThum.cx,m_szThum.cy);
- SetThumbRect();
- SetChannelRect();
- return TRUE;
- }
- }
- BOOL CSkinSliderCtrl::SetDisImage( LPCTSTR lpszFileName )
- {
- RenderEngine->RemoveImage(m_pDisImg);
- m_pDisImg = RenderEngine->GetImage(lpszFileName);
- if (NULL == m_pDisImg)
- return FALSE;
- else
- return TRUE;
- }
- BOOL CSkinSliderCtrl::SetTraceImage( LPCTSTR lpszFileName,CONST LPRECT lprcNinePart/*=NULL*/ )
- {
- RenderEngine->RemoveImage(m_pTraceImg);
- m_pTraceImg = RenderEngine->GetImage(lpszFileName);
- if (NULL == m_pTraceImg)
- return FALSE;
- else
- {
- m_pTraceImg->SetNinePart(lprcNinePart);
- return TRUE;
- }
- }
- BOOL CSkinSliderCtrl::SetButtonImage( LPCTSTR lpszFileName )
- {
- RenderEngine->RemoveImage(m_pBtImg);
- m_pBtImg = RenderEngine->GetImage(lpszFileName);
- if (NULL == m_pBtImg)
- return FALSE;
- else
- {
- m_szThum.SetSize(m_pBtImg->GetWidth()/3,m_pBtImg->GetHeight());
- m_rcThumRect.SetRect(0,0,m_szThum.cx,m_szThum.cy);
- SetThumbRect();
- SetChannelRect();
- return TRUE;
- }
- }
- // CSkinSliderCtrl 消息处理程序
- void CSkinSliderCtrl::OnDestroy()
- {
- CSliderCtrl::OnDestroy();
- RenderEngine->RemoveImage(m_pBackImg);
- RenderEngine->RemoveImage(m_pThumImg);
- RenderEngine->RemoveImage(m_pDisImg);
- RenderEngine->RemoveImage(m_pBtImg);
- RenderEngine->RemoveImage(m_pTraceImg);
- }
- void CSkinSliderCtrl::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
-
- CRect rcClient;
- GetClientRect(&rcClient);
- CMemoryDC MemDC(&dc, rcClient);
- //绘制背景
- DrawParentWndBg(GetSafeHwnd(),MemDC->GetSafeHdc());
- //绘制轨迹
- if ( !IsWindowEnabled() )
- {
- if (m_pDisImg != NULL && !m_pDisImg->IsNull())
- {
- m_pDisImg->DrawImage(&MemDC,0,0);
- }
- }
- else
- {
- if (m_pBackImg != NULL && !m_pBackImg->IsNull())
- {
- m_pBackImg->DrawImage(&MemDC,0,0);
- }
- }
- //绘制痕迹
- if (m_pTraceImg != NULL && !m_pTraceImg->IsNull())
- {
- m_pTraceImg->Draw(&MemDC,CRect(0, 0,m_rcThumRect.left,m_pTraceImg->GetHeight()));
- }
- //绘制滑块
- if (m_pThumImg != NULL && !m_pThumImg->IsNull())
- {
- m_pThumImg->DrawImage(&MemDC,m_rcThumRect.left, m_rcThumRect.top);
- }
- //绘制按钮
- if (m_pBtImg != NULL && !m_pBtImg->IsNull())
- {
- if( m_bPress )
- m_pBtImg->DrawImage(&MemDC,m_rcThumRect.left, m_rcThumRect.top,m_szThum.cx,m_szThum.cy,m_szThum.cx*2,0,m_pBtImg->GetWidth()/3,m_pBtImg->GetHeight());
- else if ( m_bHover )
- m_pBtImg->DrawImage(&MemDC,m_rcThumRect.left, m_rcThumRect.top,m_szThum.cx,m_szThum.cy,m_szThum.cx,0,m_pBtImg->GetWidth()/3,m_pBtImg->GetHeight());
- else
- m_pBtImg->DrawImage(&MemDC,m_rcThumRect.left, m_rcThumRect.top,m_szThum.cx,m_szThum.cy,0,0,m_pBtImg->GetWidth()/3,m_pBtImg->GetHeight());
- }
- }
- void CSkinSliderCtrl::OnMouseMove(UINT nFlags, CPoint point)
- {
- if( m_bDragging )
- {
- int nMax = 0;
- int nMin = 0;
- GetRange(nMin,nMax);
-
- int nPos = 0;
- if ( GetStyle() & TBS_VERT )
- nPos = (nMax - nMin)*(point.y)/m_rcChannelRect.Height();
- else
- nPos = (nMax - nMin)*(point.x)/m_rcChannelRect.Width();
- SetPos(nPos);
- RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
- }
- //按钮事件
- if ( PtInRect(m_rcThumRect,point) && !m_bMouseTracking )
- {
- TrackMouseLeave(GetSafeHwnd());
- m_bMouseTracking = TRUE;
- m_bHover = TRUE;
- RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
- }
- __super::OnMouseMove(nFlags, point);
- }
- //鼠标离开消息
- LRESULT CSkinSliderCtrl::OnMouseLeave(WPARAM wparam, LPARAM lparam)
- {
- m_bMouseTracking = FALSE;
- m_bHover = FALSE;
- RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
- return 0;
- }
- void CSkinSliderCtrl::OnLButtonDown(UINT nFlags, CPoint point)
- {
- if ( PtInRect(&m_rcThumRect,point) )
- {
- m_bDragging = true;
- m_bPress = TRUE;
- SetCapture();
- RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
- }
- else
- {
- if ( PtInRect(&m_rcChannelRect,point) )
- {
- int nMax = 0;
- int nMin = 0;
- GetRange(nMin,nMax);
-
- int nPos = 0;
- if ( GetStyle() & TBS_VERT )
- nPos = (nMax - nMin)*(point.y - m_rcChannelRect.top)/m_rcChannelRect.Height();
- else
- nPos = (nMax - nMin)*(point.x - m_rcChannelRect.left)/m_rcChannelRect.Width();
-
- OutputString(TEXT("Down:%d\n"),nPos);
- nPos += nMin;
- SetPos(nPos);
- RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
- return;
- }
- }
- __super::OnLButtonDown(nFlags, point);
- }
- void CSkinSliderCtrl::OnLButtonUp(UINT nFlags, CPoint point)
- {
- if ( PtInRect(&m_rcThumRect,point) && m_bPress) m_bPress = FALSE;
- m_bDragging = false;
- ReleaseCapture();
- RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
-
- __super::OnLButtonUp(nFlags, point);
- }
- BOOL CSkinSliderCtrl::OnEraseBkgnd(CDC* pDC)
- {
- return TRUE;
- }
- void CSkinSliderCtrl::SetThumbRect(int nPos)
- {
- CRect rcClient;
- GetClientRect(&rcClient);
- //判断是否横竖控件
- if ( GetStyle() & TBS_VERT )
- {
- m_rcThumRect.left = (rcClient.Width()-m_szThum.cx)/2;
- m_rcThumRect.top = nPos;
- }
- else
- {
- m_rcThumRect.left = nPos;
- m_rcThumRect.top = (rcClient.Height()-m_szThum.cy)/2;
- }
- m_rcThumRect.right = m_rcThumRect.left+m_szThum.cx;
- m_rcThumRect.bottom = m_rcThumRect.top+m_szThum.cy;
- }
- void CSkinSliderCtrl::SetPos( int nPos )
- {
- int nMin,nMax;
- GetRange(nMin,nMax);
- //重新定位,防止超出客户区
- if( nPos <= nMin ) nPos = nMin;
- if ( nPos >= nMax ) nPos = nMax;
-
- __super::SetPos(nPos);
- int nPosNew = 0;
- if ( GetStyle() & TBS_VERT )
- nPosNew = m_rcChannelRect.Height()*nPos/(nMax-nMin);
- else
- nPosNew = m_rcChannelRect.Width()*nPos/(nMax-nMin);
-
- if( nPosNew<0 ) nPosNew = 0;
- SetThumbRect(nPosNew);
- RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
- }
- void CSkinSliderCtrl::SetChannelRect()
- {
- CRect rcClient;
- GetClientRect(&rcClient);
- //设置轨迹区域
- if ( GetStyle() & TBS_VERT )
- m_rcChannelRect.SetRect(0,m_szThum.cy/2,rcClient.Width(),rcClient.Height()-m_szThum.cy/2);
- else
- m_rcChannelRect.SetRect(m_szThum.cx/2,0,rcClient.Width()-m_szThum.cx/2,rcClient.Height());
- }
- void CSkinSliderCtrl::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
- {
- ISkinControl::SetAttribute(pstrName,pstrValue);
- if( _tcscmp(pstrName, _T("bkimage")) == 0 )
- {
- SetBackImage(pstrValue);
- }
- else if( _tcscmp(pstrName, _T("thumimage")) == 0 )
- {
- SetThumImage(pstrValue);
- }
- else if( _tcscmp(pstrName, _T("buttonimage")) == 0 )
- {
- SetButtonImage(pstrValue);
- }
- else if( _tcscmp(pstrName, _T("traceimage")) == 0 )
- {
- SetTraceImage(pstrValue);
- }
- else if( _tcscmp(pstrName, _T("disimage")) == 0 )
- {
- SetDisImage(pstrValue);
- }
- else if( _tcscmp(pstrName, _T("range")) == 0 )
- {
- LPTSTR pstr = NULL;
- int cx = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
- int cy = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
- SetRange(cx,cy);
- }
- else if( _tcscmp(pstrName, _T("vertical")) == 0 )
- {
- if( _tcscmp(pstrValue, _T("true")) == 0 ) ModifyStyle(0,TBS_VERT);
- }
- else if( _tcscmp(pstrName, _T("value")) == 0 )
- {
- SetPos(_ttoi(pstrValue));
- }
- else if( _tcscmp(pstrName, _T("tic")) == 0 )
- {
- SetTic(_ttoi(pstrValue));
- }
- else if( _tcscmp(pstrName, _T("ticfreq")) == 0 )
- {
- SetTicFreq(_ttoi(pstrValue));
- }
- }
- BOOL CSkinSliderCtrl::CreateControl( CWnd* pParentWnd )
- {
- if( !Create(WS_CHILD|WS_VISIBLE|TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,CRect(0,0,0,0),pParentWnd,0) )
- return FALSE;
- m_pOwnWnd = this;
- return TRUE;
- }
|