分享

请问printwindow这个api函数的原理是什么

 quasiceo 2015-08-06
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

完了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多