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: