Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4480963
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: C/C++

2011-07-07 20:15:56

工程代码: page100_1.rar  

    Windows系统为我们提供了一个画图应用程序,在该程序中,利用画笔可以绘制连 续的线条。
 
    为了绘制连续的线条,首先需要得到线条的起点,在前几次实验中我们已经实现了。然后需要补货鼠标移动过程中的每一点,着可以通过捕获鼠标移动消息VM_MOUSEMOVE来实现。在此消息响应函数中,在依次捕获到的各个点之间绘制一条条非常短的线段,从而就可以绘制出一条连续的线条。

   首先为view类增加鼠标移动消息 VM_MOUSEMOVE 的响应函数 (默认为OnMouseMove)。这样,只要鼠标在应用程序窗口中移动时,都会进入到这个消息响应函数中。但这并不是我们所期望的,我们期望在左键按下去之后才开始绘图。因此,我们需要有一个变量来表示鼠标左键是否按下去了这个状态,然后在鼠标移动消息函数中对这变量进行判断。当此变量为真,即鼠标左键已经按下去时,我们就是绘图。于是,在view类中添加一个BOOL类型的私有变量m_bDarw,当鼠标左键按下去时,此变量变为真;当鼠标左键弹出时,此变量为假,这时,我们就不需要绘制线条了。
  

   1. 在 view类中 定义代码如下:
private:
    BOOL m_bDraw;



   2. 在view类的构造函数中,将此变量初始化为 FALSE
    m_bDraw = FALSE;

   3. 当左键按下时, 即在view 的 OnLButtonDown 函数中将此变量设置为真
    m_bDraw = TURE;

   4.当左键弹起室, 即在view类的 OnLButtonUp 函数中,将此变量设置为假  
    m_bDraw = FALSE

这里,我们继续使用以前的工程

1.修改 view 类中,左键按下 消息函数
  1. void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3.     // TODO: Add your message handler code here and/or call default
  4.     
  5.     m_ptOrigin = point;//线条的起点
  6.     m_bDraw = TRUE; //判断 左键按下标志,在mouse move 消息函数中使用 标志
  7.     CView::OnLButtonDown(nFlags, point);
  8. }

2. 修改 view 类中, 左键弹开
  1. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
  2. {
  3.     // TODO: Add your message handler code here and/or call default
  4.     m_bDraw = FALSE;
  5.     CView::OnLButtonUp(nFlags, point);
  6. }

3. 添加 VM_MOUSEMOVE 鼠标移动 消息函数

  1. void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
  2. {
  3.     // TODO: Add your message handler code here and/or call default
  4.     
  5.     CClientDC dc(this);
  6.     if(m_bDraw == TRUE)
  7.     {
  8.         dc.MoveTo(m_ptOrigin);
  9.         dc.LineTo(point);
  10.         //修改线段的起点
  11.         m_ptOrigin = point;
  12.     }
  13.     CView::OnMouseMove(nFlags, point);
  14. }




画红色的线
  1. void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
  2. {
  3.     // TODO: Add your message handler code here and/or call default
  4. /*    
  5.     CClientDC dc(this);
  6.     if(m_bDraw == TRUE)
  7.     {
  8.         dc.MoveTo(m_ptOrigin);
  9.         dc.LineTo(point);
  10.         //修改线段的起点
  11.         m_ptOrigin = point;
  12.     }
  13.     CView::OnMouseMove(nFlags, point);

  14. */
  15.     CClientDC dc(this);
  16.     //创建一个红色的、宽度为1的实现画笔
  17.     CPen pen(PS_SOLID,1,RGB(255,0,0));
  18.     //把创建的画笔选入设备描述表
  19.     CPen *pOldPen = dc.SelectObject(&pen);
  20.     if(m_bDraw == TRUE)
  21.     {
  22.         dc.MoveTo(m_ptOrigin);
  23.         dc.LineTo(point);
  24.         //修改线段的起点
  25.         m_ptOrigin = point;
  26.     }
  27.     //恢复设备描述表
  28.     dc.SelectObject(pOldPen);

  29.     CView::OnMouseMove(nFlags, point);
  30. }







阅读(675) | 评论(0) | 转发(0) |
0

上一篇:透明画刷 9

下一篇:画线总结 11

给主人留下些什么吧!~~