DWM 在其公共 API 中有主要功能区:
呈现缩略图
这个功能C++如何开发?
是否需要direct10?是否还需要vista系统为平台,我在XP平台下是否可以开发?
是否有代替DWM实时缩略图的通用技术?
多谢!牛人指教。
------解决方案--------------------------------------------------------
我有个简单的思路,取该窗体句柄,然后用GetWindowRect取窗体的范围矩形,再用
CDC *pDCSnaper=CDC::FromHandle(::GetDC(窗体句柄));这样后:
m_bmpSnaper.CreateCompatibleBitmap(pDCSnaper,m_rectSnaper.Width(),m_rectSnaper.Height());
m_sourceDC.CreateCompatibleDC(this->GetDC());
m_sourceDC.SelectObject(&m_bmpSnaper);
m_sourceDC.BitBlt(0,0,m_rectSnaper.Width(),m_rectSnaper.Height(),pDCSnaper,0,0,SRCCOPY);
将图像存入某个地方,再在任务栏显示出来。取任务栏的坐标应该不难,用 ::GetSystemMetrics
个人觉得不太需要Direct10和一些很高深的技术,用API就好
------解决方案--------------------------------------------------------
感觉: DWM也是用系统的API完成这个实时缩略图的。
有点资料大家共享(没太多看懂了)
转载于:
http://tech.ddvip.com/2008-11/122569523088390_16
缩略图
缩略图是打开的应用程序上由 DWM 呈现的实时显示窗口。缩略图由 Flip 和 Alt+Tab 任务切换器使用。实质上,您可以请求应用程序窗口的缩略图,并让其在应用程序中呈现。缩略图 API 将为您提供应用程序窗口的实时表示。
缩略图易于使用,因为 Windows 已为您做好了大部分艰苦工作。困难之处在于获取应用程序的 HWND。在获取所需的 HWND 后,您只需注册一个缩略图,并将该 HWND 与要呈现缩略图的 HWND 和该窗口中的位置相关联。这时操作系统将负责以后的更新。每当源窗口更改时,更改将反映到目标窗口中。
若要使用缩略图,必须首先使用 DwmRegisterThumbnail 函数注册缩略图。您提供了两个窗口句柄:源 HWND(即需要缩略图视图的窗口)和目标 HWND(需要呈现缩略图的窗口)。在使用缩略图结束之后,您需要通过调用 DwmUnregisterThumbnail 让 DWM 知道关系已结束。在创建了缩略图之后,DwmRegisterThumbnail 函数将返回一个缩略图句柄,所有其他缩略图函数将把该句柄作为参数。在注册缩略图之后,您需要调用 DwmUpdateThumbnailProperties 才能更新缩略图。图11 显示了呈现另一窗口实时缩略图的窗体示例代码。
除注册和取消注册缩略图的两个函数外,还有其他两个函数与缩略图一起使用。DwmQueryThumbnailSourceSize 返回指定缩略图的原始大小。DwmUpdateThumbnailProperties 可让您更新给定 DWM 缩略图的属性。它采用 DWM_THUMBNAIL_PROPERTIES 结构,其 C# 实现如图5 所示。
在不想使用整个源窗口时,使用 DWM_THUMBNAIL_PROPERTIES 结构可以指定属性的数量,如目标窗口中的目标矩形(rcDestination 成员)和要使用的源窗口的矩形区域(rcSource 成员)。
如果不想让缩略图完全不透明,还可以使用不透明度成员指定缩略图的不透明度,其中 0 为透明,255 为不透明。如果希望缩略图不可视,可以将 fVisible 标志设置为 false。如果仅希望使用缩略图窗口的客户端区域,而不是整个源窗口(其中包括非客户端区域,如框架和标题栏),则只需将 fSourceClientAreaOnly 布尔值设置为 true。您可以通过 dwFlags 参数告诉界面要设置哪些参数。当设置某个参数时,您需要在 dwFlags 参数中打开相应的位。
最后,在诸如目标窗口大小方面没有限制,通常使用缩略图界面扩大和缩小源窗口。在保持长宽比方面存在限制。始终保持源窗口的长宽比。如果更改了源窗口的大小,缩略图也将更改大小,以保持其本身处于指定的边界内。
在本文随附的源代码中提供了一个按钮,使用该按钮将创建主应用程序窗口的微型实时缩略图,如图12 所示。
您会很容易发现,缩略图的呈现是实时的。如果更改主应用程序窗口,则会看到缩略图更新。您会发现,稍微发挥一下自己的聪明才智,就可以相当容易地使用缩略图以及 FindWindow 和 GetWindow Win32 函数创建自己的任务切换器。
图 12a创建实时缩略图
图 12b
转载于:
http://qzone.qq.com/blog/51506240-1220058914
由于所有组合窗口都通过 DWM 呈现到一个屏外窗口,然后进行组合后再呈现到桌面上,因此获取这些图像并提供应用程序的实时缩略图表示并不困难。DWM 为您提供了四个函数来控制缩略图的呈现方式:
DwmQueryThumbnailSourceSize 返回 DWM 缩略图的原始大小。
DwmRegisterThumbnail 创建目标窗口和源窗口之间的缩略图关系。
DwmUnregisterThumbnail 删除由 DwmRegisterThumbnail 创建的 DWM 缩略图关系。
DwmUpdateThumbnailProperties 更新给定缩略图的属性。
转载于:
http://www.cnblogs.com/dflying/archive/2007/03/20/680921
缩略图
我要提到的最后一个DMW属性就是自行处理缩略图的能力。你可能已经注意到了Windows Vista任务栏上漂亮的缩略图功能。只要将鼠标悬停于任务栏中某个程序项上,就会弹出一个小小的缩略图,让用户无须切换至该窗口即可了解其中的内容。
你知道么?这个缩略图能够保持时时更新。要是不明白我再说什么,可以试试看下述操作:
右键单击任务栏上的时间/日期,选择“调整日期/时间”命令。这时一个包含着钟表的窗口将弹出来。
将鼠标悬停于该窗口的任务栏项上,等待缩略图出现。
仔细看,你会发现这个钟表的秒针不停地移动,保持与主窗口同步。DWM也提供了这个功能,方便我们在程序和缩略图之间保持同步!
缩略图工作的原理就是,在DWM中作为桌面合成的一部分“注册”一对源/目的窗体,然后DWM即可自动更新目的窗体并实时反映出源窗体的变化。考虑到如此简单的代码,这真是个令人惊讶的功能。因为注册缩略图需要保留一个句柄,以便随后传递给DWM以更新缩略图属性,并最终取消注册该缩略图,所以用C++封装一下或许会更简单一些: