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

原文链接: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. int screenwidth=GetSystemMetrics(SM_CXSCREEN);
  9. int screenheith=GetSystemMetrics(SM_CYSCREEN);
  10. //将当前窗口移动到屏幕以下的地方
  11. MoveWindow(screenwidth-WindowRect.Width()-2,screenheith,WindowRect.Width(),WindowRect.Height());
  12. //测试
  13. Invalidate(FALSE);
  14. ShowWindow(SW_SHOWNORMAL);
  15. //置顶
  16. ::SetWindowPos(this->GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  17. //获得 任务栏 窗口
  18. CWnd* cwd = NULL;
  19. RECT rt;
  20. HWND hwnd = ::FindWindow(_T("Shell_TrayWnd"), NULL);
  21. if(hwnd)
  22. {
  23. cwd = CWnd::FromHandle(hwnd);
  24. }
  25. cwd->GetWindowRect(&rt);
  26. m_nMinTop=rt.top-WindowRect.Height()-2;
  27. //上升定时器的设置
  28. SetTimer(TM_STARTUP,m_nUpTimeSpan,NULL);
  29. }

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. else
  18. {
  19. int iHeight=WindowRect.Height();
  20. WindowRect.top-=m_nIncrementHeight;
  21. if (WindowRect.top<m_nMinTop)
  22. {
  23. WindowRect.top=m_nMinTop;
  24. WindowRect.bottom=WindowRect.top+iHeight;
  25. MoveWindow(&WindowRect);
  26. //置顶
  27. this->SetForegroundWindow();
  28. ::SetWindowPos(this->GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  29. KillTimer(TM_STARTUP);
  30. }
  31. else
  32. {
  33. WindowRect.bottom-=m_nIncrementHeight;
  34. MoveWindow(&WindowRect);
  35. }
  36. }
  37. CDialog::OnTimer(nIDEvent);
  38. }

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

时间: 2024-12-21 14:22:14

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

弹出一个窗口

经常上网的朋友可能会到过这样一些网站,一进入首页立刻会弹出一个窗口,  或者按一个连接或按钮弹出,通常在这个窗口里会显示一些注意事项.版权信息  .警告.欢迎光顾之类的话或者作者想要特别提示的信息.其实制作这样的页面  效果非常的容易,只要往该页面的HTML里加入几段Javascript代码即可实现.下  面俺就带您剖析它的奥秘.  [1.最基本的弹出窗口代码]    其实代码非常简单:  <SCRIPT LANGUAGE="javascript">  <!-- wi

用MPLAB IDE编程时,软件总是弹出一个窗口提示: “the extended cpu mode configuration bit is enabled,but the program that was loaded was not built using extended cpu instructions. therefore,your code may not work properly

用MPLAB IDE编程时,软件总是弹出一个窗口提示:"the extended cpu mode configuration bit is enabled,but the program that was loaded was not built using extended cpu instructions.therefore,your code may not work properly."怎么办? 在main函数前加一句伪指令:#pragma config XINST=OFF即

gridview中的单元格弹出一个窗口

网格中的单元格弹出一个窗口 $(document).ready(function(){ var s=$('#grdTest_Div'); var tr=$('#grdTest_Div').children().children().children().children(); var grid = document.all.grdTest; tr.each(function(i,j){ if(i!=0&&i!=tr.length) { $('td',j).eq(3).click(funct

QDialog弹出一个窗口,改变窗口大小

创建一个QT应用 文件->新建文件或项目 Application->Qt Widgets Application 其他下一步 基类选择QDialog 其他下一步 main.cpp 1 #include "dialog.h" 2 #include <QApplication> 3 #include <windows.h> 4 5 class bigsmall 6 { 7 Dialog *p;//指针 8 public: 9 void setp(Dial

点击文字弹出一个DIV层窗口代码

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>点击文字弹出一个DIV层窗口代码</title> <style> .black_overlay{ display: none; position: absolute; top: 0%; left: 0%; width: 100%; height:

创建一个弹出DIV窗口

创建一个弹出DIV窗口 摘自:   http://www.cnblogs.com/TivonStone/archive/2012/03/20/2407919.html 创建一个弹出DIV窗口可能是现在网站/网页制作中最常碰到的问题之一.传统的 JavaScript弹窗已经不适合目前网站的设计理念了,理由有二:首先,不友好——生硬的弹出对话框且伴随着“哐”的一声对用户体验是个很大的挑战: 其次,兼容性不够强——有相当多的浏览器屏蔽了这种JS的Alert()方法.于是,一个良好用户体验的网站需要一种

JavaScript基础 window.open(url,name,options) 弹出一个 新窗口 屏幕居中显示 获取屏幕的有效宽度

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=ut

js Ajax点击链接弹出一个DIV层窗口

下面是在实际项目中截取的部分代码,如果你想下载下来直接使用,可以点击这里点击文字弹出一个DIV层窗口代码. 效果图 HTML代码 <div class="cb pt10 mlf10"> <a href="__APP__/Article/chatpwd/value/7" onclick="verify(this);return false;" target="_blank" class="button

window.open实现模式窗口(只弹出一个window.open)

父页面 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>父窗口</title> <script src="../Scri