"); //-->
绘制思路:做一个自定义控件插入界面中
具体步骤:
(1)横轴划分为若干点,使用Moveto+Lineto连线,定时刷新实现动态效果;
(2)在程序中,使用CPaintDC,CClientDc,CDC,CBitMap,CBrush等绘图类;
(3)绘图程序分为几大部分:注册类句柄、刷新机制、设定坐标系、绘图;
部分代码如下:
BOOL CLineChartCtrl::RegisterWndClass(HINSTANCE hInstance)
{
WNDCLASSW wc;
wc.lpszClassName = TEXT("LineChartCtrl"); // matches class name in client
。。。
return (::RegisterClass(&wc) != 0 ); }
void CLineChartCtrl::InvalidateCtrl()
{
CClientDC dc(this);
CRect rcClient;
GetClientRect(rcClient);
if (m_MemDC.GetSafeHdc() == NULL)
{
m_MemDC.CreateCompatibleDC(&dc);
m_Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
m_MemDC.SelectObject(m_Bitmap);
m_MemDC.SetBkColor(RGB(255,255,255)); //静态背景色
CBrush bkBrush(RGB(160,160,160));
m_MemDC.FillRect(rcClient,&bkBrush);
}
InvalidateRect(rcClient, FALSE);
}
float CLineChartCtrl::SetPos(int nIndex, float nPos)
{
。。。}
void CLineChartCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClient;
GetClientRect(rcClient);
// draw scale
if (m_MemDC.GetSafeHdc() != NULL)
dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 0, 0, SRCCOPY);
}
void CLineChartCtrl::DrawSpike()
{
CRect rcClient;
GetClientRect(rcClient);
if (m_MemDC.GetSafeHdc() != NULL) //竖线间隔宽度
{
m_MemDC.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 20, 0, SRCCOPY);
// draw scale
CRect rcRight = rcClient;
rcRight.left = rcRight.right - 20;
m_MemDC.SetBkColor(RGB(255,255,255)); //运行时背景色
CBrush bkBrush(RGB(160,160,160));
m_MemDC.FillRect(rcRight,&bkBrush);
static BOOL bDrawVerticle = FALSE;
bDrawVerticle = !bDrawVerticle;
if (bDrawVerticle)
{
CPen pen(PS_SOLID, 1, RGB(128,128,128)); //纵轴色
CPen* pOldPen = m_MemDC.SelectObject(&pen);
m_MemDC.MoveTo(CPoint(rcClient.right-2, rcClient.top));
m_MemDC.LineTo(CPoint(rcClient.right-2, rcClient.bottom));
m_MemDC.SelectObject(pOldPen);
}
int nCount = m_items.GetSize();
CLineChartItem* pItem;
CPoint ptOld, ptNew;
for (int i="0"; i<nCount; i++)
{
pItem = m_items.GetAt(i);
float nRange = pItem->m_nUpper - pItem->m_nLower;
ptOld.x = rcRight.left-1; // Minus one to make sure to draw inside the area
ptNew.x = rcRight.right-1;
ptOld.y = (int)((((float)(nRange - pItem->m_nOldPos))/(float)nRange)
* (float)rcRight.Height());
ptNew.y = (int)((((float)(nRange - pItem->m_nPos))/(float)nRange)
* (float)rcRight.Height());
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);
}
}
}
BOOL CLineChartCtrl::Add(COLORREF color, float Upper, float Lower)
{
CLineChartItem* pItem = new CLineChartItem;
pItem->m_colorLine = color;
pItem->m_nLower = Lower;
pItem->m_nUpper = Upper;
pItem->m_nPos = 0;
pItem->m_nOldPos = 0;
try
{
m_items.Add(pItem);
InvalidateCtrl();
return TRUE;
}
catch (CMemoryException* e)
{
if (pItem !=NULL)
delete pItem;
e->Delete();
return FALSE;
}
}
void CLineChartCtrl::Go()
{
DrawSpike();
Invalidate(FALSE);
}

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
持续扭矩驱动峰值性能
孙天泽老师《嵌入式Linux中的调试技术》PDF课件下载
富士康租赁德克萨斯州工厂以扩大AI服务器产能
这样的世界——2
地平线CEO余凯:未来两到三年,自动驾驶「飞入寻常百姓家」
孙天泽老师《嵌入式Linux中的调试技术》实况视频下载
SN75436/75437A/75438低输入电流低功耗外围驱动器
Arm计算子系统旨在加快汽车AI芯片设计
CES 2010:Lenovo S10-3t 小平板
这款“机器人鸟”以 45 英里/小时的速度在森林中飞行——无需 GPS 或灯光
FTP重新开放
SN55476~SN55479双外围驱动器
混合用于低功耗传感器的模拟和数字脉冲神经网络
门电路组成的床头延时灯
芯片巨头,「扔掉」这些业务
在 WWDC 25 上,苹果应该就 AI 不足和诉讼向开发者进行赔偿
第一讲、FPGA设计基础(视频下载)
CES 2010:3D 电视
CES 2010:联想Lenovo IdeaPad U1 Hybrid
2003嵌入式系统开发与测试高级论坛
美军开始攻打伊拉克了,对电子行业有什么影响?
CES 2010:外星人...Alienware M11X 推出
由CD4017构成的延时灯控制器
2003中国嵌入式系统开发与测试高级论坛
CES 2010:WiFi充电器 利用无线信号为手机充电
网络犯罪分子攻击智能家居,BadBox 2.0 僵尸网络在全球蔓延
嵌入式Linux预科班培训讲义 下载
由CD4022组成的卫生间自动照明开关
三年暴涨50%!全球首个AI家庭机器人龙头赴港上市
孙志夫老师《嵌入式Linux系统平台构建》PDF课件下载