我现在要做一个可以根据实时数据作实时曲线的程序,在程序中定义了一个全局线程函数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; //线程必须有一返回值
}
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; //线程必须有一返回值
}
解决方案 »
- 以十六进制CString型存入tet文件里没有换行,而已字节型存入txt文件却有换行
- IO完成端口中,传输数据数量为0问题?
- 纯c++ 编写win32程序,怎样处理字符串最方便?
- 在OnCreate函数之外创建工具栏
- 为什么没人理我?还是搞不定listctrl
- 如何把FILETIME类型的变量格式化成字符串输出,如“1956-12-01 11:22:33”
- 一个VC群,希望大家多多支持,谢谢
- 求guniffer的源码:http://www.patching.net/shotgun/GUNiffer.zip下不来,我出现乱码
- ◆◇◆-怎样让窗口显示在最前-◆◇◆
- 使用GDI+保存图片为GIF效果很差??缺了抖动算法???
- MFC的缺陷?
- 绘图时字体很小时为什么字看起来那么模糊,应该怎么办呢
MemDC.CreateCompatibleDC(NULL); ==>>MemDC.CreateCompatibleDC(pDC);
你要使用哪个窗口的区域和DC你要明确
最好不要在线程中操控MFC对象 线程只负责接受数据 在视图类中定时获取数据显示即可