用vc++来绘制动态曲线..doc
文本预览下载声明
VC动态曲线绘制
◇实验方法:
用Visual C++实现动态曲线的绘制有4种方法。(1)使用消隐。(2)使用重绘。其中重绘按照原理的不同又分为3种。
1消隐。其实消隐的方法很简单,主要使用CDC类的成员函数SetROP2 。该函数原型为int SetROP2( int nDrawMode )。参数nDrawMode为新的绘制方式。该函数用来设置当前绘制方式,绘制方式说明画笔和被填充对象的内部如何与屏幕表面已有的颜色组合。我们选用R2_XORPEN绘制方式——画笔颜色和屏幕颜色的组合,但不同时在两者之中,最终像素=画笔XOR屏幕像素。要实现动态曲线只需在这种绘制方式下在原有曲线的位置上再绘一次,以消隐掉原有曲线,再绘制新的曲线,如此重复,就可形成动态曲线。
2.重绘。在重绘中都要使用到这样一个函数:CDC类成员函数BitBlt 。原型为BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop )。该函数将一个位图从源设备描述表拷贝到CDC的设备描述表中。
1)原理1:设置一个后台设备环境。所有的绘图工作都在后台完成,然后通过BitBlt 函数拷贝到当前设备环境。这种方法要求后台每次都全部重绘,包括坐标、字符说明、曲线等。
应用举例:
在OnTimer 函数中每隔一定时间进行重绘。
void CDrawView::OnTimer(UINT nIDEvent)
{
?????? // TODO: Add your message handler code here and/or call default
?????? DrawPicture();????? // 画图函数
}
void CDrawView::DrawPicture()
{
??? pBackDC-PatBlt(0,0,winx, winy, PATCOPY);
?????? //画坐标轴及刻度
?????? DrawCoordinate(pBackDC ,BLACKPEN, MainWindowLeft,MainWindowBottom - MAINHEIGHT, MainWindowLeft + MAINWIDTH, MainWindowBottom);
?????? //标出x坐标刻度值
?????? WriteCoordinateX(pBackDC, BLACKPEN, MainWindowLeft,MainWindowLeft + MAINWIDTH, MainWindowBottom);
?????? //标出y坐标刻度值
?????? WriteCoordinateY(pBackDC,BLACKPEN,MainWindowLeft,MainWindowBottom );
?????? //输出实际宽度值
?????? WriteMessage(pBackDC,MainWindowLeft,MainWindowBottom,MAINHEIGHT );
??? if ( pBackDC != NULL )
?????? {
//画曲线图
?????? DrawGraph(pBackDC,REDPEN,MainWindowLeft+MAINWIDTH,MainWindowBottom);?????????????
CDC *pDC = GetDC();
????????????? if (pDC != NULL)
????????????? {
//调用OnDraw()函数,将曲线图显示在屏幕中
???????????????????? OnDraw(pDC); ???
???????????????????? ReleaseDC(pDC);
????????????? }
?????? }
}
void CDrawView::OnDraw(CDC* pDC)
{
?????? CDrawDoc* pDoc = GetDocument();
?????? ASSERT_VALID(pDoc);
?????? // TODO: add draw code for native data here
?????? if (pDC != NULL)
????????????? pDC-BitBlt(0,0,winx, winy, pBackDC, 0, 0, SRCCOPY);
}
(3)原理2:设置一个后台设备环境(如图2),其大小与当前设备环境相同(如图1)。但主要绘图工作都在当前设备环境进行。例如设当前设备环境大小为200×100,曲线点之间的间距offset=5,左上角顶点在屏幕中的坐标为(200,100)。当
显示全部