IPicture如何实现双缓存

strategycn 2007-10-11 11:10:18
我最近正写一个屏保程序,用IPicture技术显示jpg格式的图像,但是在让图片在窗口上移动时闪的很厉害,因为要重绘背景,所以想用网上说了很多的双缓存技术,可是,看了很多,双缓存技术好像只是针对bmp格式的,我现在将jpg图片(通过IPicture的Render函数)画到另外一个临时dc中,然后如何将它拷贝到将要显示的dc中呢(窗口dc或显示屏dc)??!高手们帮帮我吧,这几天头发都想白了....分不多,就这点了....
...全文
187 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
linwc03 2010-12-18
  • 打赏
  • 举报
回复
strategycn:
你好!我用了近一个星期的时间编一个IPicture显示数据库JPG图片,但能显示和正常操作,但移动图像时闪烁得严厉。也用了你所说的的方法,有建兼容DC,兼容位图和选入对象,怎么一移动就没有了图像!下面是我写的源码,望赐教,多谢:
void CShowMax::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
{
CDialog::OnPaint();
}
if (m_IsShow==TRUE)
{


CPaintDC dc(this); //重绘的设备上下文


CBitmap bitmap; //定义一个位图对象
bitmap.CreateCompatibleBitmap(&dc,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN));


CDC dcMem; //定义一个内存DC(显示设备)对象
dcMem.CreateCompatibleDC(&dc);
//因为只有为它选进位图这个gdi对象才可以绘图的,希望不要有人再走我这么多冤枉路了

//bitmap.CreateCompatibleBitmap (&dc,m_width,m_height);
SelectObject(dc,bitmap);
//CBitmap* pOldBitmap = dcMem.SelectObject (&bitmap);
if(dcMem==NULL)MessageBox("没有图像");

//用dcMem画图
int vpos = GetScrollPos(SB_VERT);
int hpos = GetScrollPos(SB_HORZ);
m_picture1->Render(dcMem,1-hpos,1-vpos,(int)(m_width/26.45),(int)(m_height/26.45),0,m_height,m_width,-m_height,NULL);

dc.BitBlt(0,0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN),&dcMem,0,0,SRCCOPY);


// CDC * dc= GetDC();
//int vpos = GetScrollPos(SB_VERT);
//int hpos = GetScrollPos(SB_HORZ);
// m_picture1->Render(*dc,1-hpos,1-vpos,(int)(m_width/26.45),(int)(m_height/26.45),0,m_height,m_width,-m_height,NULL);
//dc.BitBlt(0,0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN),&MemDC,0,0,SRCCOPY);

}
}
另:你能把你苦心所写双缓冲源码发一份给我学习一下吗?谢谢!


stlnkm 2008-12-03
  • 打赏
  • 举报
回复
多谢楼主
strategycn 2007-10-12
  • 打赏
  • 举报
回复
p=new CPicture("map//0.jpg");
...
CPaintDC dc(this);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
p->ShowPicture(MemDC);
dc.BitBlt(0,0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN),&MemDC,0,0,SRCCOPY);
在这里我封装了个CPicture类,里面封装了IPicture读取图片的一些函数,ShowPicture函数里就是包裹了IPicture.Render函数,可以上
代码运行起来,什么图片也看不到,可是直接用p->ShowPicture(dc)是可以显示的,yxz_lp能解释一下吗??
strategycn 2007-10-12
  • 打赏
  • 举报
回复
我试了,好像不行,我再去试一下吧,谢谢你的回答!!
yxz_lp 2007-10-12
  • 打赏
  • 举报
回复
双缓冲技术应该和IPicture或bmp应该没用什么关系,你只要创建一个兼容dc,再把IPicture.Render到兼容dc,最后
再用BitBlt()把兼容dc拷贝到当前dc。
strategycn 2007-10-12
  • 打赏
  • 举报
回复
唉,怎么没人帮我啊??自己顶啊,唉.......
strategycn 2007-10-12
  • 打赏
  • 举报
回复
晕了一下午,终于郁闷出来了,原来是可以实现的,只是我少了一个步骤,汗啊...
只要在p- >ShowPicture(MemDC); 前加上
hbitmap=CreateCompatibleBitmap(dc.m_hDC,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN));
SelectObject(MemDC.m_hDC,hbitmap);
因为只有为它选进位图这个gdi对象才可以绘图的,希望不要有人再走我这么多冤枉路了...
自己拿分了,呵呵.....
strategycn 2007-10-12
  • 打赏
  • 举报
回复
有没有办法在内存中将图片格式转化为bmp呢?那样就可以像直接操作位图一样操作了....实在没办法
,我都想用.net中的CImage类了,不知道在vc6.0种引用它放不方便,谢谢你的关注,我也继续试下...
yxz_lp 2007-10-12
  • 打赏
  • 举报
回复
我也试过了,我这想当然的办法是不行,继续帮你关注。
strategycn 2007-10-11
  • 打赏
  • 举报
回复
要断网了,自己再来顶一下,高手快施救吧。。。。。

19,466

社区成员

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

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