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

📄 testctrl.cpp

📁 用VC编写的完整采样程序
💻 CPP
字号:

#include "stdafx.h"
#include "Test.h"
#include "TestCtrl.h"
#include "stdlib.h"

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


/////////////////////////////////////////////////////////////////////////////
// CTestCtrl

CTestCtrl::CTestCtrl()
{
	CTestCtrl::RegisterWndClass(AfxGetInstanceHandle());
}

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


BEGIN_MESSAGE_MAP(CTestCtrl, CWnd)
	//{{AFX_MSG_MAP(CTestCtrl)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//

BOOL CTestCtrl::RegisterWndClass(HINSTANCE hInstance)
{
	WNDCLASS wc;
	wc.lpszClassName = "TEST_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 CTestCtrl::InvalidateCtrl()
{
	CClientDC dc(this);
    CRect rc;
	GetClientRect(rc);
	CRect rcClient=rc;
	if (m_MemDC.GetSafeHdc() == NULL)
	{
		m_MemDC.CreateCompatibleDC(&dc);
		m_Bitmap.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());
		m_MemDC.SelectObject(m_Bitmap);
		m_MemDC.SetBkColor(RGB(96,160,160));
		CBrush bkBrush(NULL,RGB(96,160,160));
		m_MemDC.FillRect(rc,&bkBrush);

		CRect rc1(rc.left,rc.top,rc.left+60,rc.bottom);
		CRect rc2(rc.left,rc.bottom-30,rc.right,rc.bottom);
		m_MemDC.SetBkColor(RGB(191,191,191));
		CBrush bkBrush1(NULL,RGB(191,191,191));
		m_MemDC.FillRect(rc1,&bkBrush1);
		m_MemDC.FillRect(rc2,&bkBrush1);
	}

    //////////////////////////////////////
/*   if (m_MemDC1.GetSafeHdc() == NULL)
	{
		m_MemDC1.CreateCompatibleDC(&dc);
		m_Bitmap1.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());
		m_MemDC1.SelectObject(m_Bitmap1);
		m_MemDC1.SetBkColor(RGB(96,160,160));
		CBrush bkBrush(NULL,RGB(96,160,160));
		m_MemDC1.FillRect(rc,&bkBrush);
/////////////////////////////////////////////////////
//		CRect rc1(rc.left,rc.top,rc.left+60,rc.bottom);
		CRect rc2(rc.left,rc.bottom-30,rc.right,rc.bottom);
		m_MemDC1.SetBkColor(RGB(191,191,191));
//        dc.SetBkColor(RGB(191,191,191));
		CBrush bkBrush1(NULL,RGB(191,191,191));
//		m_MemDC1.FillRect(rc1,&bkBrush1);
//		dc.FillRect(rc1,&bkBrush1);
		m_MemDC1.FillRect(rc2,&bkBrush1);
	}
*/	range=rcClient.bottom-rcClient.top-30;
	int n=5;
//	nRange=5000;
	scale=range/(n+1);
	CPen pen1;
	pen1.CreatePen(PS_SOLID, 2, RGB(0,0,0));
	CPen* pOldPen1 = m_MemDC.SelectObject(&pen1);
	char sy[4];
	int Num;	
	for(int i=0;i<=n+1;i++)
	{
		Num=nRange*(i-1)/n;
		itoa(Num,sy,10);
//		m_MemDC.MoveTo(rcClient.left+56,int(rcClient.bottom-30-(i-1)*scale));
//		m_MemDC.LineTo(rcClient.left+45,int(rcClient.bottom-30-(i-1)*scale));
		m_MemDC.SetMapMode(TRANSPARENT);
		m_MemDC.SetTextAlign(TA_RIGHT);
		m_MemDC.TextOut(rcClient.left+45,int(rcClient.bottom-30-i*scale),sy);
	}
	m_MemDC.SelectObject(pOldPen1);

//	InvalidateRect(rc, FALSE);
}



UINT CTestCtrl::SetPos(int nIndex, UINT nPos)
{
	if (nIndex >= m_items.GetSize())
		return 0;
	CTestItem* pItem = m_items.GetAt(nIndex);
//	nPos=nPos*range/5000;
	 CRect rc;
	GetClientRect(rc);
//	if (nPos > rc.bottom-30)
//		nPos = rc.bottom-30;
//	if (nPos < rc.top)
//		nPos = rc.top;
	pItem->m_nOldPos = pItem->m_nPos;
	pItem->m_nPos = nPos;

	return pItem->m_nOldPos;
}

void CTestCtrl::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
    CRect rc;
	GetClientRect(rc);
    if (m_MemDC.GetSafeHdc() != NULL)
	    dc.BitBlt(0, 0, rc.Width(), rc.Height(), &m_MemDC, 0, 0, SRCCOPY);
}

void CTestCtrl::DrawSpike(int PointNum)//,int nRange)
{
	CRect rcClient;
	GetClientRect(rcClient);
    range=rcClient.bottom-rcClient.top-30;
	int n=5;
	scale=range/(n+1);

	//////////////////////////////////////////////////////////////////////////
	//Draw the background ---size from rc1

	//draw 横line
	CPen pen2;
	pen2.CreatePen(PS_DOT, 1, RGB(255,255,255));
	CPen* pOldPen2 = m_MemDC.SelectObject(&pen2);
	for(int ii=1;ii<=n;ii++)
	{
		m_MemDC.MoveTo(rcClient.left+60,int(rcClient.bottom-30-ii*scale));
		m_MemDC.LineTo(rcClient.right,int(rcClient.bottom-30-ii*scale));
	}
//	m_MemDC.MoveTo(rcClient.left+60,rcClient.top);
//	m_MemDC.LineTo(rcClient.left+60,rcClient.bottom-30);
	m_MemDC.SelectObject(pOldPen2);

	/////// 
	if (m_MemDC.GetSafeHdc() != NULL)
	{
		m_MemDC.BitBlt(56, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 60, 0, SRCCOPY);
     	// draw scale
     	CRect rcRight = rcClient; 
		rcRight.left = rcRight.right - 4;
//		rcRight.bottom=rcRight.bottom-30;
        m_MemDC.SetBkColor(RGB(96,160,160));
		CBrush bkBrush(NULL,RGB(96,160,160));  
    	m_MemDC.FillRect(rcRight,&bkBrush);

		///////////////////////////////////////////////
	    CRect rc2(rcClient.right-4,rcClient.bottom-30,rcClient.right,rcClient.bottom);
		m_MemDC.SetBkColor(RGB(191,191,191));
		CBrush bkBrush1(NULL,RGB(191,191,191));
		m_MemDC.FillRect(rc2,&bkBrush1);
		
		int nCount = m_items.GetSize();  //CItemArray m_items ; 
		CTestItem* pItem;
		CPoint ptOld, ptNew;
		float range1=range-scale;
		//循环画各通道的线
		for (int i=0; i<nCount; i++)
		{
			pItem = m_items.GetAt(i);
			ptOld.x = rcRight.left-1; // Minus one to make sure to draw inside the area
			ptNew.x = rcRight.right-1;
			ptOld.y =int(range-pItem->m_nOldPos*range1/nRange-scale);
			ptNew.y =int(range- pItem->m_nPos*range1/nRange-scale);
            
  			CPen pen(PS_SOLID, 1, pItem->m_colorLine);
			CPen* pOldPen = m_MemDC.SelectObject(&pen);
			m_MemDC.MoveTo(ptOld);
			m_MemDC.LineTo(ptNew);
			m_MemDC.SelectObject(pOldPen);
		}

		//写横坐标
		if(PointNum%40==0)
		{
/*			CPen pen3(PS_DOT, 1, RGB(255,255,255));
			CPen* pOldPen3 = m_MemDC.SelectObject(&pen3);
			m_MemDC.MoveTo(CPoint(rcClient.right-2, rcClient.top));
			m_MemDC.LineTo(CPoint(rcClient.right-2, rcClient.bottom-30));
			m_MemDC.SelectObject(pOldPen3);
*/			
//			CPen pen4(PS_SOLID,2,RGB(0,0,0));
//			CPen* pOldPen4 = m_MemDC.SelectObject(&pen4);
//           	m_MemDC.MoveTo(ptNew.x,rcRight.bottom-30);
//			m_MemDC.LineTo(ptNew.x,rcRight.bottom-20);
			char s[4];
			itoa(PointNum,s,10);
	        m_MemDC.SetTextAlign(TA_RIGHT);
			m_MemDC.TextOut(ptNew.x,rcRight.bottom-20,s);
//			m_MemDC.SelectObject(pOldPen4);
		}
	}
	Invalidate(FALSE);
}

BOOL CTestCtrl::Add(COLORREF color, UINT LineWidth)
{
	CTestItem* pItem = new CTestItem;
	pItem->m_colorLine = color;
	pItem->m_nLineWidth = LineWidth;
	pItem->m_nPos = 0;
	pItem->m_nOldPos = 0;

	try 
	{
		m_items.Add(pItem);
//		InvalidateCtrl(int nRange);//hyq
		InvalidateCtrl();
		return TRUE;
	}
	catch (CMemoryException* e)
	{
		if (pItem !=NULL) 
			delete pItem;
		e->Delete();
		return FALSE;
	}
}


void CTestCtrl::clear()
{	
	CClientDC dc(this); // device context for painting
	CRect rc;
	GetClientRect(rc);//底色。
	CRect rc1(rc.left+60,rc.top,rc.right,rc.bottom-30);
	m_MemDC.SetBkColor(RGB(96,160,160));
	CBrush bkBrush(NULL,RGB(96,160,160));
	m_MemDC.FillRect(rc1,&bkBrush);
	////////////////////////////////////////////////
	//下部色。
	CRect rc2(rc.left+60,rc.bottom-30,rc.right,rc.bottom);
	m_MemDC.SetBkColor(RGB(191,191,191));
	CBrush bkBrush1(NULL,RGB(191,191,191));
	m_MemDC.FillRect(rc2,&bkBrush1);
    if (m_MemDC.GetSafeHdc() != NULL)
		m_MemDC.BitBlt(56, 0, rc.Width(), rc.Height(), &m_MemDC, 56, 0, SRCCOPY);
    Invalidate();
}

void CTestCtrl::RangeChange()
{
	CPaintDC dc(this); // device context for painting
    CRect rc;
	GetClientRect(rc);
    if (m_MemDC.GetSafeHdc() != NULL)
	    dc.BitBlt(0, 0, rc.Width(), rc.Height(), &m_MemDC, 0, 0, SRCCOPY);
}

⌨️ 快捷键说明

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