当前位置:首页 > 代码 > 正文

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站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/21444.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载