如何弹出一个窗口气泡(使用定时器向上移动)

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何弹出一个窗口气泡(使用定时器向上移动)相关的知识,希望对你有一定的参考价值。

原文链接:http://blog.csdn.net/tangaowen/article/details/5108980  

如何弹出一个窗口气泡

      最近在工作中遇到这样一个需求,就是需要将一个窗口从右下角任务栏下面缓缓的上升到任务栏的上面,现在有很多的软件都有这样的气泡,比如:搜狗输入法的词条更新窗口,还比如CSDN的广告窗口等等。

      1.首先 将要弹出的窗口移动到任务栏(当前屏幕)以下

      2.然后,获得任务栏(本质是个窗口)的高度,这样就可以知道窗口最终的位置了

      3.然后,计算获得窗口最终停止的位置:计算公式:dwMaxHeight=当前屏幕高度-任务栏窗口的顶部高度+/-适度偏移值

      4.设置一个定时器 

      5.在定时器中响应窗口,调用MoveWindow或者SetWindowPos等函数来每次固定减少 一个固定的Y坐标值dwIncreatmentValue

 

      关于定时器响应的几种情况:

      1.如果上升窗口的top<=dwMaxHeight说明窗口已经浮出到预定的位置了,这个时候

       KillTimer

      2.如果上升窗口的top>dwMaxHeight,说明还没有达到预定的位置,这个时候

         根据   上升窗口的top+dwIncreatmentValue的值来处理

         (1)上升窗口的top+dwIncreatmentValue<=dwMaxHeight,说明这次不要增加

                  dwIncreatmentValue这么多值就可以上升到预定位置了,这个时候

                 让 上升窗口的top=dwMaxHeight,然后SetWindowPos到预定位置,然后

                  KillTimer

          (2)上升窗口的top+dwIncreatmentValue>dwMaxHeight,说明这一次还不能

                  上升到预定的位置,所以就直接:上升窗口Rect+dwIncreatmentValue

                   然后SetWindowPos将窗口向上移动dwIncreatementValue的位置。

 

 

 

下面是相关代码:

      1.在类中声明两个成员变量:

     

[cpp] view plaincopy
 
 
  1. // 窗口浮上来所用的时间间隔  
  2. DWORD m_nUpTimeSpan;  
  3. // 每次上升的高度  
  4. DWORD m_nIncrementHeight;  
  5. // 上升的极限值  
  6. DWORD m_nMinTop;  

 

      2. 在类的构造函数中,初始化这些值:

    

[cpp] view plaincopy
 
 
  1. m_nIncrementHeight=2;  
  2. m_nUpTimeSpan=1*10;  

 

 

    3.将整个升窗的函数写为StartMove

    

[cpp] view plaincopy
 
 
  1. // 开始向上移动  
  2. void    StartMove(void)  
  3. {  
  4.     //获得当前窗口的区域范围  
  5.     CRect WindowRect;  
  6.     ::GetWindowRect(GetSafeHwnd(),&WindowRect);  
  7.   
  8.     //获得屏幕的宽高  
  9.     int screenwidth=GetSystemMetrics(SM_CXSCREEN);  
  10.     int screenheith=GetSystemMetrics(SM_CYSCREEN);  
  11.   
  12.     //将当前窗口移动到屏幕以下的地方  
  13.     MoveWindow(screenwidth-WindowRect.Width()-2,screenheith,WindowRect.Width(),WindowRect.Height());  
  14.     //测试  
  15.     Invalidate(FALSE);  
  16.     ShowWindow(SW_SHOWNORMAL);  
  17.     //置顶  
  18.     ::SetWindowPos(this->GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);  
  19.       
  20.     //获得 任务栏 窗口  
  21.     CWnd* cwd = NULL;   
  22.     RECT rt;    
  23.     HWND hwnd = ::FindWindow(_T("Shell_TrayWnd"), NULL);     
  24.     if(hwnd)     
  25.     {     
  26.         cwd = CWnd::FromHandle(hwnd);     
  27.     }     
  28.     cwd->GetWindowRect(&rt);  
  29.   
  30.     m_nMinTop=rt.top-WindowRect.Height()-2;  
  31.   
  32.     //上升定时器的设置  
  33.     SetTimer(TM_STARTUP,m_nUpTimeSpan,NULL);  
  34. }  

 

 

     4.OnTimer函数的实现

    

[cpp] view plaincopy
 
 
  1. void OnTimer(UINT_PTR nIDEvent)  
  2. {  
  3.     //如果已经在极限值以上,那么说明已经完全浮上来了  
  4.     CRect WindowRect;  
  5.     ::GetWindowRect(GetSafeHwnd(),&WindowRect);  
  6.     if (WindowRect.top<=m_nMinTop)  
  7.     {  
  8.         Invalidate(FALSE);  
  9.         ShowWindow(SW_SHOWNORMAL);  
  10.         UpdateWindow();  
  11.         //置顶  
  12.         this->SetForegroundWindow();  
  13.         ::SetWindowPos(this->GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);  
  14.         KillTimer(TM_STARTUP);  
  15.     }  
  16.   
  17.     //否则  
  18.     else  
  19.     {  
  20.         int iHeight=WindowRect.Height();  
  21.         WindowRect.top-=m_nIncrementHeight;  
  22.   
  23.         if (WindowRect.top<m_nMinTop)  
  24.         {  
  25.             WindowRect.top=m_nMinTop;  
  26.             WindowRect.bottom=WindowRect.top+iHeight;     
  27.             MoveWindow(&WindowRect);  
  28.             //置顶  
  29.             this->SetForegroundWindow();  
  30.             ::SetWindowPos(this->GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);  
  31.   
  32.             KillTimer(TM_STARTUP);  
  33.         }  
  34.         else  
  35.         {  
  36.             WindowRect.bottom-=m_nIncrementHeight;  
  37.             MoveWindow(&WindowRect);  
  38.         }     
  39.     }  
  40.   
  41.     CDialog::OnTimer(nIDEvent);  
  42. }  

 

http://blog.csdn.net/huasonl88/article/details/8705558

以上是关于如何弹出一个窗口气泡(使用定时器向上移动)的主要内容,如果未能解决你的问题,请参考以下文章

C#应用程序如何不弹出cmd命令行窗口执行

如何使用kettle自带的‘Star’定时功能

如何使用kettle自带的‘Star’定时功能

如何向上移动 tableView 以便从底部弹出一个视图以便它不在 iPhone 中的表格顶部

定时器触发的angularJS性能问题

C#自动弹出窗口并定时自动关闭