古老而永恒的问题--画面重绘

daidai 2000-07-03 07:07:00
我在一个对话框里画图,作了个定时器(50ms),画了很多东西,
在ontimer里invalidate,但效果很不好(抖动)。请问是不是
要先做一个图片,再拷贝上去(对话框的贴图和一般的view有
区别吗?),会好一些。
...全文
235 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
daidai 2000-07-04
  • 打赏
  • 举报
回复
我这样写,为什么对话框上什么也看不到?output[20]是我想输出的结果

void CDisplayDlg::OnPaint()
{
CPaintDC dc(this);
CRect rect;
int x,y;
GetClientRect(&rect);
CDC memDC;
memDC.CreateCompatibleDC(&dc);

for(int i=1;i<19;i++)
{
x=i*13+10;
memDC.MoveTo(x,rect.bottom);
y=output[i]/(30);
memDC.LineTo(x,y); }
dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),
&memDC,0,0,SRCCOPY );
memDC.DeleteDC() ;
}
Erlin 2000-07-04
  • 打赏
  • 举报
回复
CDC memDC;
memDC.CreateCompatibleDC(&dc);
然后直接以memDC设备描述表句柄画图,最后用BitBlt()将此内存设备描述表的内容拷贝到dc上。即
dc.Bitblt(0,0,cx,cy,
&memDC,0, 0,cx,cy,SRCCOPY)
然后删除memDC
memDC.DeleteDC()
daidai 2000-07-04
  • 打赏
  • 举报
回复
能给我个例子吗?
谢谢
zzzling@263.net
Erlin 2000-07-04
  • 打赏
  • 举报
回复
wgtech说的很对
Erlin 2000-07-04
  • 打赏
  • 举报
回复
有几点需发说明
创建memDC时可在OnInitDialog()中进行,在OnDestory()中删除。
创建bmpBitmap时可在OnInitDialog()中进行,在OnDestory()删除。

在OnTimer()中调用
InvalidateRect()时,第二个参数用FALSE,这样可以避免重画背景,我在这里试过了,效果很好.

在对话框类声明中定义:
protected:
CDC memDC;
CBitmap bmpMap;

在OnInitDialog()有如下初始化函数
BOOL CTest1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();

CDC *pDC;
pDC = GetDC();
CRect rect;

GetClientRect(rect);

bmpMap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject( bmpMap);
…………………………
}

OnPaint()中

CPaintDC dc(this); // device context for painting
CRect rect;

GetClientRect(&rect);

memDC.FillSolidRect(rect,RGB(0,0,0));
for(int i =0; i< 300;i++){
memDC.Rectangle(10+5*i+j,10,100,200);
memDC.MoveTo(10,20);
memDC.LineTo(100+10*i,200);
}

dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Heigh(),
&memDC,0,0,SRCPAINT );

OnTimer()中
{
// TODO: Add your message handler code here and/or call default

CRect rect;
GetClientRect(rect);
InvalidateRect(rect,FALSE);
CDialog::OnTimer(nIDEvent);
}

效果好得很
void CTest1Dlg::OnDestroy()
{
CDialog::OnDestroy();

bmpMap.DeleteObject();
memDC.DeleteDC() ;

}





daidai 2000-07-04
  • 打赏
  • 举报
回复
呵呵,不好意思。刚才说错了,那个是因为invalidate(FLASE)的FALSE没写。
我又试了一下,现在是半秒钟变一次,可能是我的数据处理时间太长了,不过
确实达不到画线的时候显示的速度,哎,头疼。先把分给你把
Erlin 2000-07-04
  • 打赏
  • 举报
回复
你给出源代码我看一下嘛
daidai 2000-07-04
  • 打赏
  • 举报
回复
这效果还没原来的好,原来的至少可以看出来线条的变化,这个方法只见
画面黑白来回颠倒的跳动,什么也看不到.
应该是有更好的方法把
wgtech 2000-07-04
  • 打赏
  • 举报
回复
在内存中创建非可视的HDC,向此HDC绘制图形然后BITBLT到目标处可完全消除闪烁。(这办法我用过,挺好的,价格便宜,量也足,我们一直用它...:-)
Erlin 2000-07-04
  • 打赏
  • 举报
回复
不好意思,中间掉了一个步骤

CDC memDC;
CBitmap bmpBitmap;

memDC.CreateCompatibleDC(&dc);
//创建一个设备兼容位图
bmpBitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height());
memDC.SelectObject(bmpBitmap);
bmpBitmap.DeleteObject();
memDC.FillSolidRect(rect,RGB(0,0,0));
//然后直接以memDC设备描述表句柄画图,最后用BitBlt()将此内存设备描述表的内容拷贝到dc上。即
dc.Bitblt(0,0,rect.Width(),rect.Height(),
&memDC,0, 0,SRCPAINT)
//然后删除memDC
memDC.DeleteDC()
WHQ 2000-07-03
  • 打赏
  • 举报
回复
没有什么区别,应该这样做以减少闪烁

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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