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); }

posted on 2013-08-18 21:26  song2013  阅读(1742)  评论(0编辑  收藏  举报

导航