微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获得最小化窗口的位图看起来像是规范化的

我正在尝试编写一个我的应用程序窗口周期性的副本。 事情工作正常,如果窗口正常化,即在桌面上。 但是,如果窗口最小化,我只得到最小化的命令栏。

我已经尝试了各种方法使用SendMessage与WM_PRINT和Printwindow没有成功。 在以下使用SendMessage的代码中,我知道使用规范化窗口的正确大小来创build位图。 我知道通过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,Height,scrdc,SRCcopY); // Printwindow (hWnd,memdc,0); BitBlt ( memdc,GetDeviceCaps(memdc,HORZRES),VERTRES),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,lParam); case WM_PAINT: Screen.WMPaint (hWnd); break;

我也知道Screen.WMPrint在HDC中涂写适当的东西。

Windows进程放弃父项。 如何抓住他们?

在Windows上,如何打开一个已经打开的文件来写入另一个进程?

如何得到导致结构exception的模块名称_EXCEPTION_POINTERS结构? (win32 C ++)

芹菜任务总是等待

SPI_GETMOUSEHOVERTIME是否可以为零?

所以,如果任何人都可以给我一些提示或build议的方法,我将不胜感激。 我可以使用Screen.WMPaint,但后来我只得到客户端区域,错过命令栏和边框。

我不想规范窗口,因为这会惹恼用户

如何让shell_exec在IIS 6.0上运行

谷歌浏览器 – 这是一个错误? JavaScript的问题? 触摸屏input不工作

如何使C ++在closures控制台时执行一个函数

Red5无法启动分配

用C ++完成文件

这很难,因为当你的窗户最小化时,它看起来并不像它最小化的自我。

WM_PRINT通过调用通常的WM_NCPAINT处理程序来打印窗口的非客户区域(因为您正在传递该标志)。 那个处理程序看着窗口状态,所以如果它被最小化,你将不会得到你想要的。 然后它会尝试打印客户区,但是(我怀疑)这个最小化状态也会导致这个部分被跳过 – 一个最小化的窗口有效的没有客户区域。

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

在你的WM_PAINT处理程序中,假设你正在使用双缓冲,使你的backbuffer hdc成为全局的,然后当你想为你的程序创建一个快照时,只需将HDC bitblt转换成离屏位图,然后就可以了。

这是你的WM_PAINT处理程序的样子: http : //pastebin.com/aNvtHiD6

这可能只是构建这样一个位图。 我想在每次绘制操作之后,为了获得标题栏和边框,必须在整个窗口的位图上显示出来。 然后可以删除客户区域。 这将给出一个可以做各种GDI操作的起点。 另外一个复杂的情况是,任何控件(如滚动条,日期控件,编辑框等)都必须单独捕获并添加到位图中。 对于我的申请,我决定不处理最小化的情况。 我有足够的麻烦让控制到新的位图。 控件出现问题是因为不能简单地使它们成为主窗口的子项,因为所有的都是位图,窗口本身被最小化,或者控件被遮挡或不在屏幕上。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐