CStatic 的 OnPaint 中画图,使用“双缓冲”后图形闪烁依然问题。在线等。。。。。。。。。。。。。

xjb2001 2008-11-11 07:46:30
生成的图片,每次窗口刷新的时候,都会闪烁。我使用了“双缓冲” 还是闪烁,我不知道代码哪里错了,等待指教

Image *m_pImage = Image::FromFile(_T("D:\\DSC01972.JPG"),FALSE);

void Mypic::OnPaint()
{

CPaintDC dc(this);
if (imgok)
{
CRect rcClient;
GetClientRect(&rcClient);

Bitmap memoryBitmap(rcClient.Width(), rcClient.Height());

Graphics *memoryGraphics = Graphics::FromImage(&memoryBitmap); //内存中的图像

memoryGraphics->DrawImage(m_pImage, rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height());

delete memoryGraphics;

Graphics graphics(dc);
graphics.DrawImage(&memoryBitmap, rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height());

}
}
...全文
369 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-11-11
  • 打赏
  • 举报
回复
“每次窗口刷新的时候”具体是哪些情况?给窗口加上WS_CLIPCHILDREN风格试试。
ilovedrv 2008-11-11
  • 打赏
  • 举报
回复
试试直接填充空白区域,就是说根据图像显示的位置,计算出四个方向的空白区域,然后填充为某种颜色即可
xjb2001 2008-11-11
  • 打赏
  • 举报
回复
直接绘制,当然也是闪烁啊

不然我怎么会去折腾双缓冲

我觉得好像是我的 OnEraseBkgnd 问题(我假设我的图片在固定位置 (0,0,500,500))

BOOL CmyscrollView::OnEraseBkgnd(CDC* pDC)
{
// get client rectangle
CRect rcClient;
GetClientRect(&rcClient);

// get image rectangle
CRect rcImage(0,0,500,500);
//GetImageRect(rcImage);

// create clipping region
CRgn clipRgn;
clipRgn.CreateRectRgnIndirect(&rcClient);
pDC->SelectClipRgn(&clipRgn);
pDC->ExcludeClipRect(&rcImage);

CBrush brush(RGB(255,255,255)); // 白色
pDC->FillRect(&rcClient, &brush);

pDC->SelectClipRgn(NULL);

return TRUE;
// return CScrollView::OnEraseBkgnd(pDC);
}

有问题吗?
ilovedrv 2008-11-11
  • 打赏
  • 举报
回复
在 VIEW 的 ONDRAW 里面用下面的代码绘的图,是不会闪烁的,如果用上面的 Graphics 的绘图方法,VIEW 就会有闪烁 ?

直接绘制呢? 跟cimage 的一样
ddszhan 2008-11-11
  • 打赏
  • 举报
回复
SCROLLVIEW,滚动条的消息会接收两遍吧,第一遍是实际的操作,第二遍是通知操作完成(不应该被处理)。
xjb2001 2008-11-11
  • 打赏
  • 举报
回复
在 VIEW 的 ONDRAW 里面用下面的代码绘的图,是不会闪烁的,如果用上面的 Graphics 的绘图方法,VIEW 就会有闪烁

cimage m_MainBGFile;

m_MainBGFile.StretchBlt(pDC->m_hDC,CRect(&m_RectMainBG),SRCCOPY);


可是 CIMAGE 这个东西,好像无法画真彩的位图,画出来的东西,明显失真。
ilovedrv 2008-11-11
  • 打赏
  • 举报
回复
你试试这个类,CZoomView,基本可用
http://www.codeproject.com/KB/docview/McCZoomView.aspx
xjb2001 2008-11-11
  • 打赏
  • 举报
回复
这个 图片,是放在 SCROLLVIEW 里面的,不是放在 DIALOG 里面

我实过,在 DIALOG 里面,不会闪烁

请问这是为什么
xjb2001 2008-11-11
  • 打赏
  • 举报
回复
BOOL Mypic::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}

重载了,不行的,还是闪烁
hucailai 2008-11-11
  • 打赏
  • 举报
回复
OnEraseBkgnd里
直接return

19,468

社区成员

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

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