MFC 使用Gdiplus保存子控件的窗口图像到本地

实现函数如下, 测试有效

#include <afxwin.h>
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;

// 获取 JPEG 编码器的 CLSID
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) {
	UINT num = 0;          // number of image encoders
	UINT size = 0;         // size of the image encoder array in bytes

	Gdiplus::GetImageEncodersSize(&num, &size);
	if (size == 0)
		return -1;  // Failure

	Gdiplus::ImageCodecInfo* pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
	if (pImageCodecInfo == NULL)
		return -1;  // Failure

	Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);

	for (UINT j = 0; j < num; ++j) {
		if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0) {
			*pClsid = pImageCodecInfo[j].Clsid;
			free(pImageCodecInfo);
			return j;  // Success
		}
	}

	free(pImageCodecInfo);
	return -1;  // Failure
}


void SaveControlAsJPEG2(HWND hWnd, const CString& filename) {
	// 获取控件的客户区大小
	CRect rect;
	::GetClientRect(hWnd, &rect);
	int width = rect.Width();
	int height = rect.Height();

	// 创建一个兼容的内存DC
	CDC memDC;
	memDC.CreateCompatibleDC(NULL);
	// 设置内存DC的背景色为白色
	// memDC.FillSolidRect(0, 0, width, height, RGB(255, 255, 255));

	// 创建一个内存位图
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(&memDC, width, height);
	memDC.SelectObject(&bmp);

	// 在内存DC中绘制控件内容
	::SendMessage(hWnd, WM_PRINTCLIENT, (WPARAM)memDC.GetSafeHdc(), PRF_CLIENT);

	// 初始化 GDI+
	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

	// 创建 GDI+ Bitmap 对象
	Gdiplus::Bitmap bitmap(bmp, NULL);
	// Gdiplus::Bitmap bitmap(width, height, PixelFormat24bppRGB);
	Gdiplus::Graphics graphics(&bitmap);
	Gdiplus::Rect destRect(0, 0, width, height);
	graphics.DrawImage(&bitmap, destRect, 0, 0, width, height, Gdiplus::UnitPixel);

	// 保存为 JPEG 文件
	CLSID clsid;
	GetEncoderClsid(L"image/jpeg", &clsid);
	bitmap.Save(filename, &clsid, NULL);

	// 清理资源
	// Gdiplus::GdiplusShutdown(gdiplusToken);
}

// 测试
void OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	SaveControlAsJPEG2(GetDlgItem(IDC_BUTTON2)->GetSafeHwnd(), L"D://IDC_BUTTON2.jpg"); // 成功
	SaveControlAsJPEG2(GetDlgItem(IDC_STATIC_TITLE)->GetSafeHwnd(), L"D://IDC_STATIC_TITLE.jpg"); //成功
	
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古木12345

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值