我想编一个程序,在(x1,y1) - (x2,y2)两个点间,随着时间的推移(用WM_TIMER消息),从x1,y1慢慢的将线画到x2,y2点,有什么思路

解决方案 »

  1.   

    pDC->MoveTo(x1,y1);
    pDC->LineTo(x3,y3);
    ...
    pDC->LineTo(x2,y2);
      

  2.   

    先定义一个全局变量int n,初始化为0然后在OnDraw()函数中写
    for(int i=0;i<=n&&i<=x2-x1;i++)
    {    画点(x1+i,y1+i*(y2-y1)/(x2-x1));
    }
    n++;在OnTime函数中使用Invalidate()函数就可以了
    主要思想就是每次都画一条比上次都一个点的线
      

  3.   

    如果想不闪烁的话,可以采用橡皮筋技术,把绘图模式设成R2_NOT,
      

  4.   

    用CMemDC双缓冲技术可以避免闪烁。#ifndef _MEMDC_H_
    #define _MEMDC_H_// flicker free drawing.class CMemDC : public CDC {
    private:
    CBitmap m_bitmap; // Offscreen bitmap
    CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
    CDC* m_pDC; // Saves CDC passed in constructor
    CRect m_rect; // Rectangle of drawing area.
    BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
    public:

    CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
    {
    ASSERT(pDC != NULL);  // Some initialization
    m_pDC = pDC;
    m_oldBitmap = NULL;
    m_bMemDC = !pDC->IsPrinting(); // Get the rectangle to draw
    if (pRect == NULL) {
    pDC->GetClipBox(&m_rect);
    } else {
    m_rect = *pRect;
    } if (m_bMemDC) {
    // Create a Memory DC
    CreateCompatibleDC(pDC);
    pDC->LPtoDP(&m_rect); m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
    m_oldBitmap = SelectObject(&m_bitmap); SetMapMode(pDC->GetMapMode()); SetWindowExt(pDC->GetWindowExt());
    SetViewportExt(pDC->GetViewportExt()); pDC->DPtoLP(&m_rect);
    SetWindowOrg(m_rect.left, m_rect.top);
    } else {
    // Make a copy of the relevent parts of the current DC for printing
    m_bPrinting = pDC->m_bPrinting;
    m_hDC       = pDC->m_hDC;
    m_hAttribDC = pDC->m_hAttribDC;
    } // Fill background 
    FillSolidRect(m_rect, pDC->GetBkColor());
    }

    ~CMemDC()
    {
    if (m_bMemDC) {
    // Copy the offscreen bitmap onto the screen.
    m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
    this, m_rect.left, m_rect.top, SRCCOPY);

    //Swap back the original bitmap.
    SelectObject(m_oldBitmap);
    } else {
    // All we need to do is replace the DC with an illegal value,
    // this keeps us from accidently deleting the handles associated with
    // the CDC that was passed to the constructor.
    m_hDC = m_hAttribDC = NULL;
    }
    }

    // Allow usage as a pointer
    CMemDC* operator->() 
    {
    return this;
    } // Allow usage as a pointer
    operator CMemDC*() 
    {
    return this;
    }
    };#endif
      

  5.   

    楼上的大哥,好像没有这么复杂吧
    要想不闪,每次就不要重画整个视图,只是重画需要的部分就可以了
    调用OnPaint()函数,
    Void CView OnPaint()
    {
       CDC* pDC=GetDC();
       pDC->Moveto(x1,y1);
       pDC->Lineto(x1+i,y1+i*(y2-y1)/(x2-x1));
       i++;
    }
    其中i定义为全局变量,初始化为0
    然后在OnCreate()函数中产生一个计时器SetTimer(1,100,NULL);
    调用ONTime函数,在其中发送WW_PAINT消息就可以了
    SendMessage(WW_PAINT);
    很简单的,保证一点都不闪