我正在尝试定期写一份我的应用程序窗口的样子。如果窗口是标准化的,也就是在桌面上,事情就能正常工作。但是如果窗口被最小化,我只能得到最小化的命令栏。
我尝试过在WM_PRINT和PrintWindow中使用SendMessage的各种方法,但都没有成功。在下面使用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,但是我只得到了客户区,而忽略了命令栏和边框。
我不想规格化窗口,因为那会惹恼用户。
发布于 2012-02-25 06:04:01
这很难,因为当你的窗口被最小化时,它看起来并不像它未最小化的自己。
通过调用通常的WM_NCPAINT处理程序,WM_PRINT打印窗口的非工作区(因为您正在传递标志)。该处理程序会查看窗口状态,因此如果窗口状态被最小化,您将无法获得想要的结果。然后它尝试打印客户区,但是(我怀疑)这里的最小化状态也会导致跳过这一部分--一个有效的最小化窗口没有客户区。
调用内部绘制例程可能是最简单的解决方案。是的,它只会给你提供客户区。请注意,当您将鼠标悬停在最小化窗口的磁贴上时,您在Windows 7任务栏上看到的预览也不包括非工作区。我觉得这太难了。
发布于 2012-02-25 23:39:53
在您的WM_PAINT处理程序中,假设您正在使用双缓冲,将backbuffer hdc设置为全局的,然后当您想要为您的程序拍摄快照时,只需将该HDC比特到一个屏幕外的位图,就可以了。
下面是您的WM_PAINT处理程序应该是什么样子:http://pastebin.com/aNvtHiD6
发布于 2012-03-08 10:16:43
这样,就有可能构建这样的位图。我认为,为了获得标题栏和边框,用户必须在每次绘制操作后浏览整个窗口的位图。然后可以擦除工作区。这将提供一个可以进行各种GDI操作的起点。一个额外的复杂性是,任何控件,如滚动条、日期控件、编辑框等都必须单独捕获并添加到位图中。对于我的应用程序,我决定不处理最小化的情况。我很难把控件放到新的位图上。控件的问题出现是因为人们不能简单地使它们成为主窗口的孩子,因为你所拥有的只是一个位图,窗口本身被最小化,或者控件被遮挡或从屏幕上消失。
https://stackoverflow.com/questions/9437729
复制相似问题