gpt4 book ai didi

c++ - WinAPI CreateWindow 函数创建小于设置的窗口

转载 作者:搜寻专家 更新时间:2023-10-30 23:54:55 24 4
gpt4 key购买 nike

我的任务是重新创建具有类似于 Windows 截图工具功能的应用程序。其中之一是捕获当前事件窗口的屏幕截图,这就是导致我出现问题的原因。一切都几乎完美无缺,但是应用程序的“截图”比实际应用程序大几个像素,这是因为它的窗口比我设置的要小一些。

这是我测试主窗口的 CreateWindow 调用:

hwnd = CreateWindow(TEXT("Klasa okien"), TEXT("Screenshot"), WS_OVERLAPPEDWINDOW, 
10, 10, 350, 400, NULL, NULL, hInstance, NULL);

然后收集有关该窗口大小的信息并继续执行“截图”功能的过程:

RECT okno;
HWND aktywne = GetForegroundWindow();
GetWindowRect(aktywne, &okno);
CaptureScreen(okno.left, okno.top, okno.right-okno.left, okno.bottom-okno.top);

最后是获取这些片段的函数的一部分:

void CaptureScreen(int x, int y, int width, int height)
{
HDC hDc = CreateCompatibleDC(0);
HBITMAP hBmp = CreateCompatibleBitmap(GetDC(0), width, height);
SelectObject(hDc, hBmp);
BitBlt(hDc, 0, 0, width, height, GetDC(0), x, y, SRCCOPY);
Bitmap *p_bmp = Bitmap::FromHBITMAP(hBmp, NULL);
...

正如我所说 - 一切几乎都很好,正在创建的图片实际上是 350x400 但实际窗口的大小似乎是 336x393。我还附上了两张图片 - 完美剪裁的一张是 Windows 工具创建的,另一张是我的。

Result of my tool 350x400Result of Windows' snipping tool 336x393

最佳答案

此问题是 Windows 10 特有的,它与 Windows 10 透明边框有关。例如,如果窗口具有调整大小的边框,则左/右/底部的边框约为 7 像素。

如果您正在截屏,那么您可能希望排除透明边框。将 GetWindowRect 替换为:

DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &rc, sizeof(RECT)); 
//requires at least Windows Vista

GetWindowRect相比,从DwmGetWindowAttribute获取的矩形在左、右、下各小了约7个像素。

#include "Dwmapi.h"
#pragma comment( lib, "Dwmapi.lib" )
...

RECT rc;
DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &rc, sizeof(RECT));
int w = rc.right - rc.left;
int h = rc.bottom - rc.top;

HDC memdc = CreateCompatibleDC(hdc);
HBITMAP bmp = CreateCompatibleBitmap(hdc, w, h);
SelectObject(memdc, bmp);
BitBlt(memdc, 0, 0, w, h, hdc, rc.left, rc.top, CAPTUREBLT | SRCCOPY);
...

其次,不要使用GetDC(0)(以那种方式),因为它会导致资源泄漏。您必须保存从 GetDC 获得的句柄,稍后再释放它。例如:

HWND desktopWnd = GetDesktopWindow();
HDC hdc = GetDC(desktopWnd);
...
ReleaseDC(desktopWnd, hdc);

编辑:
或使用

HDC hdc = GetDC(0);
...
ReleaseDC(0, hdc);

关于c++ - WinAPI CreateWindow 函数创建小于设置的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34583160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com