重分求SDI画图问题--关于数据显示

weasea 2008-07-21 05:18:31
在view里面,我在OnInitialUpdate 启动读数线程。用来读串口来的数据。并显示在EDIT里
当整个程序起来后,串口来的数据依然正常(调试看出),但EDIT已经不刷新了。
百分求解决之道。。。
...全文
52 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
NIKE霸天虎 2008-07-21
  • 打赏
  • 举报
回复
简单问题复杂化,你用FromView不就行了,直接拉个Edit控件出来不就行了,还用你徒手画吗,徒手画你也要数据来了更新,你把画图放你自己函数里他咋知道啥时候重画呢
cnzdgs 2008-07-21
  • 打赏
  • 举报
回复
我的意思是线程中用SetWindowText来设置Edit的内容,这样Edit就会自动刷新,如果要防止刷新时闪烁,可以在WM_PAINT消息中用双缓冲的方式来处理。
weasea 2008-07-21
  • 打赏
  • 举报
回复
to cnzdgs
您的意思是把
MemDC.SelectObject (&font);
MemDC.SetTextColor (RGB(0,0,255));
MemDC.TextOut (0 ,0,str,str.GetLength());

pDCLeft->BitBlt(rect.left ,rect.top,rect.right -rect.left ,rect.bottom -rect.top,&MemDC,0,0,SRCCOPY);

提到OnDraw里吗???
deryker 2008-07-21
  • 打赏
  • 举报
回复
你没有更新Edit窗口的举措啊
cnzdgs 2008-07-21
  • 打赏
  • 举报
回复
你应该在线程中修改Edit的内容,让主线程自己刷新。
weasea 2008-07-21
  • 打赏
  • 举报
回复
我的意思是。。。
因为在OnInitialUpdate里已经创建CDC去画图了
当SDI窗口起来后,软件自己的CDC又把它抹掉了。

通俗的讲应该是这样。
weasea 2008-07-21
  • 打赏
  • 举报
回复
算了
还有很多画图的地方的
一画图,我就要去Ondraw里折腾
还是改称对话框程序吧!
deryker 2008-07-21
  • 打赏
  • 举报
回复
说清楚一点哈,你的发消息更新吧
weasea 2008-07-21
  • 打赏
  • 举报
回复
MemDC.TextOut (0 ,0,str,str.GetLength());
这句有用的。。。也就是说从串口来的值是有变化的。
但Edit窗口已经不刷新了
weasea 2008-07-21
  • 打赏
  • 举报
回复
bool CGroupControlView::ReadDataFromInstrumentLeft()
{
DWORD dwStatus;
CString str;
char buf1[10];

m_BreakLeft=0;
str.Format ("COM%d",pPressDefineLeft->iCom);
bool bRet=Open(str,CSerial::EBaudrate(pPressDefineLeft->iComSpeed),CSerial::EData8,CSerial::EParNone,CSerial::EStop1);

if(bRet==0)
{
m_ConnectInstrumentLeft =1;
}
else
{
m_ConnectInstrumentLeft =0;
m_EdtReadingLeft.SetRectangleText("打开串口失败");
m_EdtReadingLeft.SetBkGleam(TRUE);
return 0;
}

CFont font;
LOGFONT lf;
lf.lfHeight = 24;
lf.lfWidth = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = FW_NORMAL;
lf.lfItalic = FALSE;
lf.lfUnderline = FALSE;
lf.lfStrikeOut = FALSE;
lf.lfCharSet = GB2312_CHARSET;
strcpy(lf.lfFaceName,"宋体\x0");
font.CreateFontIndirect(&lf);

CRect rect;
GetDlgItem(IDC_EDT_READING_LEFT)->GetWindowRect(&rect);
ScreenToClient(&rect);

memset(buf1,0,sizeof(buf1));
while(1){
if(m_BreakLeft)
break;
dwStatus = ::WaitForSingleObject(m_hevtStopLeft, 150);
if (dwStatus == WAIT_OBJECT_0 && m_SerialDLC.m_dwReturnError == ERROR_SUCCESS)
{
m_EdtReadingLeft.SetBkGleam(false);
theApp.m_Connect8142Left=true;
m_NewDataLeft=true;

memcpy(buf1,m_DataInstrument+4,6);
if(m_DataInstrument[2] & 0x02)
m_DataInstrument1 =-atoi(buf1);
else
m_DataInstrument1 =atoi(buf1);
str.Format ("%6d",m_DataInstrument1);


CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象

MemDC.CreateCompatibleDC(NULL);

MemBitmap.CreateCompatibleBitmap(pDCLeft,rect.right -rect.left ,rect.bottom -rect.top );
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

MemDC.FillSolidRect(0,0,rect.right -rect.left ,rect.bottom -rect.top,RGB(255,255,255));

MemDC.SelectObject (&font);
MemDC.SetTextColor (RGB(0,0,255));
MemDC.TextOut (0 ,0,str,str.GetLength());

pDCLeft->BitBlt(rect.left ,rect.top,rect.right -rect.left ,rect.bottom -rect.top,&MemDC,0,0,SRCCOPY);

MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
else
{
m_EdtReadingLeft.SetRectangleText("未连接仪表");
m_EdtReadingLeft.SetBkGleam(TRUE);
theApp.m_Connect8142Left=false;
}
}
m_EdtReadingLeft.SetBkGleam(false);
return false;
}
zhoujianhei 2008-07-21
  • 打赏
  • 举报
回复
edit是有长度限制的,如果超过最大字符数,edit就不会更新了。
1. 增加edit字符数上限。
2. 动态删除最早的数据。
cnzdgs 2008-07-21
  • 打赏
  • 举报
回复
没看明白。不刷新是什么意思?如果不创建线程正常吗?线程是如何把数据添加到Edit里面的?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧