DeleteDC ReleaseDC DeleteObject之间的区别

本文详细介绍了Windows绘图API中的DeleteDC、ReleaseDC和DeleteObject三个函数。DeleteDC用于删除指定的设备上下文环境(DC),而ReleaseDC则用于释放DC供其他应用程序使用。DeleteObject函数则用于删除逻辑笔、画笔等对象并释放相关系统资源。

DeleteDC

该函数删除指定的设备上下文环境(DC)。

原型:

BOOL DeleteDC(HDChdc);

参数:

hdc:设备上下文环境的句柄。

返回值:

成功,返回非零值;失败,返回零。调用GetLastError获取扩展错误信息。

说明:

如果一个设备上下文环境的句柄是通过调用GetDC函数得到的,那么应用程序不能删除该设备上下文环境,它应该调用ReleaseDC函数来释放该设备上下文环境。

ReleaseDC

函数释放设备上下文环境(DC)供其他应用程序使用。函数的效果与设备上下文环境类型有关。

原型:

int ReleaseDC(HWNDhWnd, HDChdc);

参数:

hWnd:指向要释放的设备上下文环境所在的窗口的句柄。

hDC:指向要释放的设备上下文环境的句柄。

返回值:

返回值说明了设备上下文环境是否释放;如果释放成功,则返回值为1;如果没有释放成功,则返回值为0。

说明:

每次调用GetWindowDCGetDC函数检索公用设备上下文环境之后,应用程序必须调用ReleaseDC函数来释放设备上下文环境。

应用程序不能调用ReleaseDC函数来释放由CreateDC、CreateCopatibleDC函数创建的设备上下文环境,只能使用DeleteDC函数。

DeleteObject

该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了。

原型:

BOOL DeleteObject(HGDIOBJ hObject);

参数:

hObject:逻辑笔、画笔、字体、位图、区域或者调色板的句柄。

返回值

成功,返回非零值;如果指定的句柄无效或者它已被选入设备上下文环境,则返回值为零。调用GetLastError获取扩展错误信息。

说明:

当一个绘画对象(如笔或画笔)当前被选入一个设备上下文环境时不要删除该对象。当一个调色板画笔被删除时,与该画笔相关的位图并不被删除,该图必须单独地删除。

#include <windows.h>#include <iostream>#include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") // 屏幕捕获函数bool CaptureScreen(const std::wstring& filePath){ // 初始化GDI+ Gdiplus::GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; if (Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL) != Gdiplus::Ok) { std::cerr << "GDI+ initialization failed!" << std::endl; return false; } // 获取屏幕的设备上下文(DC) HDC hdcScreen = GetDC(NULL); // 获取整个屏幕的DC if (hdcScreen == NULL) { std::cerr << "Failed to get screen DC!" << std::endl; Gdiplus::GdiplusShutdown(gdiplusToken); return false; } // 创建内存设备上下文(DC) HDC hdcMemory = CreateCompatibleDC(hdcScreen); if (hdcMemory == NULL) { std::cerr << "Failed to create memory DC!" << std::endl; ReleaseDC(NULL, hdcScreen); Gdiplus::GdiplusShutdown(gdiplusToken); return false; } // 获取屏幕宽高 int screenWidth = GetSystemMetrics(SM_CXSCREEN); int screenHeight = GetSystemMetrics(SM_CYSCREEN); // 创建与屏幕尺寸兼容的位图 HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, screenWidth, screenHeight); if (hBitmap == NULL) { std::cerr << "Failed to create bitmap!" << std::endl; DeleteDC(hdcMemory); ReleaseDC(NULL, hdcScreen); Gdiplus::GdiplusShutdown(gdiplusToken); return false; } // 将屏幕内容复制到内存中的位图 SelectObject(hdcMemory, hBitmap); if (!BitBlt(hdcMemory, 0, 0, screenWidth, screenHeight, hdcScreen, 0, 0, SRCCOPY)) { std::cerr << "Failed to capture screen!" << std::endl; DeleteObject(hBitmap); DeleteDC(hdcMemory); ReleaseDC(NULL, hdcScreen); Gdiplus::GdiplusShutdown(gdiplusToken); return false; } // 保存捕获的位图为文件 Gdiplus::Bitmap bitmap(hBitmap, NULL); Gdiplus::Status status = bitmap.Save(filePath.c_str(), &Gdiplus::ImageFormatBMP); if (status != Gdiplus::Ok) { std::cerr << "Failed to save image!" << std::endl; DeleteObject(hBitmap); DeleteDC(hdcMemory); ReleaseDC(NULL, hdcScreen); Gdiplus::GdiplusShutdown(gdiplusToken); return false; } // 清理资源 DeleteObject(hBitmap); DeleteDC(hdcMemory); ReleaseDC(NULL, hdcScreen); Gdiplus::GdiplusShutdown(gdiplusToken); std::cout << "Screen capture saved to " << filePath << std::endl; return true;} int main(){ std::wstring filePath = L"screen_capture.bmp"; if (CaptureScreen(filePath)) { std::cout << "Capture successful!" << std::endl; } else { std::cerr << "Capture failed!" << std::endl; } return 0;}AI写代码cpp运行
最新发布
08-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值