打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C 实现窗口截图

文章目录

  • 前言
  • 一、类库介绍
  • 二、使用方法
  • 三、代码讲解

教程推荐:

人工智能教程,点击这里查看,通俗易懂,风趣幽默

C/C++教程,点击这里查看,以项目为主导从入门到精通

前言

学习C++最大的乐趣就是其无所不能,今天带来C++实现窗口截屏的方法,可保存为jpg,png,bmp等多种常见图片格式!

很简陋,但很简单,主要是学习一下该库的使用,适合新手!

一、类库介绍

既然是使用别人发明的图片格式,自然是使用对应的类库对图片进行操作

本文用到的类库为C++模板库<atlimage.h>,只要安装了VS(visual studio),并安装了C++开发工具包,都有这个库

二、使用方法

该库里存在一个图像类CImage

只要将一个窗口的设备上下文(Device context,简称DC)复制到该类,就能将该窗口的图像保存为图片,使用起来特别简单

主要用到的类和函数:

GetDeviceCaps(m_hDc, BITSPIXEL); //获取窗口DC像素的大小

GetDeviceCaps(m_hDc, HORZRES);  //获取窗口DC宽度

GetDeviceCaps(m_hDc, VERTRES);  //获取窗口DC高度

GetDpiForWindow(m_hWnd); //获取窗口单位英寸像素个数,一般电脑像素过大,windows为正常显示图标,会放大该数值,所以需要依靠该数值调整DC大小,否则截图会出现大小不适配的问题

CImage image;//用于图片操作的类

image.Create(m_width, m_hight, m_bitOfPix);//为该类创建与原窗口一样大小的DC

BitBlt(m_hImgDc, 0, 0, m_width, m_hight, m_hDc, 0, 0, SRCCOPY); //将窗口DC图像复制到image

 m_image.Save(name, Gdiplus::ImageFormatBMP); //将图像数据保存为对应文件

三、代码讲解

#include<string>
#include<atlimage.h>
using namespace std;
//name:保存的文件名
//hWnd:要截图的窗口句柄,NULL表示对桌面截图
bool SavePic(wstring name,HWND hWnd) {
	HDC hDc=NULL;
	hWnd = (hWnd == NULL) ? GetDesktopWindow() : hWnd; //判断窗口句柄是否为NULL,如果为NULL则默认获取桌面DC
	hDc = GetDC(hWnd); //获取DC
	if (hDc == NULL) return false;
	int bitOfPix = GetDeviceCaps(hDc, BITSPIXEL); //获取DC像素的大小
	int width = GetDeviceCaps(hDc, HORZRES);  //获取DC宽度
	int hight = GetDeviceCaps(hDc, VERTRES);  //获取DC高度
	UINT dpi = GetDpiForWindow(hWnd); //获取dpi
	float fold; //根据dpi计算放大倍数
	switch (dpi) { 
	case 96:
		fold = 1;
		break;
	case 120:
		fold = 1.25;
		break;
	case 144:
		fold = 1.5;
		break;
	case 192:
		fold = 2;
		break;
	case 216:
		fold = 2.25;
		break;
	default:
		fold = 1;
		break;
	}
	width *= fold; //复原宽度
	hight *= fold; //复原高度
	CImage image;
	image.Create(width, hight, bitOfPix); //为图像类创建与窗口DC相同大小的DC
	BitBlt(image.GetDC(), 0, 0, width, hight, hDc, 0, 0, SRCCOPY); //将窗口DC图像复制到image
	image.Save(name.data(), Gdiplus::ImageFormatPNG); //保存为png格式图片文件
	image.ReleaseDC(); //释放DC
	ReleaseDC(hWnd, hDc); //释放DC资源
}
int main() {
	SavePic(L'1.png',NULL);//对桌面截图,保存为1.png文件
}

支持保存的图片格式参数有:

Gdiplus::ImageFormatUndefined
Gdiplus::ImageFormatMemoryBMP 
Gdiplus::ImageFormatBMP
Gdiplus::ImageFormatEMF 
Gdiplus::ImageFormatWMF 
Gdiplus::ImageFormatJPEG 
Gdiplus::ImageFormatPNG 
Gdiplus::ImageFormatGIF 
Gdiplus::ImageFormatTIFF 
Gdiplus::ImageFormatEXIF 
Gdiplus::ImageFormatIcon 
Gdiplus::ImageFormatHEIF
Gdiplus::ImageFormatWEBP

可根据参数后缀确定保存文件类型

运行后,可在当前程序目录查看图片

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
在非托管C++中使用GDI+
hWnd,hDC,CDC有什么区别
day08
VFP 直接打印表单的程序
VB入门技巧N例(8)
用Windows API实现一个简单的文本输入框
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服