数据更新显示的问题

asdwwe2004 2012-03-19 11:56:25
新建一对话框工程 CMyDlg,成员变量 n,在CMyDlg::OnEraseBkgnd中设置一副背景图片,在OnButton() 变化n的值,在OnPaint()进行显示。预期只会显示最后一个数值,结果显示所有数值都叠加在一起。前一个数值没有被擦除是什么原因?

实际工程是一个串口通讯的软件,希望显示新数据的同时能擦除旧数据,简化问题同上。

void CMyDlg::OnButton()
{
// TODO: Add your control notification handler code here

for(int i=0;i<100;i++)
{
n++;
this->Invalidate(TRUE);
this->UpdateWindow();
}
}
void CMyDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);


}
else
{
CPaintDC dc(this);
CString str;

dc.SetBkMode(TRANSPARENT);

str.Format("%d",n);
dc.TextOut(100,30, str);


CDialog::OnPaint();
}
}

BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default

CPaintDC dc(this);

CRect rect;

GetClientRect(&rect);

CDC dcMem;

dcMem.CreateCompatibleDC(&dc);

CBitmap bmpBackGround;

bmpBackGround.LoadBitmap(IDB_CELL);

BITMAP bitmap;

bmpBackGround.GetBitmap(&bitmap);

this->MoveWindow(200,200,bitmap.bmWidth,bitmap.bmHeight);

CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackGround);

dc.SetStretchBltMode(COLORONCOLOR) ;

dc.StretchBlt

(0,0,bitmap.bmWidth,bitmap.bmHeight,&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);

dc.SetBkMode(TRANSPARENT);


return true;
// return CDialog::OnEraseBkgnd(pDC);
}

...全文
109 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2012-04-23
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
hdg3707 2012-03-19
  • 打赏
  • 举报
回复
你可以在显示新的数据时,先用背景颜色写一串空格擦除旧数据,然后再显示新数据.或者用InvalidateRect这个函数专门重画显示数据那块区域
stjay 2012-03-19
  • 打赏
  • 举报
回复
for(int i=0;i<100;i++)
{
n++;
this->Invalidate(TRUE);
this->UpdateWindow();//这里不进消息队列,直接调用OnPaint(),也就是说OnEraseBkgnd没有被调用
}

界面线程不能这样循环,可以开线程测试

15,979

社区成员

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

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