文档详情

VC橡皮筋绘图技术的实现.doc

发布:2017-04-19约1.92千字共3页下载文档
文本预览下载声明
VC橡皮筋绘图技术的实现 ???????在我们在使用微软的绘图程序时。当要画一条直线,先用鼠标确定起始位置,然后鼠标在屏幕上来回移动时,我们会发现,这条直线就像橡皮筋一样,随着鼠标在屏幕中的位置,长短和终点都随之变化。我们在编制自己的程序时,有时也需实现类似的功能,本文将通过简单的编程实例,并说明实现原理。 一。实现原理: ??????? 利用了WINDOWS绘图模式中的“异或”的绘图特性。即在屏幕上用异或的模式画图形,然后再用异或的模式,在相同的位置重新画一次此图形,则就会在屏幕上擦出掉上一次所绘制的内容。 具体在程序中, 1。当按下鼠标左键时,用异或的绘图模式在屏幕上画图形。 2。当鼠标移动后,先用异或的绘图模式擦掉上次绘制的图形。然后在新的位置绘制图形。 3。当鼠标左键被抬起时。在最终的位置用正常的颜色重新绘制图形。结束。 二。编程???例:本文举一个画直线的例子,其他画矩形和圆弧的实现方法完全相同,读者可自行编制。 1。用VC6.0生成一个基于单文档的程序。 2。在view类中添加如下变量: ?CPoint OriginPos;??? // 绘图的起始点 ?CPoint TargetPos;?? // 绘图的目标点 ?bool m_bDrawing;??? // 是否在绘图状态 3。用ClassWizard在view类中添加 WM_LBUTTONDOWN WM_LBUTTONUP WM_MOUSEMOVE 消息响应函数。具体程序如下: void CXv003View::OnLButtonDown(UINT nFlags, CPoint point) { ?m_bDrawing = true; ?OriginPos = point;?? ?TargetPos = point; ?CView::OnLButtonDown(nFlags, point); } void CXv003View::OnLButtonUp(UINT nFlags, CPoint point) { ?if (!m_bDrawing ) ??return; ?m_bDrawing = false; ? ?CClientDC?? ClientDC(this);?? ?ClientDC.DPtoLP(point);?? ?ClientDC.SelectStockObject(NULL_BRUSH); ? ?CPen pen, *oldPen; ?pen.CreatePen(PS_SOLID,1,RGB(255,0,0)); ?oldPen = ClientDC.SelectObject(pen); ?ClientDC.SetROP2( R2_COPYPEN );? ?ClientDC.MoveTo(OriginPos.x,OriginPos.y);?? ClientDC.LineTo(TargetPos.x,TargetPos.y);?? ClientDC.SelectObject(oldPen); CView::OnLButtonUp(nFlags, point); } void CXv003View::OnMouseMove(UINT nFlags, CPoint point) { ?if ( !m_bDrawing ) ??return; ? ?CClientDC?? ClientDC(this);? ?ClientDC.DPtoLP(point);?? ?ClientDC.SelectStockObject(NULL_BRUSH); ? ?CPen pen, *oldPen; ?pen.CreatePen(PS_SOLID,1,RGB(255,0,0)); ?oldPen = ClientDC.SelectObject(pen); ?ClientDC.SetROP2(R2_NOT);?? ?ClientDC.MoveTo(OriginPos.x,OriginPos.y);?? ?ClientDC.LineTo(TargetPos.x,TargetPos.y);??? ?TargetPos = point;??? ?ClientDC.MoveTo(OriginPos.x,OriginPos.y);?? ?ClientDC.LineTo(TargetPos.x,TargetPos.y);?? ?ClientDC.SelectObject(oldPen); ?CView::OnMouseMove(nFlags, point); } 编译执行。此程序在VC6.0上,和winxp下调试通过。
显示全部
相似文档