首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

怎么完成vista 下面的实时缩略图功能。 请大家畅所欲言

2012-12-15 
如何完成vista 上面的实时缩略图功能。 请大家畅所欲言DWM 在其公共 API 中有主要功能区:呈现缩略图 这个功

如何完成vista 上面的实时缩略图功能。 请大家畅所欲言
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.html
 缩略图

  缩略图是打开的应用程序上由 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.html

缩略图

我要提到的最后一个DMW属性就是自行处理缩略图的能力。你可能已经注意到了Windows Vista任务栏上漂亮的缩略图功能。只要将鼠标悬停于任务栏中某个程序项上,就会弹出一个小小的缩略图,让用户无须切换至该窗口即可了解其中的内容。

你知道么?这个缩略图能够保持时时更新。要是不明白我再说什么,可以试试看下述操作:

右键单击任务栏上的时间/日期,选择“调整日期/时间”命令。这时一个包含着钟表的窗口将弹出来。 
将鼠标悬停于该窗口的任务栏项上,等待缩略图出现。 
仔细看,你会发现这个钟表的秒针不停地移动,保持与主窗口同步。DWM也提供了这个功能,方便我们在程序和缩略图之间保持同步!

缩略图工作的原理就是,在DWM中作为桌面合成的一部分“注册”一对源/目的窗体,然后DWM即可自动更新目的窗体并实时反映出源窗体的变化。考虑到如此简单的代码,这真是个令人惊讶的功能。因为注册缩略图需要保留一个句柄,以便随后传递给DWM以更新缩略图属性,并最终取消注册该缩略图,所以用C++封装一下或许会更简单一些:



class Thumbnail
{
public:
    explicit Thumbnail(HTHUMBNAIL handle = 0) :
        m_handle(handle)
    {
        // Do nothing
    }
    ~Thumbnail()
    {
        if (0 != m_handle)
        {
            COM_VERIFY(Unregister());
        }
    }
    bool IsRegistered() const
    {
        return 0 != m_handle;
    }
    HRESULT Register(HWND destination,
                     HWND source)
    {
        ASSERT(0 == m_handle);
        CSize reserved(0, 0);
        return ::DwmRegisterThumbnail(destination,
                                      source,
                                      &reserved,
                                      &m_handle);
    }
    HRESULT Unregister()
    {
        ASSERT(0 != m_handle);
        HRESULT result = ::DwmUnregisterThumbnail(m_handle);
        m_handle = 0;
        return result;
    }
    HRESULT QuerySourceSize(CSize& size)
    {
        ASSERT(0 != m_handle);
        return ::DwmQueryThumbnailSourceSize(m_handle,
                                             &size);
    }
    HRESULT UpdateProperties(const DWM_THUMBNAIL_PROPERTIES& properties)
    {
        ASSERT(0 != m_handle);
        return ::DwmUpdateThumbnailProperties(m_handle,
                                              &properties);
    }


private:
    HTHUMBNAIL m_handle;
};


注册/取消注册缩略图很简单。QuerySourceSize 允许我们检测源窗体的大小,进而控制缩略图的属性。我们还要至少调用一次UpdateProperties 方法,通知DWM开始实时更新缩略图。DWM_THUMBNAIL_PROPERTIES结构提供了一些控制缩略图行为的属性。

struct DWM_THUMBNAIL_PROPERTIES
{
    DWORD dwFlags;
    RECT rcDestination;
    RECT rcSource;
    BYTE opacity;
    BOOL fVisible;
    BOOL fSourceClientAreaOnly;
};

dwFlags 给出了接下来的那个字段是有效的。 
rcDestination 字段表示目的窗体用来显示缩略图的客户区域的边界范围。若想使用该字段,请在dwFlags 中包含DWM_TNP_RECTDESTINATION标记。 
rcSource 字段表示窗体客户区域的边界,该范围的内容将显示到缩略图中。若想使用该字段,请在dwFlags 中包含DWM_TNP_RECTSOURCE标记。 
opacity 字段表示缩略图的不透明度。若源窗体是半透明的,那么缩略图也将是半透明的,提供这个选项仅仅为了需要时得更全面控制而已。若想使用该字段,请在dwFlags 中包含DWM_TNP_OPACITY标记。 
fVisible 允许我们暂时打开/关闭缩略图功能,而无须注册/取消注册。若想使用该字段,请在dwFlags 中包含DWM_TNP_VISIBLE标记。 
fSourceClientAreaOnly 用来让缩略图只显示源窗口的客户区域,而并不包含其边框内容。若想使用该字段,请在dwFlags 中包含DWM_TNP_SOURCECLIENTAREAONLY标记。 
下载代码中通过一个可以缩放的缩略图窗口演示了实时缩略图的相关功能。


[解决办法]
谢谢 
biwenlun
这是很好的思路。把函数都写出来了。多谢
[解决办法]
其实我对你的帖子一直很感兴趣,每次都很有意思,我也是知道什么就说什么,大家一起讨论互相前进
[解决办法]
不过不明白你在二楼发的东西。。。
第一:是 C#
第二:这些都是在系统中含有DWM的情况下的,开关而已。你现在想要白手起家,不是吗?
[解决办法]
对,是想用C++实现。不用C# 也不用其DWM api函数 

[解决办法]
请问您实现了吗 我最近也在做这个功能,如果是用截取窗体工作区域的图片的话我可以实现,但是一个是动态的窗体 一个是静态的图片 没有实时的交互

热点排行