【发布时间】:2012-03-15 07:33:46
【问题描述】:
我正在尝试定期编写我的应用程序窗口外观的副本。如果窗口被规范化,事情就会正常工作,即在桌面上。但是如果窗口被最小化,我只会得到最小化的命令栏。
我尝试了各种方法,将 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 但我只得到客户区并错过了命令栏和边框。
我不想规范化窗口,因为这会惹恼用户。
【问题讨论】:
-
会隐藏窗口,恢复它,使用
PrintWindow,最小化它,最后显示它工作吗?您可能也可以对任务栏中的活动做一些事情。