void CTriangleWaveDlg::OnPaint() 
{
    CPaintDC dc(this); // device context for painting
    CWnd* pTitle = (CWnd*)this->GetDlgItem(IDC_TITLE);
    pTitle->GetWindowRect(m_TitleRect);    while(1)
    {
      //循环绘图过程的代码
    }
}假设代码如上面所示,我的界面上有“继续”、“暂停”两个按钮,我想用这两个按钮来控制绘图过程,不知如何实现。在OnPaint()函数的代码执行过程中,点击界面按钮都是无效的。

解决方案 »

  1.   

    加个变量控制void CTriangleWaveDlg::OnPaint()
    {
    CPaintDC dc(this); // device context for painting
    CWnd* pTitle = (CWnd*)this->GetDlgItem(IDC_TITLE);
    pTitle->GetWindowRect(m_TitleRect);while(true)
    {
    if(m_bStop)
    {
    //循环绘图过程的代码
    }sleep(1);
    }
    }void CTriangleWaveDlg::OnStop(void)
    {
    m_bStop = false;
    }void CTriangleWaveDlg::OnStart(void)
    {
    m_bStop = true;
    }
      

  2.   

    因为它也是主线程中执行的代码,当然在执行OnPaint的过程中无法点击其它按钮了.在OnPaint中while(true)?你的程序不干其它工作了?
      

  3.   

    线程控制作图
    OnPaint只负责显示当前静态对象,可以利用CArray<OBJ,OBJ>来传递图形对象
      

  4.   

    OnPaint里为什么要循环绘制?绘制一遍不都有了么?如果你非要循环绘制,可以这样:
    void CXXX::OnPaint()
    {
    // ....
    while(!m_bStop)
    {
    // draw...
    }
    }
    void CXXX::OnBtnControl()
    {
    m_bStop = !m_bStop;
    Invalidate();
    }不过我估计不用循环,可以这样:
    void CXXX::OnPaint()
    {
    // ....
    if (!m_bStop)
    {
    // draw...
    }
    }
    void CXXX::OnBtnControl()
    {
    m_bStop = !m_bStop;
    Invalidate();
    }Invalidate可以考虑换成InvalidateRect.
      

  5.   

    肯定要有个线程负责绘制的, 用一个Event来通知线程是否继续绘制
      

  6.   

    用SetTimer,定时器了,就好像DirectX的游戏那样。
      

  7.   

    定义一个全局DC,在定时器里面绘制图形到全局DC上,绘制代码里面加上条件判断标识,怎么绘制就看楼主的设计.
    然后在每次OnTimer结束的时候Invalidate一下窗口,在OnDraw里面用pDC->Bitblt把全局DC的东西拷贝过来就可以实现一步一步绘制图形的效果.
      

  8.   

    在OnPaint中启动一个线程画图,其它如暂停恢复按钮用SuspendThread()和ResumeThread()挂起和恢复线程运行,这样可以解决问题
      

  9.   

    要不开新线程进行绘制
    要不用SetTimer,在OnTimer中绘制在OnDraw和OnPaint中都不行