• Duilib 实现右下角弹出像QQ新闻窗口,3秒后窗口透明度渐变最后关闭,若在渐变过程中鼠标放到窗口上,窗口恢复最初状态(二)


    效果:

     

    1.定义两个个定时器ID  

    #define ID_TIMER_DISPLAY_DELAY 30
    #define ID_TIMER_DISPLAY_CLOSE 40

    2.添加一个成员函数和成员变量

    void SetAlpha(HWND hWnd,int Alpha);
    
    int m_nFlag ;

    void CPopUpWnd::SetAlpha(HWND hWnd,int Alpha)
    {

      HINSTANCE hInst = LoadLibrary(L"User32.DLL");
      if(hInst)
      {
        typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
        MYFUNC fun = NULL;
       //取得SetLayeredWindowAttributes函数指针
       fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
       if(fun)fun(hWnd,0,Alpha,2);
       FreeLibrary(hInst);
       }

    }

    3.修改窗口属性

    void CPopUpWnd::OnPrepare()
    {
        //直接显示在右下角
        MoveSelfWindow();
    
        //修改窗口属性为了窗口透明度
        SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(m_hWnd,GWL_EXSTYLE)^0x80000);

         //3秒后改变窗口透明度
         SetTimer(m_hWnd,ID_TIMER_DISPLAY_DELAY,3000,NULL);

    }

    4.在定时器响应函数里

    LRESULT CPopUpWnd::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam,BOOL& bHandled)
    {
        
    
        switch(wParam)
        {//多个定时器
        
        case ID_TIMER_DISPLAY_DELAY:
            KillTimer(m_hWnd,ID_TIMER_DISPLAY_DELAY);
            SetTimer(m_hWnd,ID_TIMER_DISPLAY_CLOSE,60,NULL);
            break;
        case ID_TIMER_DISPLAY_CLOSE:
            {
                if(m_nFlag < 255)
                {
                    m_nFlag+= 5;
                    SetAlpha(m_hWnd,255-m_nFlag);
                }
                else
                {
                    KillTimer(m_hWnd,ID_TIMER_DISPLAY_CLOSE);
                    Close(IDCLOSE);
                    m_nFlag = 0;
                }
            }
            break;
        }
        return 0;
    }

    5.窗口渐变关闭过程中,鼠标经过窗口,关闭定时器,窗口恢复原状

    LRESULT CPopUpWnd::OnMouseEnter(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    
           .....
        
        //KillTimer(m_hWnd,ID_TIMER_DISPLAY_DELAY);
        KillTimer(m_hWnd,ID_TIMER_DISPLAY_CLOSE);
        if (m_nFlag < 255)
        {
            SetAlpha(m_hWnd,255);
        }
    
          ....
    
        return 0;
    }

    6.鼠标出了窗口,开启定时器继续渐变关闭窗口

    LRESULT CPopUpWnd::OnMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        .....
    
        SetTimer(m_hWnd,ID_TIMER_DISPLAY_CLOSE,30,NULL);
        m_nFlag = 0;
    
           ....
        return 0;
    }
  • 相关阅读:
    IDEA使用总结1-Github下载代码和上传代码到Git
    Mysql-安装指南
    Dubbo安装及其实战1
    分布式设计(学习内容目录--后端架构师)
    elasticsearch安装指导(new)
    浅谈TCP/IP(new 常见面试问题)
    浅谈常用的设计模式(new)
    浅谈Elasicsearch
    浅谈数据库分库分表(new)
    JAVA 电子书下载地址
  • 原文地址:https://www.cnblogs.com/chechen/p/7356754.html
Copyright © 2020-2023  润新知