MFC贴图双缓冲技术

MFC贴图双缓冲技术及内存加载类封装

 MFC图像贴图双缓冲解决闪烁自定义图像内存加载类的封装:
支持从内部资源/外部文件加载,支持bmp/jpg/gif/png图像文件;
支持创建空白位图(黑色,指定宽高);
文件显示透明/收缩透明位图;
支持根据背景颜色生成RGN裁剪区。
使用时,将此头文件在"stdafx.h"中添加 #include "MemoryDC.h"

// 2019.03.10
// 自定义图像内存加载类的封装:
// 支持从内部资源/外部文件加载,支持bmp/jpg/gif/png图像文件;
// 支持创建空白位图(黑色,指定宽高);
// 文件显示透明/收缩透明位图;
// 支持根据背景颜色生成RGN裁剪区。
// 使用时,将此头文件在"stdafx.h"中添加 #include "MemoryDC.h"

#include "stdafx.h"
//#include <functional>

#pragma once

class CMemoryDC : public CDC
{
public:
	// 构造 与 析构
	CMemoryDC():m_size(0, 0)
	{

	}
	CMemoryDC(UINT nBitmapID, CDC* pDC = nullptr) :m_size(0, 0)
	{
		this->LoadBitmap(nBitmapID, pDC);
	}
	CMemoryDC(LPCTSTR szBitmap, CDC* pDC = nullptr) :m_size(0, 0)
	{
		this->LoadBitmap(szBitmap, pDC);
	}
	CMemoryDC(int cx, int cy, CDC* pDC = nullptr) :m_size(0, 0)
	{
		this->Create(cx, cy, pDC);
	}
	virtual ~CMemoryDC()
	{
		this->DeleteObject();
	}

	//创建一张空白内存画布
	BOOL Create(int cx, int cy, CDC* pDC = nullptr)
	{
		BOOL result;
		CBitmap bitmap;
		if (pDC)
			result = bitmap.CreateCompatibleBitmap(pDC, cx, cy);
		else
			result = bitmap.CreateCompatibleBitmap(&CClientDC(NULL), cx, cy);

		//这种方式语法没错,但为什么不成功哎?
		//auto fcompatile = std::bind(&CBitmap::CreateCompatibleBitmap, bitmap, 
		//	std::placeholders::_1, cx, cy);
		//result = pDC ? fcompatile(pDC) : fcompatile(&CClientDC(NULL));

		m_size.SetSize(cx, cy);
		this->CreateCompatibleDC(pDC);
		this->SelectObject(bitmap);
		return result;
	}
	// 释放
	BOOL DeleteObject()
	{
		if (!GetSafeHdc())
			return FALSE;
		CBitmap* pBitmap = GetCurrentBitmap();
		if (pBitmap)
			pBitmap->DeleteObject();
		return CDC:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值