当前位置:C++技术网 > 资讯 > [MFC] 如何实现屏幕置顶透明窗口

[MFC] 如何实现屏幕置顶透明窗口

更新时间:2017-03-04 21:11:00浏览次数:1+次

    在Windows平台下,我的XX软件想实现一个功能,功能如下所述:

    1. 在屏幕高度的二分之一,宽度的四分之一的范围限制内,创建个透明窗口,并显示XX软件的工作进度。

    如下图所示:

    

    2. 显示工作进度的同时,不能阻挡鼠标的点击。例如,我的电脑图标在透明窗口的后面,我要点击我的电脑图标,XX软件不能阻挡我的点击。

    3. 透明窗口不能被其他窗口遮挡掉,必须置顶。

    4. 透明窗口的高度与工作进度的最底部,直到准备超过限制范围时,工作进度向上滑动,最低部显示最新的工作进度。

    如下图所示:

    

    5. 透明窗口必须要可以自由开关。

    6. 如果屏幕分辨率发生改动,限制范围必须随屏幕分辨率的改变而更改。


    我看到这个要求时,这时我有点迷茫,找不到比较好的思路。

    1. 首先透明窗口,这个功能是如何实现的呢?我用了C++技术网的搜索功能,关键字为 "透明" ,然后有篇文章讲了可以用 SetLayeredWindowAttributes() 函数来设置窗口透明度。那么第一点可以解决了。

    2. 不能阻挡鼠标的点击,这个思路我就想不出来了,这个功能简直就像在屏幕上画个薄纱,显示文字,在最顶面且不阻止鼠标的点击,这太神奇了。

    3. 透明窗口不能被其他窗口遮挡,应该就是把窗口给置顶了,我觉得可以用 BringWindowToTop() 函数来把窗口置顶。

    4. 这个有难度有点大,就像窗口最底部黏着最新的工作进度来显示,而且还要计算限制范围。暂时想不出什么好的思路来。

    5. 我觉得需要用到非模态窗口,关闭时隐藏透明窗口,开启时显示透明窗口,程序退出时,真正关闭非模态窗口。

    6. 这个就有些尴尬了,我总不能创建个时钟或线程浪费资源来循环检测屏幕分辨率吧,有什么好的方法,可以在客户自己修改分辨率时,透明窗口像收到通知一样,自动更改限制范围呢?


    最后感谢C++技术网的回答。


C++技术网会员解答:

    你好,赶紧对C++技术网的信任与支持。下面开始解答。

    第2个问题:

    透明窗口是具备穿透特性的。也就是说,透明的位置,你可以直接操作透明底部的东西。所以,自然而然也就不会有阻挡的效果。只是说,要在透明窗口上显示文字而已。总体的效果就是,窗口透明,文字不透明。这样就达到了效果。而第1点提到的透明其实有两种方式,一种是直接全窗口直接透明,第二种是使用透明色透明。使用透明色的透明只会将指定的颜色变成透明的,那么其他颜色则保留。这个的实现,请参考文章《创建不规则窗口-心形窗口》。

    第3个问题:

    这个只要将窗口属性设置为WS_EX_TOPMOST置顶即可。当然,你使用的函数也可以。

    第4个问题:

    工作进度就纯粹是编程自己去实现的。你就是在一个窗口上面输出你要的东西而已。可以直接将要显示的东西DrawText出来就可以了。而位置则可以通过窗口的大小来计算而定位。当然如果指定位置,TextOut函数会更好用些。

    第6个问题:

    屏幕分辨率改变时系统会想程序发出一个消息,这个消息就是WM_DISPLAYCHANGE。你可以通过以下代码获取分辨率的值:

int winWidth = GetSystemMetrics(SM_CXFULLSCREEN);
int winHeight = GetSystemMetrics(SM_CYSCREEN) 
     然后你再对窗口的大小和位置进行调整就行了。

    你的问题就解答完毕了。