VC中画矩形框 & polyline画多点
搞自动化会经常遇到一个问题就是记录实时的曲线,通常做法是首先将数据保存在一个记事本中,或数据库。使用VB或DELPHI可以直接调用现成的控件画图,只是控制起来不方便。所以使用VC就需要程序来控制。在网上搜了好多就是 没有一个完整的例子。下面就是使用VC6.0实现画任意曲线的方法之一。
void CLineView::OnLine()
{
// TODO: Add your command handler code here
POINT pts[5];
long a[5]={20,50,60,10,180};
long b[5]={10,20,30,40,50};
for(int i=0;i<5;i++)
{
pts[i].x=b[i];
pts[i].y=a[i];
}
//selectobject(hDC,InVisiblepen);
//const POINT* ppts=pts;
HDC hdc;
hdc=::GetDC(m_hWnd);
::Polyline(hdc,pts,5);
::ReleaseDC(m_hWnd,hdc);
}
首先做一个消息响应函数,在此基础上编写上述代码就可以实现画线功能。可以把记事本的数据放入a中,令b为时间即可。
如何在VC中画矩形框
纠结了好久,终于明白如何在显示的BMP图片上选定一个矩形框,然后使选定的区域转变成相应的别的颜色,最重要的还是如何让矩形框成功的显示,然后回传相应的参数(鼠标点下的坐标,鼠标点起的坐标)将其传到颜色改变的函数中,达到使相应的区域变色的目的。
其中 画矩形框的步骤如下:
问题详细描述:(三步)
单击鼠标左键时记录下单击点;
鼠标拖动时,显示的矩形框能够动态的跟随显示;
释放鼠标左键时擦出矩形框。
这样分析其实问题就简单一些了,只需要对鼠标的三个事件进行相应就可以了。
代码主要在三处地方修改了:
第一处:VIEW类中设置私有变量(VIEW类.h文件中)
private:
BOOL m_startRect; //绘制矩形框标志
CPoint m_startPoint; //矩形框开始点
CPoint m_OldPoint; //矩形框终点(但是它是上一次的点,所以这里用了Old标识)
第二处:VIEW类构造函数中初始化私有变量(VIEW类.cpp文件中)
CMouseDragView::CMouseDragView()
{
//初始化私有变量
m_startRect = FALSE;
m_startRect = 0;
m_OldPoint = 0;
}
第三处:定义消息响应函数(VIEW类.cpp文件中)
//单击鼠标左键
void CMouseDragView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_startRect = TRUE; //鼠标左键单击,设置可以开始绘制矩形框
m_startPoint = point; //记录开始点
m_OldPoint = point; //设置老点也为开始点
CView::OnLButtonDown(nFlags, point);
}
//拖动鼠标
void CMouseDragView::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC dc(this); //获取设备句柄
//SetRop2 Specifies the new drawing mode.(MSDN)
//R2_NOT Pixel is the inverse of the screen color.(MSDN)
//即:该函数用来定义绘制的颜色,而该参数则将颜色设置为原屏幕颜色的反色
//这样,如果连续绘制两次的话,就可以恢复原来屏幕的颜色了(如下)
//但是,这里的连续两次绘制却不是在一次消息响应中完成的
//而是在第一次拖动响应的绘制可以显示(也就是看到的),第二次拖动绘制实现擦出(也就看不到了)
dc.SetROP2(R2_NOT); //此为关键!!!
dc.SelectStockObject(NULL_BRUSH); //不使用画刷
if (TRUE == m_startRect) //根据是否有单击判断是否可以画矩形
{
dc.Rectangle(CRect(m_startPoint,m_OldPoint));
dc.Rectangle(CRect(m_startPoint,point));
m_OldPoint = point;
}
CView::OnMouseMove(nFlags, point);
}
//释放鼠标左键
void CMouseDragView::OnLButtonUp(UINT nFlags, CPoint point)
{
m_startRect = FALSE; //重置绘制矩形框标志
//消隐最后的一个矩形(其原理跟拖动时矩形框绘制原理相同)
CClientDC dc(this);
dc.SetROP2(R2_NOT);
dc.SelectStockObject(NULL_BRUSH);
dc.Rectangle(CRect(m_startPoint,m_OldPoint));
CView::OnLButtonUp(nFlags, point);
}