📄 testctrl.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 + -