none
如何实现画线功能不被重绘 RRS feed

  • 问题

  • 我编写的画线程序在OnLButtonUp(UINT nFlags, CPoint point)中可以运行但是改变窗口大小时会被重会掉于是去ONDraw中编写了下面代码pDC->MoveTo(m_point); pDC->LineTo(m_Bpoint); m_point是全局变量保存了OnLButtonDown(UINT nFlags, CPoint point)中的点; m_Bpoint是全局变量保存了OnLButtonUp(UINT nFlags, CPoint point)中的点; 这个程序画线是失败的 于是在OnLButtonUp(UINT nFlags, CPoint point)写了如下代码; m_pDC=GetDC(); m_pDC->MoveTo(m_point); m_pDC->LineTo(m_Bpoint); ReleaseDC(m_pDC); m_pDC是一个CDC对象; 但是在实现画线功能后在窗口重绘时候只能保存一条线 ; 请问这是为什么呢; 还有最重要一点请各位大侠写出一个画线程序不被重绘的源代码 ; 感激不尽,谢谢了;
    2009年9月13日 8:49

答案

  • 可以用个成员变量保存鼠标点过的所有点。
    在OnPaint里面把这些点连成线。
    在OnLButtonDown和OnLButtonUp中只做逻辑处理(保存点对,PointPair)
    在OnPaint里面画出这些点对PointPair。

    • 已标记为答案 Tim Li 2009年9月25日 10:24
    2009年9月14日 3:15
  • 呵呵,首先,绘制应该放到OnPaint里面,不是OnDraw.OnPaint在重绘时自动调用你放在里面的代码,这样就可以重绘出来了.

    一段简单的代码(部分):
    case WM_PAINT:
          hDC = ::BeginPaint(...);
          ::MoveTo(hDC, 10, 10, ...);
          ::LineTo(hDC, 100, 100);
          ::EndPaint();
          break;

    你只要把里面的数值换成变量就可以了.


    0xBAADF00D
    • 已标记为答案 Tim Li 2009年9月25日 10:24
    2009年9月14日 14:04
    版主

全部回复

  • 可以用个成员变量保存鼠标点过的所有点。
    在OnPaint里面把这些点连成线。
    在OnLButtonDown和OnLButtonUp中只做逻辑处理(保存点对,PointPair)
    在OnPaint里面画出这些点对PointPair。

    • 已标记为答案 Tim Li 2009年9月25日 10:24
    2009年9月14日 3:15
  • 怎么保存点对呢 有专用的函数么 对了可以保存数据么窗口重绘的时候 保存数据我也不会知道的话写下代码谢谢了呵呵

    2009年9月14日 5:56
  • 可以定义一个窗体成员变量
    std::vector<std::pair<CPoint,CPoint> > m_vtrLines;
    一个点对表示一条直线。
    然后在OnPaint里面去读取这些点对,画出来。

    2009年9月14日 6:08
  • 呵呵,首先,绘制应该放到OnPaint里面,不是OnDraw.OnPaint在重绘时自动调用你放在里面的代码,这样就可以重绘出来了.

    一段简单的代码(部分):
    case WM_PAINT:
          hDC = ::BeginPaint(...);
          ::MoveTo(hDC, 10, 10, ...);
          ::LineTo(hDC, 100, 100);
          ::EndPaint();
          break;

    你只要把里面的数值换成变量就可以了.


    0xBAADF00D
    • 已标记为答案 Tim Li 2009年9月25日 10:24
    2009年9月14日 14:04
    版主