zoukankan      html  css  js  c++  java
  • 把你的框架窗口一个影子

    介绍 在即将到来的Windows Vista,每个框架窗口默认有一个很酷的影子。微软最近发布了新的Windows Live Messenger,有一个选项使框架窗口阴影。这强烈表明,有一些方法可以使阴影应用windows操作系统windows Vista。在本文中,我们试图完成这个在某种程度上类似于WLM做什么。 背景 当我想出了这样一个问题,我做的第一件事就是搜索网页,看看别人已经做到了。不幸的是,几乎所有的我发现在CodeProject上——其中一些是——如何让子窗口跟踪等控制。主要的思想是在父窗口画出阴影。然而,关键是,如果你想做一个最高的窗口一个影子,影子区域,应不属于您的应用程序。借鉴其他应用程序的窗口可能会打乱他们的屏幕显示。更糟糕的是,如果这些窗口更改或移动呢? 然后我发现了这篇文章用中文写的,提出一个非常好的方法来解决这个问题。作者创造了三个小框架窗口的子窗口:在右边,底端,和右下角,画出阴影。阴影绘制阿尔法混合在底层的形象窗口。框架窗口移动或调整时,孩子的影子windows移动或调整和重新粉刷。 然而,这种解决方案有两个主要的缺点: 如果你点击的影子,而不是底层的窗口,但影子窗口会得到关注。通常认为这些地区实际上属于底层的窗口,是与一个影子阴影。影子会错当底层窗口移动或改变。作者建立了一个计时器,使影子定期与底层的最新形象窗口重画,这使得它更好看,但问题还没有得到解决。 然后,幸运的是,我发现分层windows支持windows 2000可以解决上述问题。分层窗口可以“透明”鼠标操作,可以自动阿尔法混合的实际图像底层窗口。它比上面提到的方法更简单,因为你不需要担心如何绘制阿尔法混合。你只需要设置颜色,pre-multiplied,当然,每个像素的alpha值。 与启示,我观察WLM窗口使用间谍+ +。我发现这是WML的方法使用windows阴影。有一个分层窗口,每个跟踪窗口的类名SysShadow WML。SysShadow实际上是Windows系统,以确定所提供的跟踪,如菜单。很容易利用你的框架窗口SysShadow影子窗口通过添加CS_DROPSHADOW类风格的窗口类。然而,这种解决方案有两个缺点: 影子不可控的外观或者至少我没有找到一些方法来这样做。阴影是由系统的选择。试图取消“显示阴影下菜单”选项在系统属性的“视觉效果”;然后WML的影子消失了! 因此,我决定写我自己的代码。 使用的代码 很容易利用你的框架窗口阴影使用我的代码。CWndShadow既可以用在MFC / ATL和non-MFC / ATL应用程序。 WndShadow.h和WndShadow.cpp添加到您的项目。CWndShadow任何地方使用,添加: 隐藏,复制代码# include“WndShadow.h” 叫CWndShadow::初始化()之前创建一个影子。这个函数需要应用程序的实例句柄作为参数。这是作为一个参数传递给应用程序的. WinMain()。如果使用MFC,这可以通过调用句柄()。这里是MFC的例子: 隐藏,复制CodeBOOL CYourApp: InitInstance () { / / CWndShadow:初始化()可能也叫其他地方,而已 / /之前调用CWndShadow::创建()。 / /这里只是一个例子 CWndShadow:初始化(句柄()); / /其他代码… } 声明CWndShadow每个框架窗口的一个实例,你想有一个影子: 隐藏,复制CodeCWndShadow WndShadow; 记住,这个对象不应被破坏在框架窗口被销毁。例如,您可以让它全球或,如果使用MFC, MFC类的一个成员,窗口就行了。 调用CWndShadow对象的创建()与处理框架窗口,以创建一个影子。如果使用MFC,记住创建()必须在框架窗口已经创建。在OnCreate()例如,定期在OnInitDialog窗口或对话框()。MFC代码看起来像这样: 隐藏,复制Codeint CMainFrame:: OnCreate (LPCREATESTRUCT LPCREATESTRUCT) { / /其他代码CMainFrame:: OnCreate () / /假设CWndShadow CMainFrame: m_Shadow; m_Shadow.Create (GetSafeHwnd ()); 返回0; } 现在你的框架窗口应该有阴影。享受。 Vista航空意识 在Windows Vista,框架窗口时,已经有一个阴影航空启用,或者更准确地说,当启用桌面组合。负责桌面组成几个Vista的视觉效果。这包括,但不限于:玻璃窗框,半透明或不透明的极光和阴影。当已经有一个影子,我的影子预计将被隐藏。所以,我让影子航空意识到的帮助下DwmIsCompositionEnabled () API和WM_DWMCOMPOSITIONCHANGED窗口消息。当Vista航空启用,将自动禁用我的代码的影子。 先进控制的影子 一些参数可以设置为控制阴影的外观。这是一个完整列表。我必须强调,这些参数的范围没有严格测试。影子可能不起作用了,如果他们没有设置“常规”值。 bool CWndShadow::改变颜色(也就是说NewColor);设置阴影的颜色。bool CWndShadow: SetSize (int NewSize);设置阴影窗口的相对大小。大小是相对于父窗口,而不是绝对值。的大小值被添加在每个父窗口的四条边。也就是说,如果父窗口的大小是100 * 100,SetSize()值2,影子将104 * 104大小的窗口。该参数可以设置为负。bool CWndShadow: SetSharpness (unsigned int NewSharpness);,锐度值,控件的宽度梯度半透明的周边地区的边境的影子。如果设置为0,那么影子最锋利的边界。bool CWndShadow: SetHardness (unsigned int NewHardness);集的黑暗阴影。这个值越大,越黑暗的阴影。bool CWndShadow: SetPosition (int, int NewXOffset NewYOffset);设置阴影窗口的相对位置。起源是父窗口的中心和阴影的中心窗口。如果设置了XOffset积极,那么影子将向右转动。如果YOffset是积极的,那么影子会蹲下。 的兴趣点 我的代码在Visual c++ 2005最初编写。当我试图测试它在Visual c++ 6.0中,我遇到了几个问题。他们中的大多数是旧版本的,因为平台的SDK附带VC + + 6,和一些,因为它与c++标准不兼容。最新版本的SDK我从微软下载不支持VC + + 6,我决定修改原始代码,使它在机器工作。这两个要点如下: UpdateLayeredWindow () Windows API和一些相关的常量定义在旧的SDK。在这里,我用了一种类似于描述的一个快速和肮脏的窗口透明度。我宣布阴影参数变量INT8 UINT8,相同的字符和无符号字符,但看起来更像整数值。不幸的是,他们也不是旧的SDK中定义。所以最后,我不得不宣布他们为char和无符号字符,这可能看起来有迷惑性。 我的代码还包括一些Vista-specific api和窗口消息使我的代码航空意识。这个不幸的是需要Vista SDK编译安装。更糟糕的是,如果这些api是硬编码在代码中,应用程序将在Windows Vista版本之前崩溃。我还使用这招类似于上述第一点Vista这些东西集成到我的代码。 未来的工作 似乎很难模拟窗口使用当前CWndShadow影子在Windows Vista。主要有两个原因: Windows Vista——以及WLM使用非线性梯度函数在边界的影子。Windows Vista使用一个不同的模型生成的影子,而我的是类似于WLM。和Vista模型生成的阴影似乎要比父窗口大小。 我正考虑增加支持non-gradient边界函数和两个两个影子CWndShadow模型在未来的版本中。 已知的问题 我使用父窗口区域CWndShadow计算阴影的形状。看来,在特定条件下的窗口大小,父窗口区域可能不是正确的更新,所以一些影子的一部分可能看错,直到调整完成后,即,鼠标按钮。如果编译在vc++ 6,我的代码会得到几个C4786警告,因为使用std::地图。这是一个已知问题的vc++ 6编译器和不应该做错任何事的执行代码。 历史 版本0.3,2007-06-14 影子是由Windows Vista航空意识。固定一个错误导致Windows Vista的影子出现异常。固定一个错误导致影子出现异常,如果父窗口最初是最小化或最大化的。 版本0.2,2006-11-23 修正了在某些情况下阴影无法工作的一个关键问题,例如Win2K, winxp /2003在没有启用视觉主题的情况下,或者当帧窗口没有标题栏时。 版本0.1,2006-11-10 第一个版本。 本文转载于:http://www.diyabc.com/frontweb/news12052.html

  • 相关阅读:
    点击CheckBox让Gridview控件在编辑与正常状态之间切换
    BMP图片转换为JPEG图片
    ASP.NET截取网页注释行之间的内容
    Mouse点击之后,复制GridView控件的数据行
    Mouse单击高亮GridView数据行
    ASP.NET div信息提示框显示几秒后隐藏
    RDLC报表带搜索与传参数功能演示(ASP.NET MVC)
    ASP.NET MVC应用程序使用axd格式文件
    Nginx通过geo模式实现限速白名单和全局负载均衡
    MySQL 下mysqladmin日常管理命令总结
  • 原文地址:https://www.cnblogs.com/Dincat/p/13473495.html
Copyright © 2011-2022 走看看