网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

C++ 无边框窗口使用Areo阴影效果,最小化动作


        今天无意间看到了一个有关C++无边框窗口使用Aero效果的英文网页,自己也就研究了以下感觉还不错,这里就简单的翻译一下做个记录,留着以后深入研究的时候在去做参考.

原文地址: http://dwz.cn/rdtvJ

问题:

        我正在编写一个无边框窗口的Windows应用程序。然而,因为这个窗口是没有边框的,我的窗口没有Aero的阴影,最小化动画。我查找了很多网站,没有发现有网站介绍如何实现这一点。然而我知道这是可能的,因为Office2014,Visual Studio 2012和Steam它们这些无边框窗口都有Areo的这些特征.我使用QT和C++,但是如果你有解决此问题的相关库,我也想听听你的见解。另外我所说的Areo阴影不是在两个边框存在阴影的Drop shadow风格,我的意思是窗口程序的四周都有发光的阴影. 非常感谢你的帮助!


回答:

   你的假设VS2012和Office2013是无边窗口是错误的,他们显然不是,你可以采用Spy++查看.我想是使用DwmSetWindowAttribute(),并且制定DWMWA_ALLOW_NCPAINT.

   我看了DWMWA_ALLOW_NCPAINT, Word 2013和VS2012应该是在边框上绘制隐藏了它.


最佳的回答:

        在使用了Spy++检查了Steam的窗口,并且设法满足他做的一些事情之后,结合着C#中无边窗口调用DWMAPI的一些特征,我想我找到了解决的方法.

为了隐藏窗口的边框,需要在你的WindowPro中处理WM_NCCALCSIZE这个消息.

case WM_NCCALCSIZE:
    {
        if (window->is_borderless) return 0;
        else return DefWindowProc(hwnd, msg, wparam, lparam);
}

要想启用阴影,你需要做的是:

MARGINS borderless = {1,1,1,1};
DwmExtendFrameIntoClientArea(hwnd, &borderless);

剩下的部分是作者说的一些注意事项,我这里简要的说一下,如果你直接通过上面的操作,实际上你得到的是一个边框为1px的窗口,因为开启了Areo效果,所以当然会在四周出现阴影,像下面这样仔细看还是能够看见名明显的边框的.

所以这里作者又说道:” So you might have to put a non transparent widget, brush or something behind the transparent element.

 

If all goes well, it should then look like this:”,你应该放置一个不透明的控件,画刷,或者一些东西在这些透明的部分(好费解…就是挡着这些透明的部分…),下图为作者处理后的效果:


下面是作者给的一个示例代码:

https://github.com/melak47/BorderlessWindow/archive/master.zip

大家可以研究一下,按键F11是变为无边窗口和正常窗口,F12开启阴影和关闭阴影.

注意代码中有点小问题,随便修改修改就好了.



  • 标签:
  • C++Areo
  • 无边窗口阴影
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.