先直接上效果图:
分别加载显示了 jpg、png、gif动画的第一帧静态显示、gif动画的真实延迟还原显示播放、渐变透明画刷、渐变色画刷
其中较难的是:gif动画的真实延迟还原显示播放,其每帧间隔的延迟如下图:
代码重点
gdi+ 开发包
关键代码
#define ULONG_PTR ULONG
//ULONG_PTR gdiToken; //全局变量,或类成员变量
#include <windows.h>
#include "Includes\\GdiPlus.h"
using namespace Gdiplus;
#pragma comment(lib, "Lib\\GdiPlus.lib")
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiToken, &gdiplusStartupInput, NULL);
// ====== 双缓冲核心代码 ======
// 1. 创建内存DC
CDC memDC;
memDC.CreateCompatibleDC(&dc);
// 2. 创建和窗口客户区一样大的位图
CRect rect;
GetClientRect(&rect);
CBitmap memBitmap;
memBitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
// 3. 选入内存DC
CBitmap* pOldBitmap = memDC.SelectObject(&memBitmap);
// 4. 填充背景,防止残影
memDC.FillSolidRect(rect, RGB(255,255,255)); // 白色背景,可按需调整
// 5. 用GDI+在内存DC上绘图
Graphics graphics(memDC.GetSafeHdc());
// jpg
Image image(L"test.jpg");
graphics.DrawImage(&image, 10, 10);
// png
Image image2(L"test.png");
graphics.DrawImage(&image2, 150, 10);
// gif
Image image3(L"test.gif");
graphics.DrawImage(&image3, 10, 150);
if (m_pGifImage)
{
graphics.DrawImage(m_pGifImage, 50, 150);
}
//CGDITESTDoc* pDoc = GetDocument();
//ASSERT_VALID(pDoc);
//Graphics graphics( pDC->m_hDC );
GraphicsPath path; // 构造一个路径
path.AddEllipse(50, 50, 200, 100);
// 使用路径构造一个画刷
PathGradientBrush pthGrBrush(&path);
// 将路径中心颜色设为蓝色
pthGrBrush.SetCenterColor(Color(255, 0, 0, 255));
// 设置路径周围的颜色为蓝芭,但alpha值为0
Color colors[] = {Color(0, 0, 0, 255)};
INT count = 1;
pthGrBrush.SetSurroundColors(colors, &count);
graphics.FillRectangle(&pthGrBrush, 50, 50, 200, 100);
LinearGradientBrush linGrBrush(
Point(300, 50),
Point(500, 150),
Color(255, 255, 0, 0), // 红色
Color(255, 0, 0, 255)); // 蓝色
graphics.FillRectangle(&linGrBrush, 300, 50, 200, 100);
// 6. 最后一次性将内存DC的内容拷贝到屏幕DC,防止闪烁
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
// 7. 清理
memDC.SelectObject(pOldBitmap);
GdiplusShutdown(gdiToken);
完整代码
https://download.csdn.net/download/maoyeahcom/90949082