⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linetrackbar.cpp

📁 在vc++的开发平台下开发的PhotoShop风格的滑动条
💻 CPP
字号:
/********************************************************************

	LineTrackBar.cpp - ISee图像浏览器—图像处理模块类LineTrackBar
	实现代码文件

    版权所有(C) VCHelp-coPathway-ISee workgroup 2000 all member's

    这一程序是自由软件,你可以遵照自由软件基金会出版的GNU 通用许可证
	条款来修改和重新发布这一程序。或者用许可证的第二版,或者(根据你
	的选择)用任何更新的版本。

    发布这一程序的目的是希望它有用,但没有任何担保。甚至没有适合特定
	目地的隐含的担保。更详细的情况请参阅GNU通用许可证。

    你应该已经和程序一起收到一份GNU通用许可证(GPL)的副本。如果还没有,
	写信给:
    The Free Software Foundation, Inc.,  675  Mass Ave,  Cambridge,
    MA02139,  USA

	如果你在使用本软件时有什么问题或建议,用以下地址可以与我们取得联
	系:
		http://isee.126.com
		http://www.vchelp.net
	或:
		iseesoft@china.com

	作者:马翔
   e-mail:hugesoft@yeah.net

   功能实现:PhotoShop风格的滑动条

	文件版本:
		Build xxxxx
		Date  2000-11-18

********************************************************************/
// LineTrackBar.cpp : implementation file
//

#include "stdafx.h"
#include "LineTrackBar.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLineTrackBar

CLineTrackBar::CLineTrackBar()
{
	CLineTrackBar::RegisterWndClass(AfxGetInstanceHandle());
	pItem = NULL;
}

CLineTrackBar::~CLineTrackBar()
{
	int nCount = m_items.GetSize();
	
	for (int i = 0; i < nCount; i++)
		delete m_items.GetAt(i);
	m_items.RemoveAll();

}


BEGIN_MESSAGE_MAP(CLineTrackBar, CWnd)
	//{{AFX_MSG_MAP(CLineTrackBar)
	ON_WM_PAINT()
	ON_WM_SIZE()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CLineTrackBar message handlers
//	初始化控件函数
//	nGroupCtrl:协作控件ID,默认为-1
//	ncolor:控件颜色,默认为RGB(0,0,0)[黑色]
//	nLower:控件最小值(大于等于0),默认为0
//	nZero:控件原点(大于等于nLower),默认为100
//	nUpper:控件最大值(大于等于nZero),默认为200
//	nStep:控件步长,默认为1
//	bFocus:设置协作控件焦点,默认为FALSE(不设置),为TRUE时
//			点中LineTrackBar时协作控件将得到焦点
//	nStype:控件返值类型,目前未使用
//
//	此控件在设置nLower,nZero,nUpper,nStep参数后会自动适应大小

BOOL CLineTrackBar::InitControl(int nGroupCtrl,COLORREF ncolor,
								int nLower, int nZero,int nUpper,
								int nStep,BOOL bFocus,int nStype)
{	
	CLineTrackObj* pItem = new CLineTrackObj;
	pItem->m_color = ncolor;
	pItem->m_nLower = nLower;
	pItem->m_nUpper = nUpper;
	pItem->m_nZero =nZero;
	pItem->m_nPos = nZero;
	pItem->m_nStep =nStep;
	pItem->m_nStype=nStype;
	pItem->m_bFocus =bFocus;

	if(pItem->m_nStep<=0)
		pItem->m_nStep=1;

	VERIFY(pItem->m_nLower>=0);
	VERIFY(pItem->m_nZero>=pItem->m_nLower);
	VERIFY(pItem->m_nUpper>=pItem->m_nZero);
	VERIFY(pItem->m_nStep<pItem->m_nUpper);

	try 
	{
		m_items.Add(pItem);
		this->SetWindowPos(this,pItem->m_nLower,0,(pItem->m_nUpper-pItem->m_nLower)*pItem->m_nStep+11,15,SWP_NOMOVE|SWP_NOZORDER|
			SWP_SHOWWINDOW|SWP_NOACTIVATE);
		InvalidateCtrl();
		SetGroupControl (nGroupCtrl);	

		switch(pItem->m_nStype )
		{
		case RE_STRING:
			SetGroupControlText();
			break;
		}

		return TRUE;
	}
	catch (CMemoryException* e)
	{
		if (pItem !=NULL) 
			delete pItem;
		e->Delete();
		return FALSE;
	}
}

void CLineTrackBar::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	CRect rcClient;
	GetClientRect(rcClient);

	// draw scale
	if (m_MemDC.GetSafeHdc() != NULL)
		dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 0, 0, SRCCOPY);

	// Do not call CWnd::OnPaint() for painting messages
}

void CLineTrackBar::InvalidateCtrl()
{
	CClientDC dc(this);
	CRect rcClient;
	int nRang;

	pItem = m_items.GetAt(0);
	nRang=pItem->m_nUpper*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;

	GetClientRect(rcClient);

	if (m_MemDC.GetSafeHdc() == NULL)
	{
		m_MemDC.CreateCompatibleDC(&dc);
		m_Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
		m_MemDC.SelectObject(m_Bitmap);
		
		// draw scale
		m_MemDC.SetBkColor(RGB(255,255,255));
//		m_MemDC.SetBkMode (TRANSPARENT);
		CBrush bkBrush;
		bkBrush.CreateSysColorBrush(COLOR_ACTIVEBORDER);
		m_MemDC.FillRect(rcClient,&bkBrush);

		CPen pen(PS_SOLID, 1, pItem->m_color);
		CPen* pOldPen = m_MemDC.SelectObject(&pen);
		
		m_MemDC.MoveTo(CPoint(rcClient.left+5, rcClient.top+5));
		m_MemDC.LineTo(CPoint(rcClient.left+5+nRang+1, rcClient.top+5));
		m_MemDC.MoveTo(CPoint(rcClient.left+5, rcClient.top));
		m_MemDC.LineTo(CPoint(rcClient.left+5, rcClient.top+5));
		m_MemDC.MoveTo(CPoint(rcClient.left+5+pItem->m_nZero*pItem->m_nStep, rcClient.top));
		m_MemDC.LineTo(CPoint(rcClient.left+5+pItem->m_nZero*pItem->m_nStep, rcClient.top+5));
		m_MemDC.MoveTo(CPoint(rcClient.left+5+nRang, rcClient.top ));
		m_MemDC.LineTo(CPoint(rcClient.left+5+nRang, rcClient.top+5));

		CPoint ptPolyAr[4];
		ptPolyAr[0].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;
		ptPolyAr[0].y=rcClient.top+6 ;
		ptPolyAr[1].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-5-pItem->m_nLower*pItem->m_nStep;
		ptPolyAr[1].y=rcClient.top+11;
		ptPolyAr[2].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep+5-pItem->m_nLower*pItem->m_nStep;
		ptPolyAr[2].y=rcClient.top+11;
		ptPolyAr[3].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;
		ptPolyAr[3].y=rcClient.top+6 ;
		m_MemDC.Polyline (ptPolyAr,4);
		m_MemDC.SelectObject(pOldPen);
	}
	InvalidateRect(rcClient, FALSE);		
}

void CLineTrackBar::DrawSpike()
{
	CRect rcClient;
	GetClientRect(rcClient);
	UINT nRang;
				
	nRang=pItem->m_nUpper*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;

	if (m_MemDC.GetSafeHdc() != NULL)
	{
		m_MemDC.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 4, 0, SRCCOPY);


		m_MemDC.SetBkColor(RGB(255,255,255));
//		m_MemDC.SetBkMode (TRANSPARENT);
		CBrush bkBrush;
		bkBrush.CreateSysColorBrush(COLOR_ACTIVEBORDER);
		m_MemDC.FillRect(rcClient,&bkBrush);

		CPen pen(PS_SOLID, 1, pItem->m_color);
		CPen* pOldPen = m_MemDC.SelectObject(&pen);
		
		m_MemDC.MoveTo(CPoint(rcClient.left+5, rcClient.top+5));
		m_MemDC.LineTo(CPoint(rcClient.left+5+nRang+1, rcClient.top+5));
		m_MemDC.MoveTo(CPoint(rcClient.left+5, rcClient.top));
		m_MemDC.LineTo(CPoint(rcClient.left+5, rcClient.top+5));
		m_MemDC.MoveTo(CPoint(rcClient.left+5+pItem->m_nZero*pItem->m_nStep, rcClient.top));
		m_MemDC.LineTo(CPoint(rcClient.left+5+pItem->m_nZero*pItem->m_nStep, rcClient.top+5));
		m_MemDC.MoveTo(CPoint(rcClient.left+5+nRang, rcClient.top ));
		m_MemDC.LineTo(CPoint(rcClient.left+5+nRang, rcClient.top+5));

		CPoint ptPolyAr[4];
		ptPolyAr[0].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;
		ptPolyAr[0].y=rcClient.top+6 ;
		ptPolyAr[1].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-5-pItem->m_nLower*pItem->m_nStep;
		ptPolyAr[1].y=rcClient.top+11;
		ptPolyAr[2].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep+5-pItem->m_nLower*pItem->m_nStep;
		ptPolyAr[2].y=rcClient.top+11;
		ptPolyAr[3].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;
		ptPolyAr[3].y=rcClient.top+6 ;
//		if(m_bMouseHit==TRUE)
//		{
//			m_MemDC.Polygon (ptPolyAr,3);
//		}
		m_MemDC.Polyline (ptPolyAr,4);

		m_MemDC.SelectObject(pOldPen);
	}
}

void CLineTrackBar::SetPos(int nPos)
{
	pItem->m_nPos=nPos;
	if(pItem->m_nPos <pItem->m_nLower )
		pItem->m_nPos =pItem->m_nLower;
	else if(pItem->m_nPos >pItem->m_nUpper)
		pItem->m_nPos =pItem->m_nUpper;
	DrawSpike();
	Invalidate(FALSE);
}

int CLineTrackBar::GetPos()
{
	return pItem->m_nPos;
}

BOOL CLineTrackBar::RegisterWndClass(HINSTANCE hInstance)
{
	WNDCLASS wc;
	wc.lpszClassName = "LINE_TRACKBAR_CTRL"; // matches class name in client
	wc.hInstance = hInstance;
	wc.lpfnWndProc = ::DefWindowProc;
	wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
	wc.hIcon = 0;
	wc.lpszMenuName = NULL;
	wc.hbrBackground = (HBRUSH) ::GetStockObject(LTGRAY_BRUSH);
	wc.style = CS_GLOBALCLASS; // To be modified
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;

	return (::RegisterClass(&wc) != 0);
}

void CLineTrackBar::OnSize(UINT nType, int cx, int cy) 
{
	CWnd::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
}

void CLineTrackBar::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CRect rcClient;
	GetClientRect(rcClient);
	pItem->m_nPos =(point.x-rcClient.left-5)/pItem->m_nStep+pItem->m_nLower;
	if(pItem->m_nPos <pItem->m_nLower)
		pItem->m_nPos =pItem->m_nLower;
	else if(pItem->m_nPos >pItem->m_nUpper )
		pItem->m_nPos =pItem->m_nUpper;
	
	DrawSpike();
	Invalidate(FALSE);
	switch(pItem->m_nStype )
	{
	case RE_STRING:
		SetGroupControlText();
		break;
	}
	if(pItem->pCtrl!=NULL && pItem->m_bFocus ==TRUE)
	{
		pItem->pCtrl->SetFocus ();
	}
	CWnd::OnLButtonDown(nFlags, point);
}

void CLineTrackBar::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CRect rcClient;
	if(nFlags==MK_LBUTTON)
	{
		GetClientRect(rcClient);
		pItem->m_nPos =(point.x-rcClient.left-5)/pItem->m_nStep+pItem->m_nLower;

		if(pItem->m_nPos <pItem->m_nLower )
		{
			pItem->m_nPos =pItem->m_nLower;
		}
		else if(pItem->m_nPos >pItem->m_nUpper)
		{
			pItem->m_nPos =pItem->m_nUpper;
		}	

		DrawSpike();
		Invalidate(FALSE);
		switch(pItem->m_nStype )
		{
		case RE_STRING:
			SetGroupControlText();
			break;
		}

	}

	CWnd::OnMouseMove(nFlags, point);
}

void CLineTrackBar::SetGroupControl(int nCtrl)
{
	if(nCtrl!=-1)
		pItem->pCtrl = GetParent()->GetDlgItem(nCtrl);
	else
		pItem->pCtrl =NULL;
}

void CLineTrackBar::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	CWnd::OnLButtonUp(nFlags, point);
}

void CLineTrackBar::SetGroupControlText()
{
	if(pItem->pCtrl !=NULL)
	{
		char szText[255];
		wsprintf(szText,"%d",pItem->m_nPos );
		pItem->pCtrl->SetWindowText(szText);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -