c 语言 截屏程序,C++开发截屏小程序功能

C++开发截屏小程序,Win32程序,可以显示截屏区域并保存。

上次的流星雨屏幕程序就简单涉及到GDI绘图了,这次简单介绍几个API函数,涉及到GDI的。

3ffc9d1db0a9a3dbb14fba5b9fd123a5.png

GetDC,获取当前创建的窗口的设备环境。

CreateDC,获取当前屏幕的设备环境。

CreateCompatibleDC,创建一个兼容性的设备环境(相当于一个虚拟的设备环境)

BitBlt,这个函数,相当于拷贝,将一个环境的设备内容拷贝到另一个设备中。

CreateCompatibleBitmap,创建一块画布,将其放在兼容性的DC里面,这样就可以在里面画图了,当然还要放入画笔和画刷这些。

介绍完这些函数之后,那么设计思路就来了:

1.首先当然还是定义并创建窗口,还有消息循环。

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDC_CAPTURESCREEN));

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(BLACK_BRUSH);

wcex.lpszMenuName = NULL;

wcex.lpszClassName = szWindowClass;

wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);

}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

hInst = hInstance; // 将实例句柄存储在全局变量中

//创建自己的窗口

hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUP,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)

{

return FALSE;

}

//显示和更新窗口

ShowWindow(hWnd, SW_MAXIMIZE);

UpdateWindow(hWnd);

return TRUE;

}

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,

_In_opt_ HINSTANCE hPrevInstance,

_In_ LPTSTR lpCmdLine,

_In_ int nCmdShow)

{

//playsound只能播放wav格式,而mcisendstring可以播放任意格式的。

//PlaySound("yixi.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);

mciSendString("open ./abc.mp3 alias bk",

0, 0, 0);

mciSendString("play bk repeat", 0, 0, 0);

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: 在此放置代码。

MSG msg;

HACCEL hAccelTable;

// 初始化全局字符串

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_CAPTURESCREEN, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance); //注册类

// 执行应用程序初始化:

if (!InitInstance(hInstance, nCmdShow)) //初始化窗口

{

return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CAPTURESCREEN));

// 主消息循环:

while (GetMessage(&msg, NULL, 0, 0))

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return (int)msg.wParam;

}

2.之后获取当前屏幕的设备环境,

3.然后将它保存到兼容性的DC中,这就相当于将当前屏幕图片放到一个缓冲区中。在WM_CREATE消息里面做这个动作。

void ScreenDisplay()

{

HDC disDc = ::CreateDC("DISPLAY", NULL, NULL, NULL);

g_memDC = ::CreateCompatibleDC(disDc);

g_ScreenW = GetDeviceCaps(disDc, HORZRES);

g_ScreenH = GetDeviceCaps(disDc, VERTRES);

HBITMAP hbitmap = CreateCompatibleBitmap(disDc, g_ScreenW, g_ScreenH);

SelectObject(g_memDC, hbitmap);

BitBlt(g_memDC, 0, 0, g_ScreenW, g_ScreenH, disDc, 0, 0, SRCCOPY);

}

4.接着再将它放到我们创建的窗口中,这时就会看到整个桌面就不动了,就呈现的是一张图片,

5.之后我们就可以在这张图片上绘制我们想截取的区域。

6.呈现的是静止的图片,如果绘制之后,需要更新,这就用到一个函数InvalidateRgn,会无效选定的区域,这样会触发消息WM_PAINT,所以在这个消息里面将重新绘制图形,然后显示即可。

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO: 在此添加任意绘图代码...

SelectObject(hdc, hpen);

SelectObject(hdc, hBrush);

BitBlt(hdc, 0, 0, g_ScreenW, g_ScreenH, g_memDC, 0, 0, SRCCOPY);

Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);

EndPaint(hWnd, &ps);

break;

接下来就是绘制想要区域的操作,需要用到的几个鼠标的消息函数,鼠标按下,鼠标弹起,鼠标移动,鼠标双击。

那么思路来了:

鼠标按下,确定左上角的点,然后鼠标移动绘制矩形区域,然后鼠标弹起,确定右下角的点,这样矩形区域绘制完成。

case WM_LBUTTONDOWN:

{

if (!Iselect)

{

POINT pt;

GetCursorPos(&pt);

rect.left = pt.x;

rect.top = pt.y;

rect.right = pt.x;

rect.bottom = pt.x;

InvalidateRgn(hWnd, 0, FALSE);

Isdowmn = TRUE;

}

}

break;

case WM_LBUTTONUP:

{

if (Isdowmn == TRUE&&!Iselect)

{

POINT pt;

GetCursorPos(&pt);

rect.right = pt.x;

rect.bottom = pt.y;

InvalidateRgn(hWnd, 0, FALSE);

Isdowmn = FALSE;

Iselect = TRUE;

}

}

break;

case WM_MOUSEMOVE:

{

if (Isdowmn == TRUE&&!Iselect)

{

POINT pt;

GetCursorPos(&pt);

rect.right = pt.x;

rect.bottom = pt.y;

InvalidateRgn(hWnd, 0, FALSE);

}

}

break;

最后鼠标双击将截取到的图片保存剪切板,这样就完成了屏幕截取。

case WM_LBUTTONDBLCLK:

if (Iselect == TRUE)

{

int iNum = MessageBox(hWnd, "截图成功!", "张一西", MB_OKCANCEL | MB_ICONINFORMATION);

if (iNum == 1)

{

CopyToCliboard();

Iselect = FALSE;

PostQuitMessage(0);

}

else

{

Iselect = FALSE;

}

}

break;

void CopyToCliboard()

{

HDC hScreenDC = ::CreateDC("DISPLAY", 0, 0, 0);

HDC memDC = ::CreateCompatibleDC(hScreenDC);

int Width = rect.right - rect.left-2;

int Height = rect.bottom - rect.top-2;

HBITMAP hBmap = CreateCompatibleBitmap(hScreenDC, Width, Height);

HBITMAP hOldBmap = (HBITMAP)SelectObject(memDC, hBmap);

BitBlt(memDC, 0, 0, Width, Height, hScreenDC, rect.left+1, rect.top+1, SRCCOPY);

HBITMAP hNewBmap = (HBITMAP)SelectObject(memDC, hOldBmap);

if (OpenClipboard(0)) //打开粘贴板

{

EmptyClipboard(); //清空粘贴板

SetClipboardData(CF_BITMAP, hNewBmap); //把图片放入粘贴板

CloseClipboard(); //关闭粘贴板

}

}

代码地址:http://xiazai.jb51.net/202004/yuanma/CaptureScreen_jb51.rar

总结

到此这篇关于C++开发截屏小程序的文章就介绍到这了,更多相关C++开发截屏小程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在计算机编程领域,C语言是一个重要的编程语言,它具有高效、直接和强大的控制能力、速度快等优点,极大地方便了程序员解决一系列的问题。 C语言最早在1972年被Dennis Ritchie发明,它被设计成能够直接控制硬件,让程序员可以调用操作系统功能、访问硬件设备等,这就是C语言的强大之处,正因为如此,它在操作系统、嵌入式、游戏开发等领域得到了广泛的应用。那么,如何使用C语言呢? 我们可以通过学习C语言的基本语法,包括变量、数据类型、运算符、控制语句、循环等,理解程序的基本结构和组成部分。在编写代码时,需要考虑到程序的逻辑性、实用性和可读性,这有助于提高程序的质量和代码效率。除此之外,还需要了解C标准库中提供的函数和数据结构,例如字符串处理函数、数学函数、文件操作函数等,熟练掌握这些可以使你的代码更加简洁、高效。 在编程前,我们需要利用编辑器或集成开发环境(IDE)来编写和调试代码。常用的C语言IDE有Visual Studio、Dev-C++、Code::Blocks等,这些软件可以提供代码高亮、自动补全和调试等功能,有助于提高编码效率和代码稳定性。 最后,建议多研究C语言的相关文献和教程,尤其是经典著作《The C Programming Language》(《C程序设计语言》),了解C语言的发展历程和重要特性。实践是最好的学习方式,多写一些小程序和项目,这有助于增强你的编程能力和理解C语言的使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值