悬浮窗口(智能隐藏和显示)的一种实现方案

悬浮窗口应该具有的特性

为了实现让用户能方便打开软件主窗口,又不对用户界面造成明显的视觉干扰,悬浮窗口应该有以下特点:

  • 和主窗口是二选一的关系,主窗口显示时自动隐藏,主窗口被全部遮挡时自动显示
  • 始终置前,不被其它窗口遮挡,全屏播放电影、截图软件截图等情形时,取消置前。
  • 支持全窗口拖动
  • 半透明效果,鼠标移上时全为不透明
  • 为了使隐藏和出现不显得突兀,支持淡入淡出效果
  • 点击悬浮窗时,呼出主窗口,并隐藏悬浮窗口

上述特点的实现方案

整个实现方案依赖于主窗口内的一个定时器(200ms),定时检查主窗口的显示状态以及悬浮窗口的顶置属性。

和主窗口是二选一的关系,主窗口显示时自动隐藏,主窗口被全部遮挡时自动显示

与主窗口二选一的显示,是通过定时检查主窗口的显示状态,来设置是否显示悬浮窗口。
如果主窗口未隐藏,并且没有被其它窗口完全遮挡(可以是一个或者多个窗口的组合),悬浮窗口不显示。

IsEntirelyCovered(HWND hWnd)(http://blog.csdn.net/harbinzju/article/details/6781646)函数可以判断一个窗口,是否被完全遮挡住,可能是被一个或者多个窗口遮挡。
实现思路:向上找到Z-Order大于目标窗口的窗口,将这些窗口逐一拼接,每拼接一个窗口后,判断一下目标窗口是不是被这个拼接后的区域覆盖。
这里用到的CRgn来自WTL的atlgdi.h,MFC中也有相似的类,都是对API的一个封装。

始终置前,不被其它窗口遮挡,全屏播放电影、截图软件截图等情形时,取消置前。

这个功能的实现同样依赖于主窗口的定时器,当定时器触发时,发现主窗口未显示,会调用悬浮窗的显示窗口方法,这里会重新设置置前属性。
在设置置属性之前,要判断是否有其它全屏的置前窗口遮挡了悬浮窗,如果有,不再去抢置前。这样就可以避免与截图和全屏播放电影冲突。
实现思路:向上找到Z-Order大于悬浮窗口的窗口,判断这个窗口是否为全屏。
IsFullScreen(HWND hWnd)函数可以判断窗口是否为全屏。

BOOL IsFullScreen(HWND hWnd)
{
    if (hWnd == NULL)
    {
        return FALSE;
    }

if (!::IsWindowVisible(hWnd))
    {
        return FALSE;
    }

int nScreenWidth = ::GetSystemMetrics(SM_CXSCREEN);
    int nScreenHeight = ::GetSystemMetrics(SM_CYSCREEN);

CRect rcWnd;
    GetWindowRect(hWnd, &rcWnd);

if (rcWnd.top == 0 && rcWnd.left == 0 
        && rcWnd.Width() == nScreenWidth
        && rcWnd.Height() == nScreenHeight)
    {
        return TRUE;
    }

return FALSE;
}

支持全窗口拖动

窗口响应WM_NCHITTEST消息,固定返回HTCAPTION。

半透明效果,鼠标移上时全为不透明

设置WS_EX_LAYERED属性,使用UpdateLayeredWindow来绘制窗口。因为悬浮窗口一般比较简单,没有复杂的控件,甚至没有控件,所以此方案比较简单可行。
当鼠标移入和移出时,调用SetLayeredWindowAttributes来改变悬浮窗的透明度。

为了使隐藏和出现不显得突兀,支持淡入淡出效果

实现思路:开始淡入\淡出时,启动定时器(30ms),定期增加\减少窗口透明度,当增加至1(或者预设的最大透明度)\减小到0时,停止定时器。

http://blog.csdn.net/harbinzju/article/details/7022882

时间: 05-03

悬浮窗口(智能隐藏和显示)的一种实现方案的相关文章

Atitit. 悬浮窗口的实现 java swing c# .net c++ js html 的实现

Atitit. 悬浮窗口的实现 java swing c# .net c++ js html 的实现 1. 建立悬浮窗口引用代码 1 1.1. 定义悬浮窗口,设置this主窗口引用,是为了在悬浮窗口中双击可缩小还还原主窗口.以及悬浮窗口右键菜单"显示主界面"中需要还原主窗 1 1.2. //设置主窗口关闭时,先关闭悬浮窗口.and系统托盘 1 1.3. 注入系统托盘图标,退出的时候儿也退出系统托盘 2 2. 悬浮窗口结构and重大的点 2 2.1. 要去掉标题栏: 2 2.2. Opa

如何用C#做一个悬浮窗口程序

用C#做一个像FlashGet的悬浮窗口,其实很简单,不像以前需要调用很多系统API.大致的步骤如下. 首先是主窗体部分,即要判断窗体的状态来决定是否显示悬浮窗口. 局部成员声明: private FormWindowState fwsPrevious; private frmTopMost myTopMost; 主窗体的Load事件: private void frmMain_Load(object sender, System.EventArgs e) { // Save window st

【Anroid界面实现】通用的桌面悬浮窗口的实现(一)

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 现在很多安全类的软件,比如360手机助手,百度手机助手等等,都有一个悬浮窗,可以飘浮在桌面上,方便用户使用一些常用的操作.今天这篇文章,就是介绍如何实现桌面悬浮窗效果的. 首先,看一下效果图. 悬浮窗一共分为两个部分,一个是平常显示的小窗口,另外一个是点击小窗口显示出来的二级悬浮窗口. 首先,先看一下这个项目的目录结构. 最关键的就是红框内的四个类. 首先,FloatWindowService是一个后台的

Android 悬浮窗口

一.创建悬浮窗口步骤    1.实现一个ViewGroup类,作为悬浮窗口的界面类,以便在里面重写onInterceptTouchEvent和onTouchEvent方法,实现移动界面的目的.       在本例中实现了一个FloatLayer类,可以作为通用的类,使用时需要传入WindowManager对象以实现移动窗口. // FloatLayer ~ package com.example.hellofloatingwnd; import static com.ahai.util.Debu

Android中可自由移动悬浮窗口的实现

大家对悬浮窗概念不会陌生,相信每台电脑桌面的右上角都会有这么一个东西,它总是出现在所有页面的顶端(Top Show).但在Android平台中如何实现这样的效果呢?先来看一看效果图. 看见在Google搜索框上面的那个Icon图片了嘛.下面我就来详细介绍一下在Android平台下悬浮窗口的实现,并让它能够随手指的触摸而移动. 一.实现原理及移动思路 调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView

Flex中TabNavigator隐藏和显示选项卡

1.问题背景 遇到这样一个问题:有四个Tab选项卡.依据不同的參数隐藏和显示选项卡 2.实现实例 (1)隐藏"春季" protected function springClickHandler(event:MouseEvent):void { tabs.getTabAt(0).visible = false; tabs.getTabAt(0).includeInLayout = false; tabs.getTabAt(1).visible = true; tabs.getTabAt(

Atom快速进入全屏后隐藏/恢复显示菜单栏

今天用ATOM进入全屏模式,然后偶尔琢磨这个Atom 1.3.2版本的软件的时候, 在菜单栏里面的View里面, 有一个Toggle Menu Bar的选项,好奇的我点击了下,瞬间,菜单栏就不见了.. 经过一番琢磨,终于想到了方法,其实就是通过键盘的快捷键啦. 注:虽然我用的是atom 1.3.2版本的软件,但是原理是一样的.工具/原料 Atom软件,键盘,鼠标,电脑 方法/步骤 首先,当然是打开ATOM软件啦,进入全屏怎么进?按下键盘上面的快捷键F11是最好的. Atom快速进入全屏后隐藏/恢

jQuery效果:隐藏、显示、切换、滑动、淡入淡出、动画

jQuery效果 隐藏.显示.切换.滑动.淡入淡出.以及动画 1.隐藏与显示(改变:display:none;) hide()--隐藏 show()--显示 toggle()方法:可以使用它来切换hide()与show()方法 eg1:显示 <style type="text/css"> *{margin:0;padding:0;} .body{font-size:12px;font-family:"微软雅黑";color:#666;} .yym{wid

动画基础隐藏和显示 (jQuery)

1jQuery中隐藏元素的hide方法 让页面上的元素不可见,一般可以通过设置css的display为none属性.但是通过css直接修改是静态的布局,如果在代码执行的时候,一般是通过js控制元素的style属性,这里jQuery提供了一个快捷的方法.hide()来达到这个效果 $elem.hide() 提供参数: .hide( options ) 当提供hide方法一个参数时,.hide()就会成为一个动画方法..hide()方法将会匹配元素的宽度,高度,以及不透明度,同时进行动画操作 快捷参