我现在要做一个可以根据实时数据作实时曲线的程序,在程序中定义了一个全局线程函数UINT  DataLineThread(LPVOID lp),本来要完成获得数据并将其转换为窗口曲线中坐标。但是由于直接显示在屏幕上的,所以出现了闪烁的问题。于是我定义了MemDC,可是出现了问题。不知怎么办,请高人看下怎么解决啊!代码如下:
UINT  DataLineThread(LPVOID lp)
{
CWnd *pMainWnd=AfxGetMainWnd(); 
CWnd *pWnd=pMainWnd->GetWindow(GW_CHILD);
CDC *pDC=pWnd->GetDC();
CDC MemDC;
CRect rect;
         GetClientRect(&rect);        问题在这里
         int nWidth = rect.Width();
         int nHeight = rect.Height();
MemDC.CreateCompatibleDC(NULL);       //建立与屏幕显示兼容的内存显示设备 
MemDC.SetStretchBltMode(HALFTONE);
CBitmap MemBitmap;                   //定义一个位图对象 
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);  //下面建立一个与屏幕显示兼容的位图
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);  //将位图选入到内存显示设备中 
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(0,0,0));   //先用背景色将位图清除干净 CPen  *pPenYellow=new CPen;   
CPen  *pPenGreen=new CPen;
CBrush  *pBrushBlack=new CBrush;
pPenYellow->CreatePen(PS_SOLID,1,RGB(255,255,0));
pPenGreen->CreatePen(PS_SOLID,1,RGB(0,255,0));
         pBrushBlack->CreateSolidBrush(RGB(0,0,0));
        ..........
        ........
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);  //将内存中的图拷贝到屏幕上进行显示 
MemBitmap.DeleteObject(); 
MemDC.DeleteDC(); 
//检查是否有结束事件发来
int retCode=::WaitForSingleObject(EndPaintLine.m_hObject,0);
if(retCode==WAIT_OBJECT_0)
runThread=FALSE;               //如有结束事件发来,则修改runThread退出循环
::Sleep(TimeSpan_GetData);     //采集绘制实时数据曲线的时间间隔
return 0;        //线程必须有一返回值
}

解决方案 »

  1.   

    调用全局的GetClientRect应该有参数一是窗口句柄
      

  2.   

    pWnd->GetClientRect(&rect); 问题在这里
    MemDC.CreateCompatibleDC(NULL); ==>>MemDC.CreateCompatibleDC(pDC);
    你要使用哪个窗口的区域和DC你要明确
      

  3.   

    不要在线程中绘制图形,那个是UI线程做的事情,线程发送消息到UI线程
      

  4.   


    最好不要在线程中操控MFC对象   线程只负责接受数据 在视图类中定时获取数据显示即可
      

  5.   

    线程用法不对,线程应该给窗口发message让两者不存在调用关系,这样一来,绘图是在窗口,如何绘,何时绘,由线程通过message指挥窗口,你所做的线程与一个一般函数没有两样.
      

  6.   

    没错,worker thread通知下绘图窗口就好了。