📄 myslider.cpp
字号:
// MySlider.cpp : implementation file
//
#include "stdafx.h"
#include "magicscissors.h"
#include "MySlider.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMySlider
#define IDM_SCROLL WM_USER+1
#define IDM_SCROLL_MOVE WM_USER+2
CMySlider::CMySlider()
{
m_nMin = 0;
m_nMax = 100;
m_nPos = 0;
m_bClick = FALSE;
m_bEnable = FALSE;
m_bSet = FALSE;
m_pSelect = NULL;
}
CMySlider::~CMySlider()
{
if( m_pSelect ) delete [] m_pSelect;
}
BEGIN_MESSAGE_MAP(CMySlider, CStatic)
//{{AFX_MSG_MAP(CMySlider)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMySlider message handlers
void CMySlider::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect wndRect,rect;
GetClientRect(&rect);
wndRect = rect;
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( &dc, wndRect.Width(), wndRect.Height() );
CBitmap* pBitmap = MemDC.SelectObject(&bitmap);
int w = rect.Width()-4;
float inc = (float)w/(m_nMax-m_nMin);
int pos = (int)((m_nPos-m_nMin)*inc+0.5);
CBrush* pBrush = (CBrush*)MemDC.SelectStockObject(WHITE_BRUSH);
MemDC.Rectangle( rect );
CBrush brush;
// draw guide
if( m_bEnable )
brush.CreateSolidBrush(RGB(100,230,100));
else
brush.CreateSolidBrush(RGB(160,160,160));
MemDC.SelectObject(&brush);
rect.left += 2;
rect.right -= 2;
rect.top += 4;
rect.bottom -= 4;
MemDC.Rectangle(rect);
///////////////////
CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(255,0,0));
CPen* pPen = MemDC.SelectObject(&pen);
// draw selection
if( m_bEnable )
{
int sp,l,h;
h = rect.top+1;
l = rect.bottom-1;
for( int i = 0 ; i < (m_nMax-m_nMin) ; i++ )
{
if( m_pSelect[i] )
{
sp = (int)((i+m_nMin)*inc+0.5)+rect.left;
MemDC.MoveTo(sp,h);
MemDC.LineTo(sp,l);
}
}
}
MemDC.SelectObject(pPen);
brush.DeleteObject();
// draw picker
if( m_bEnable )
brush.CreateSolidBrush(RGB(128,128,230));
else
brush.CreateSolidBrush(RGB(128,128,128));
MemDC.SelectObject(&brush);
rect.left = pos;
rect.right = pos+4;
rect.top -= 2;
rect.bottom += 2;
MemDC.Rectangle(rect);
////////////////////
MemDC.SelectObject(pBrush);
dc.BitBlt( 0, 0, wndRect.Width(), wndRect.Height(), &MemDC, 0, 0, SRCCOPY );
MemDC.SelectObject(pBitmap);
// Do not call CStatic::OnPaint() for painting messages
}
BOOL CMySlider::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
//return CStatic::OnEraseBkgnd(pDC);
}
void CMySlider::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if( m_bEnable )
{
m_bSet = TRUE;
CRect rect;
GetClientRect(&rect);
int w = rect.Width();
float inc = (float)w/(m_nMax-m_nMin);
int pos = (int)(point.x/inc+0.5);
m_nPos = pos+m_nMin;
if( m_nPos < 0 ) m_nPos = 0;
if( m_nPos > m_nMax ) m_nPos = m_nMax;
Invalidate();
m_bClick = TRUE;
SetCapture();
}
CStatic::OnLButtonDown(nFlags, point);
}
void CMySlider::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if( m_bEnable )
{
if( nFlags & MK_LBUTTON && m_bClick )
{
CRect rect;
GetClientRect(&rect);
int w = rect.Width();
float inc = (float)w/(m_nMax-m_nMin);
int pos = (int)(point.x/inc+0.5);
m_nPos = pos+m_nMin;
if( m_nPos < 0 ) m_nPos = 0;
if( m_nPos > m_nMax ) m_nPos = m_nMax;
Invalidate();
GetParent()->SendMessage( IDM_SCROLL_MOVE, m_nPos, 0 );
}
}
CStatic::OnMouseMove(nFlags, point);
}
void CMySlider::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if( m_bEnable )
{
m_bClick = FALSE;
CStatic::OnLButtonUp(nFlags, point);
ReleaseCapture();
GetParent()->SendMessage( IDM_SCROLL, m_nPos, 0 );
m_bSet = FALSE;
}
CStatic::OnLButtonUp(nFlags, point);
}
void CMySlider::SetRange(int min, int max)
{
m_nMin = min;
m_nMax = max;
if( m_pSelect ) delete [] m_pSelect;
m_pSelect = new BYTE[max-min];
memset(m_pSelect, 0, (max-min) );
}
void CMySlider::SetPos(int n)
{
if( m_bSet ) return;
m_nPos = n;
if( m_hWnd )
Invalidate();
}
int CMySlider::GetPos()
{
return m_nPos;
}
void CMySlider::Enable(BOOL bEnable)
{
m_bEnable = bEnable;
}
void CMySlider::SetSelect(int n)
{
if( m_pSelect )
m_pSelect[n-m_nMin] = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -