CRect dc;
GetClientDC(&dc);
试试吧

解决方案 »

  1.   

    MFC是线程级别不安全的
    你不能够传递对话框的指针,或者对话框绘图设备的CDC
    但是你有更很好的办法--传递对话框的句柄HWND,或者直接传递HDC给线程,
    具体做法是
    HDC Hdc=GetWindowDC()->GetSafeHdc();
    传递HDC给线程参数
    如果不习惯用API,你可以用CDC::RROMHANDLE()重建立CDC类
    就这样,记得给我加分哦。呵呵
      

  2.   

    是加在CDisplay::OnStartDisplaying吧,为什么编译错误?
    LRESULT CDisplay::OnStartDisplaying(WPARAM wParam, LPARAM lParam)
    {  
        CRect dc;
        GetClientDC(&dc);    if (sound1==NULL) return FALSE;
        int i,x1,x2,y1,y2;
        .
        .
        .
    }
    /////////////////////////////////////////////////
    error C2065: 'GetClientDC' : undeclared identifier
      

  3.   

    (to)善良的石头
    void CCPsoundDlg::OnButton1() 
    {   
      HDC Hdc=GetWindowDC()->GetSafeHdc(); m_DisplayThread->PostThreadMessage(WM_DISPLAY_STARTDISPLAYING, Hdc, 0L);
      

  4.   

    error C2018: unknown character '0xa3'
    错误太多,我本来线程也是刚学。。不是太懂
    好事做到底,帮我写全吧(加在我的程序中)谢谢!我的概念不是太清楚。
    用传递过后的句柄Hdc如何画图line() bar()怎么改。。
      

  5.   

    建议你在线程类中声明一个变量,CDC,CWindowDC,CClientDC
    CClientDC dc(this);
    然后在启动线程的对话框中这样做CDisplay *m_pMsgLogThread=(CDisplay *) AfxBeginThread(
    RUNTIME_CLASS(CDisplay),THREAD_PRIORITY_BELOW_NORMAL,
    0,CREATE_SUSPENDED);
    m_pMsgLogThread->m_dc=dc;
    m_pMsgLogThread->ResumeThread();而后:
    LRESULT CDisplay::OnStartDisplaying(WPARAM wParam, LPARAM lParam)
    {  
        int i,x1,x2,y1,y2;      
        if (data==NULL) return FALSE;
          
        // 如何获得dc....
        bar(&m_dc,90,4,538,225);  //bar 和 line 是自己编的函数。
        for (i=0;i<490;i++) {
          x1=i+110; y1=(short)(120-(140.0*data[2*i])/20000);  
          x2=i+111; y2=(short)(120-(140.0*data[2*(i+1)])/20000); 
          line(&m_dc,x1,y1,x2,y2);
        }
        return TRUE;
    }
      

  6.   

    建议你在线程类中声明一个变量,CDC,CWindowDC,CClientDC
    CClientDC m_dc(this);
    然后在启动线程的对话框中这样做
      

  7.   

    请问各位大侠:
      如何象楼上dgb所讲的那样,在我的线程类中声明这个变量:
      //CDC,CWindowDC,CClientDC
      CClientDC m_dc(this); //此处不需要  "(this)" 吧
      
      具体代码怎么写?为什么编译时出错:
      CClientDC' : no appropriate default constructor available
      怎么改? 呵呵,由于基础不好,所以,这些都要问~~。  那位大侠可以告诉我。谢谢
      

  8.   

    你可以把对话框的指针作为线程的参数传进去,然后就好了
      pThread=AfxBeginThread((AFX_THREADPROC)ThreadTest,this);
    然后:
       UINT ThreadTest(LPVOID param)
    {
       CTest *pDlg=(CTest *)param;
      ...............
      

  9.   

    头快大了,
    加了一句       CDisplay *m_pMsgLogThread=(CDisplay *) AfxBeginThread((AFX_THREADPROC)CDisplay,this);出错:
    E:\Cp\CPsound4\CPsoundDlg.cpp(141) : error C2275: 'CDisplay' : illegal use of this type as an expression
            e:\cp\cpsound4\display.h(27) : see declaration of 'CDisplay'
    那位高人,可以帮我写详细些(根据我的程序),问题已经问了好几天,但是基础太差所以一直没有掌握大家的方法~~//还有,谁可以回答:
      如何象楼上dgb所讲的那样,在我的线程类中声明这个变量:
      //CDC,CWindowDC,CClientDC
      CClientDC m_dc(this); //此处不需要  "(this)" 吧
      
      具体代码怎么写?为什么编译时出错:
      CClientDC' : no appropriate default constructor available
      

  10.   

    ///////////////////////////////////////////////////////////////
    void CProDlg::OnButton1() 
    {    
        CClientDC dc(this); 
        CMyThiread* m_DisplayThread->PostThreadMessage(WM_DISPLAY_STOPDISPLAYING, 0, this);}
    ////////////////////////////////////////////////////////////////
    LRESULT CDisplay::OnStartDisplaying(WPARAM wParam, LPARAM lParam)
    {  
        int i,x1,x2,y1,y2;      
        if (data==NULL) return FALSE;
          
        // 如何获得dc....
    HWND hDlg = (CMyThread*)param_->m_hWnd;
    CWnd * pWnd = CWnd::FromHandle(hDlg);
    //然后使用指针pWnd进行Dlg下的操作
        bar(&dc,90,4,538,225);  //bar 和 line 是自己编的函数。
        for (i=0;i<490;i++) {
          x1=i+110; y1=(short)(120-(140.0*data[2*i])/20000);  
          x2=i+111; y2=(short)(120-(140.0*data[2*(i+1)])/20000); 
          line(&dc,x1,y1,x2,y2);
        }
        return TRUE;
    }
      

  11.   

    UINT MyThread(LPVOID pParam) //全局函数
    {
        CDC* pDC = ::AfxGetApp()->m_pMainWnd->GetDC();
             //以下是自己写的测试绘图..
    CRect rect;
    ::AfxGetApp()->m_pMainWnd->GetClientRect(&rect);
    for(int i = rect.left +1 ;  i < rect.right ; i = i + 20)
    for(int j = rect.top  ; j < rect.bottom; j = j + 20)

    pDC->Ellipse(i,j,i+20,j+20);
    Sleep(10);

    }
        return 1;
    }void CProDlg::OnButton1() 
    {   //开始线程.. 
        CWinThread* pStart1 = (CWinThread*) AfxBeginThread(MyThread,GetSafeHwnd(),
                   THREAD_PRIORITY_NORMAL,0,0,NULL);
    }
    //我试过,绝对可以的,不信你新建一个对话框模式的工程试试...
    //70分....一定要给...........呵呵........
      

  12.   

    to (阿酷):
    我画线的线程是:
    LRESULT CDisplay::OnStartDisplaying(WPARAM wParam, LPARAM lParam)
    {  
        if (sound1==NULL) return FALSE;
        int i,x1,x2,y1,y2;
        CDC* pDC = ::AfxGetApp()->m_pMainWnd->GetDC();    for (i=0;i<490;i++) {
           x1=i+110; y1=(short)(120-(140.0*sound1[2*i])/20000);  
           x2=i+111; y2=(short)(120-(140.0*sound1[2*(i+1)])/20000); 
           pDC->MoveTo(x1,y1); pDC->LineTo(x2,y2);
        }
      return TRUE;
    }按钮消息中
    void CProDlg::OnButton1() 
    {  //开始线程.. 
       CWinThread* pStart1 = (CWinThread*) AfxBeginThread
            (MyThread,GetSafeHwnd(),THREAD_PRIORITY_NORMAL,0,0,NULL);
      ///??????该句改成我的线程“CDisplay”,具体怎么变??还是没有掌握~~谢谢
    }
    //////////////////////////////////////////////////////
       CWinThread* pStart1 = (CWinThread*) AfxBeginThread
       (CDisplay,GetSafeHwnd(),THREAD_PRIORITY_NORMAL,0,0,NULL);错误信息:
    E:\Cp\CPsound4\CPsoundDlg.cpp(146) : error C2275: 'CDisplay' : illegal use of this type as an expression
            e:\cp\cpsound4\display.h(27) : see declaration of 'CDisplay' ////////////////////////////////////////////////////
      

  13.   

      一般来说,只有全局函数才能够作为参数传递给AfxBeginThread。
    因为类的普通成员函数依赖具体对象的存在。如果对象已经析构而线程尚未结束的话会出
    问题的。
       每个类的普通成员函数带有一个this指针作为缺省参数,实际上与AfxBeginThread
    的要求不符。
    所以:
    1: 你要么把全局函数作为线程函数..
    2: 如果你定义一个类的成员函数作为线程函数,必须把此函数定义为static才行..
    这是因为必须是静态的,在内存中有固定地址的才可以..
      试试吧,一定可以的,我以前也遇到过你同样的问题,把函数定义为静态就解决了,图方便的话,直接定义为全局函数也行,而且这也是通用的方法.......
      

  14.   

    CRect dc;
    GetClientDC(&dc);
    这是什么招数?我纳闷...
      

  15.   

       我的问题解决了。现在开始给分
    阿酷的方法比较简单。我最后使用了
    请 阿酷 去拿分 http://www.csdn.net/Expert/topic/430/430353.shtmto 阳关故人: 
    CMyThiread* m_DisplayThread->PostThreadMessage(WM_DISPLAY_STOPDISPLAYING, 0, this);//提示:参数3 无法转换。有机会我再看看再次感谢大家的关注和帮助!!!谢谢!
      

  16.   


    抱歉,前一段时间不能上网,没有回答,不好意思!
    void CProDlg::OnButton1() 
    {    
        CClientDC dc(this); 
        CDisplay *m_pMsgLogThread=(CDisplay *) AfxBeginThread(
    RUNTIME_CLASS(CDisplay),THREAD_PRIORITY_BELOW_NORMAL,
    0,CREATE_SUSPENDED);
    m_pMsgLogThread->m_dc=dc;
    m_pMsgLogThread->ResumeThread();
    }
    而后:
    LRESULT CDisplay::OnStartDisplaying(WPARAM wParam, LPARAM lParam)
    {  
        int i,x1,x2,y1,y2;      
        if (data==NULL) return FALSE;
          
        // 如何获得dc....
        bar(&m_dc,90,4,538,225);  //bar 和 line 是自己编的函数。
        for (i=0;i<490;i++) {
          x1=i+110; y1=(short)(120-(140.0*data[2*i])/20000);  
          x2=i+111; y2=(short)(120-(140.0*data[2*(i+1)])/20000); 
          line(&m_dc,x1,y1,x2,y2);
        }
        return TRUE;
    }
      

  17.   

    (to):dgb
      谢谢你的关注!!  线程类中定义声明 m_dc :
      //CDC,CWindowDC,CClientDC
      CClientDC m_dc;//编译有错。。不知怎么定义~~