cmemdc代码(CMemDC)
admin 发布:2022-12-19 19:49 136
今天给各位分享cmemdc代码的知识,其中也会对CMemDC进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
VC双缓存问题
使用以下的双缓冲类封装类CMenDC 来简单地实现 双缓冲绘图。
具体到你这里,只需这样。
void ***::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
CClientDC clientdc(this);
CMenDC dc(clientdc);
//之后就可以用dc绘图了。
DrawZDM(dc);//绘图函数
}
/****************************************************************************
以下代码复制后保存为一个头文件即可。
****************************************************************************/
#ifndef _MEMDC_H_
#define _MEMDC_H_
//////////////////////////////////////////////////
// CMemDC - memory DC
//
// Author: Keith Rule
// Email: keithr@europa.com
// Copyright 1996-2002, Keith Rule
//
// You may freely use or modify this code provided this
// Copyright is included in all derived versions.
//
// History - 10/3/97 Fixed scrolling bug.
// Added print support. - KR
//
// 11/3/99 Fixed most common complaint. Added
// background color fill. - KR
//
// 11/3/99 Added support for mapping modes other than
// MM_TEXT as suggested by Lee Sang Hun. - KR
//
// 02/11/02 Added support for CScrollView as supplied
// by Gary Kirkham. - KR
//
// This class implements a memory Device Context which allows
// flicker free drawing.
class CMemDC : public CDC
{
private:
CBitmap m_bitmap; // Offscreen bitmap
CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
CDC* m_pDC; // Saves CDC passed in constructor
CRect m_rect; // Rectangle of drawing area.
BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
public:
CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
{
ASSERT(pDC != NULL);
// Some initialization
m_pDC = pDC;
m_oldBitmap = NULL;
m_bMemDC = !pDC- IsPrinting();
// Get the rectangle to draw
if (pRect == NULL) {
pDC- GetClipBox(m_rect);
}
else {
m_rect = *pRect;
}
if (m_bMemDC) {
// Create a Memory DC
CreateCompatibleDC(pDC);
pDC- LPtoDP(m_rect);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_oldBitmap = SelectObject(m_bitmap);
SetMapMode(pDC- GetMapMode());
SetWindowExt(pDC- GetWindowExt());
SetViewportExt(pDC- GetViewportExt());
pDC- DPtoLP(m_rect);
SetWindowOrg(m_rect.left, m_rect.top);
}
else {
// Make a copy of the relevent parts of the current
// DC for printing
m_bPrinting = pDC- m_bPrinting;
m_hDC = pDC- m_hDC;
m_hAttribDC = pDC- m_hAttribDC;
}
// Fill background
FillSolidRect(m_rect, pDC- GetBkColor());
}
~CMemDC()
{
if (m_bMemDC) {
// Copy the offscreen bitmap onto the screen.
m_pDC- BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
this, m_rect.left, m_rect.top, SRCCOPY);
//Swap back the original bitmap.
SelectObject(m_oldBitmap);
}
else {
// All we need to do is replace the DC with an illegal
// value, this keeps us from accidentally deleting the
// handles associated with the CDC that was passed to
// the constructor.
m_hDC = m_hAttribDC = NULL;
}
}
// Allow usage as a pointer
CMemDC* operator- ()
{
return this;
}
// Allow usage as a pointer
operator CMemDC*()
{
return this;
}
};
#endif
VC窗口重绘闪烁的问题!
响应 WM_ERASEBKGWND 消息,返回TRUE
如果WM_PAINT的操作中大量使用了重复填充,就定义一个内存DC,响应WM_PAINT的时候 bitblt 将内存DC数据拷贝到 窗口DC
VS2010自带的CMemDC怎么用?
CMemDC其实就是对内存DC的创建与删除进行一个包装。
1、在CMemDC的构造函数中创建内存DC;
2、用户可以在CMemDC dc中进行图像的绘制;
3、在CMemDC的析构函数中进行内存DC到目标DC的拷贝,并做相应的GDI对象清理工作。
使用这样的类可以让你的代码有很大程度的简洁。
举个例子:
如果我们不使用CMemDC,一般我们会写下面的一段的代码,
C...View::OnDraw(CDC* pDC)
{
CRect rcClient;
GetClientRect(rcClient);
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap bmpMem;
bmpMem.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height());
CBitmap *pBmpOld = dcMem.SelectObject(bmpMem);
//下面进行图像的绘制
dcMem.DrawText(...);
dcMem.FillSolidRect(...);
pDC-BitBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),
dcMem,0,0,SRCCOPY);
//GDI对象的清理
dcMem.SelectObject(pBmpOld);
bmpMem.DeleteObject();
dcMem.DeleteDC();
}
如果我们使用了CMemDC,那么代码就可以这样写,简洁了很多,更便于维护而且不容易出错。
C...View::OnDraw(CDC* pDC)
{
CMemDC dcMem(pDC);
//下面进行图像的绘制
dcMem.DrawText(...);
dcMem.FillSolidRect(...);
}
cmemdc代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于CMemDC、cmemdc代码的信息别忘了在本站进行查找喔。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
- 上一篇:flash全景图源代码(flash背景图)
- 下一篇:波浪js代码(js双波浪线)
相关推荐
- 04-29连连看c代码(连连看的代码)[20240429更新]
- 04-29网页图片闪烁js代码(css实现图片闪烁动画)[20240429更新]
- 04-29数据结构代码(数据结构代码题怎么写)[20240429更新]
- 04-29vb程序设计代码(vb程序设计代码题怎么做)[20240429更新]
- 04-29vc代码库(vc函数库)[20240429更新]
- 04-29右侧悬浮购物车代码(加入购物车的代码)[20240429更新]
- 04-29列表图片左右滚动代码(html图片左右滚动代码)[20240429更新]
- 04-29下拉式菜单代码(下拉式菜单由什么组成)[20240429更新]
- 04-29java购物系统代码(java在线购物系统)[20240429更新]
- 04-28clearfix代码(clearX)[20240428更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接