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


    原文链接: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 # 编码 习惯[转载]
    SilverLight 学习笔记 (一) 画刷:Brush
    55条SEO必备技巧
    c# 不安全代码之指针
    VMare 硬盘扩展和压缩、网络配置
    Win7 防护墙设置——Ping命令,Http访问
    Vs2010 sp1补丁太让人纠结
    不可小瞧的GetHashCode函数
    .NET中颜色的转换方法总结
    VS2010 如何制作项目模板
  • 原文地址:https://www.cnblogs.com/findumars/p/5625173.html
Copyright © 2020-2023  润新知