gpt4 book ai didi

c++ - 获取标准化后最小化窗口的外观位图

转载 作者:可可西里 更新时间:2023-11-01 10:49:42 28 4
gpt4 key购买 nike

我正在尝试定期复制我的应用程序窗口的外观。如果窗口被归一化,一切正常,即在桌面上。但是如果窗口被最小化,我只会得到最小化的命令栏。

我尝试了多种方法,将 SendMessage 与 WM_PRINT 和 PrintWindow 结合使用,但均未成功。在以下使用 SendMessage 的代码中,我知道规范化窗口的适当大小用于创建位图。我知道通过 DefWindowProc 对 WM_PRINT 的默认处理生成了 WM_PRINTCLIENT 消息。 hWnd 是最小化窗口的句柄。

        HDC                 scrdc, memdc;
HBITMAP membit;
WINDOWPLACEMENT WP;
EncoderParameters encoderParameters;
ULONG quality;
Status status;
RECT Rect;

WP.length = sizeof (WP);
WP.flags = 0;
WP.showCmd = 0;

GetWindowPlacement (hWnd, &WP);
int WPHeight = WP.rcNormalPosition.bottom - WP.rcNormalPosition.top;
int WPWidth = WP.rcNormalPosition.right - WP.rcNormalPosition.left;

scrdc = GetWindowDC (hWnd); // source DC
GetWindowRect(hWnd,&Rect); // source Rectangle
int Height = Rect.bottom-Rect.top; // source height
int Width = Rect.right-Rect.left; // source width

if (WP.showCmd == SW_SHOWMINIMIZED)
{
Height = WPHeight;
Width = WPWidth;
}

memdc = CreateCompatibleDC(scrdc); // destination DC
membit = CreateCompatibleBitmap(scrdc, Width, Height); // destination bitmap
HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit); // add bitmap to DC

// copy screen to new BitMap

// BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);

// PrintWindow (hWnd, memdc, 0);

BitBlt
(
memdc,
0,
0,
GetDeviceCaps(memdc,HORZRES),
GetDeviceCaps(memdc,VERTRES),
NULL,
NULL,
NULL,
WHITENESS
);

SendMessage (hWnd, WM_PRINT, unsigned int (memdc), PRF_CLIENT|PRF_NONCLIENT);

这里是 WM_PRINT、WM_PRINTCLIENT 和 WM_PAINT 处理程序的代码

    case WM_PRINT:
return DefWindowProc (hWnd, message, wParam, lParam);

case WM_PRINTCLIENT:
Screen.WMPrint (hWnd, HDC (wParam), NULL);
return true;
return DefWindowProc (hWnd, message, wParam, lParam);

case WM_PAINT:
Screen.WMPaint (hWnd);
break;

我也知道 Screen.WMPrint 在 HDC 中涂写了正确的内容。

因此,如果有人能给我一些提示或建议一种方法,我将不胜感激。我可以使用 Screen.WMPaint,但我只得到了客户区而错过了命令栏和边框。

我不想标准化窗口,因为那样会惹恼用户。

最佳答案

这很难,因为当您的窗口最小化时,它看起来并不像未最小化时那样。

WM_PRINT 通过调用通常的 WM_NCPAINT 处理程序打印窗口的非客户区(因为您传递了标志)。该处理程序会查看窗口状态,因此如果它被最小化,您将无法获得想要的内容。然后它尝试打印客户区,但(我怀疑)这里最小化状态也导致这部分被跳过——最小化窗口有效没有客户区。

调用内部绘制程序可能是最简单的解决方案。是的,它只会给你客户区。请注意,当您将鼠标悬停在最小化窗口的图 block 上时,您在 Windows 7 任务栏上看到的预览也排除了非客户区。我觉得太难了。

关于c++ - 获取标准化后最小化窗口的外观位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9437729/

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