VC橡皮筋绘图技术的实现

53 篇文章 0 订阅
5 篇文章 0 订阅

       在我们在使用微软的绘图程序时。当要画一条直线,先用鼠标确定起始位置,然后鼠标在屏幕上来回移动时,我们会发现,这条直线就像橡皮筋一样,随着鼠标在屏幕中的位置,长短和终点都随之变化。我们在编制自己的程序时,有时也需实现类似的功能,本文将通过简单的编程实例,并说明实现原理。

一。实现原理:

        利用了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下调试通过。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值