vc绘图双缓冲问题

shegu 2008-07-15 11:15:26
请教高手,我想在对话框的pictrue控件上绘图,能在Onpaint()函数中实现双缓冲吗?,如果能,请给出代码,谢谢
...全文
241 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tinary3v0 2008-07-28
  • 打赏
  • 举报
回复
谢谢楼上两位的提醒,我也学习一下 呵呵 我现在一般都是在其他地方用内存DC的 两位说的情况我还没有涉及到
我再查查
haven_t 2008-07-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Tinary3v0 的回复:]
如果你在Onpaint()函数里面用内存DC那跟不用是一样的。
使用内存DC要在其他的地方用,比如鼠标落下 抬起 移动或其他事件引发界面改动的时候。
你用的Onpaint()函数里面和不用效果是一样的,反倒是增加程序负担了,跟直接调用Invalidate有什么区别啊?
[/Quote]

在某些情况下是有区别的,试想一下如powerpoint的情况下,用户区有多个部分重叠的物件(如图片或文本框),在重绘一个物件时必然要重绘与之相交并在其之上的物件,这个物件也会引起其他相关物件的重绘,这样会引起一系列的链式间接重绘。这种情况下使用内存dc就只需要重绘触发物件及与之直接相关的物件,不需要理会间接的物件,然后使用bitblt复制过去就行了。
sp0000sp 2008-07-25
  • 打赏
  • 举报
回复
用上面的应该可以实现 有问题再说
sp0000sp 2008-07-25
  • 打赏
  • 举报
回复
CPaintDC dc(this); // device context for painting
SwapBuffers(dc.m_ps.hdc);
Tinary3v0 2008-07-25
  • 打赏
  • 举报
回复
如果你在Onpaint()函数里面用内存DC那跟不用是一样的。
使用内存DC要在其他的地方用,比如鼠标落下 抬起 移动或其他事件引发界面改动的时候。
你用的Onpaint()函数里面和不用效果是一样的,反倒是增加程序负担了,跟直接调用Invalidate有什么区别啊?

rocker9527 2008-07-16
  • 打赏
  • 举报
回复
vc6

CDC memDC;
memDC.CreateCompatibleDC(pDC);//pDC为实际的DC.
CRect rcClient;
GetClientRect(rcClient);
CBitmap bm;
bm.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height());
CBitmap *oldBitmap = memDC.SelectObject(&bm);
......//添加自已绘画内容
pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(oldBitmap);

sunyim 2008-07-16
  • 打赏
  • 举报
回复
先在内存中画,然后显示
yjplus 2008-07-16
  • 打赏
  • 举报
回复
创建内存DC即可
pollychang 2008-07-15
  • 打赏
  • 举报
回复


CGraphics m_graph;

m_graph.BeginDraw(dc.m_hDC);

m_graph.Axes();
m_graph.Grid();
m_graph.Title(m_sTitle);
m_graph.DrawCenterAxes();

int size = m_data.size();

for (int i=0; i<size; i++)
{
m_graph.DrawVector2(m_data[i].x, m_data[i].y, m_iMarkerMode, m_iMarkerSize, m_crMarker);
}

}

m_graph.EndDraw(dc.m_hDC);





// 开始图形绘制
void CGraphics::BeginDraw(HDC hDC)
{
if (m_bPrinting || !m_bMemoryDraw)
{
m_hDC = hDC;
DrawBkGround();
}
else
{
::GetClipBox(hDC, &m_ClipBox);

m_hDC = ::CreateCompatibleDC(hDC);
m_Bitmap = ::CreateCompatibleBitmap(hDC, m_ClipBox.right - m_ClipBox.left,
m_ClipBox.bottom - m_ClipBox.top);
m_OldBitmap = (HBITMAP)::SelectObject(m_hDC, m_Bitmap);
::SetWindowOrgEx(m_hDC, m_ClipBox.left, m_ClipBox.top, NULL);

// 绘制无效区的背景色 CBL2008-06-05
HBRUSH hBrush = ::CreateSolidBrush(m_nBackColor);
HBRUSH hBrold = (HBRUSH)::SelectObject(m_hDC, hBrush);

::FillRect(m_hDC,&m_ClipBox,hBrush);

::SelectObject(m_hDC, hBrold);
::DeleteObject(hBrush);

}
}

// 结束图形绘制
void CGraphics::EndDraw(HDC hDC)
{
if (m_bPrinting || !m_bMemoryDraw)
{
m_bPrinting = false;
return;
}

::BitBlt(hDC, m_ClipBox.left, m_ClipBox.top, m_ClipBox.right - m_ClipBox.left,
m_ClipBox.bottom - m_ClipBox.top, m_hDC, m_ClipBox.left, m_ClipBox.top, SRCCOPY);

::SelectObject(m_hDC, m_OldBitmap);
::DeleteDC(m_hDC);

m_hDC = NULL;
}

19,469

社区成员

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

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