PrintWindow和WM_PRINT不同,WM_PRINT是合作式的,需要目标窗口的窗口过程实现对WM_PRINTCLIENT的响应 PrintWindow却不需要,只需要对方能响应WM_PAINT,它的大致过程如下 PrintWindow(NtUserPrintWindow)->xxxPrintWindow->(SetRedirectedWindow->CreateRedirectionBitmap)->xxxUpdateWindow->_GetDCEx->NtGdiBitBlt xxxPrintWindow首先调用SetRedirectedWindow创建一个重定向位图(CreateRedirectionBitmap),将该窗口的绘制重定向到这个位图并做初始化、格式转换工作,而不是通常情况下的主帧缓冲(如果是开了桌面组合则是dwm里面的离屏表面) 接下来调用xxxUpdateWindow,向目标发送WM_PAINT,此时窗口过程像窗口dc绘制将被重定位到重定向位图,因此dc不会由于被遮挡而被剪裁,不再依赖窗口的位置,内容可以全部保留在重定向位图 最后调用_GetDCEx->NtGdiBitBlt将目标窗口的dc的内容bitblt到你提供的dc 完了 |
|