QQ登录

只需一步,快速开始

43上位机VC MFC窗口抖动渐隐消失效果

[ 复制链接 ]

43上位机VC MFC窗口抖动渐隐消失效果

43上位机VC MFC窗口抖动渐隐消失效果

43上位机VC MFC窗口抖动渐隐消失效果


功能展示

有时我们会看到右下角广告小窗口会抖动提示,引起我们注意,然后逐渐透明地消失。如果我们也想以这种效果提示我们的用户,以便处理程序的问题,该如何实现呢?这们当前例程实现这一功能,效果如图;

要点提示
窗口的抖动,就是窗口的位置在短时间内在小区域内快速的移动,所以我们可以用SetWindowPos()这个函数快速不间断的移动窗口来实现窗口的抖动效果;SetWindowPos函数改变一个子窗口,弹出式窗口或顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。函数原型:BOOL SetWindowPos(HWND hWnd, const CWnd*pWndInsertAfter, int x, int y,int cx, int cy, UINT nFlags);函数参数hWnd窗口句柄。hWndlnsertAfter在z序中的位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄,或下列值之一:HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
HWND_NOTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。
HWND_TOP:将窗口置于Z序的顶部。
HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。

X Y CX CY新的窗口位置和大小 ;uFlags窗口尺寸和定位的标志。
实现功能
1.新建基于对话框的应用程序
2.新建一对话框资源关联一对话框类CNoticeDlg做为显示通知消息用;

3.在此类中添加以下函数
  1. void  CNoticeDlg::ShowNotice(CString sNotice)
  2. {
  3.         CRect rect;
  4.         GetWindowRect(&rect);
  5.         int Xscreen,Yscreen;
  6.         Xscreen = GetSystemMetrics(SM_CXSCREEN);//获取桌面的长
  7.         Yscreen = GetSystemMetrics(SM_CYSCREEN);//获取桌面的宽
  8.         ::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,Xscreen-rect.Width(),Yscreen-rect.Height(),rect.Width(),rect.Height(),
  9.                            SWP_SHOWWINDOW);//将窗口移动到桌面右下角
  10. //
  11.         SetDlgItemText(IDC_NOTICE,sNotice);//设置窗口的提示内容
  12.         ShowWindow(SW_SHOW);

  13.         SetTimer(1,300,NULL);//窗口显示300后抖动
  14.     SetTimer(4,500,NULL);  //FOR DETECT HIDING WINDOW
  15. }
复制代码
  1. BOOL CNoticeDlg::SetWindowTransparency(HWND hWnd,COLORREF rgb,BYTE byte,DWORD dword)
  2. {
  3.         SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x80000);
  4.         typedef BOOL (WINAPI *FSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD);
  5.         FSetLayeredWindowAttributes SetLayeredWindowAttributes ;
  6.         HINSTANCE hInst = LoadLibrary("User32.DLL");
  7.         SetLayeredWindowAttributes = (FSetLayeredWindowAttributes)GetProcAddress(hInst,"SetLayeredWindowAttributes");

  8.         if(!SetLayeredWindowAttributes)
  9.         {
  10.                 return FALSE;
  11.         }
  12.         SetLayeredWindowAttributes(hWnd,rgb,byte,dword);
  13.         FreeLibrary(hInst);
  14.         return TRUE;
  15. }
  16. void CNoticeDlg::RockWindow()
  17. {
  18.         CRect rect;
  19.         GetWindowRect(&rect);
  20.         int Xscreen,Yscreen;
  21.         Xscreen = GetSystemMetrics(SM_CXSCREEN);
  22.         Yscreen = GetSystemMetrics(SM_CYSCREEN);
  23.         Xscreen = Xscreen-rect.Width();
  24.         Yscreen = Yscreen-rect.Height();
  25.         for(int i=0;i<10;i++)
  26.         {
  27.                 Sleep(50);
  28.                 srand(i);
  29.                 int j =rand()%10;
  30.                 srand(i+10);
  31.                 int k =rand()%10;
  32.                 ::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,Xscreen+j,Yscreen+k,rect.Width(),rect.Height(),SWP_SHOWWINDOW|SWP_SHOWWINDOW);        
  33.         }
  34.         ::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,Xscreen,Yscreen,rect.Width(),rect.Height(),SWP_SHOWWINDOW|SWP_NOREDRAW);
  35. }
复制代码
  1. void CNoticeDlg::PauseHidingWindow(BOOL bPause)
  2. {
  3.         if(bPause)
  4.         {
  5.                 m_bPauseTrans = true;
  6.                 SetWindowTransparency(GetSafeHwnd(),RGB(128,128,128),255,0X02);
  7.         }
  8.         else
  9.         m_bPauseTrans = FALSE;

  10. }
  11. void CNoticeDlg::OnTimer(UINT nIDEvent)
  12. {
  13.         if(nIDEvent == 1)          //300ms后抖动
  14.         {
  15.                 RockWindow();
  16.                 SetTimer(2,5000,NULL);
  17.                 KillTimer(1);
  18.         }
  19.         if(nIDEvent == 2)//窗口显示 2000ms渐隐关闭
  20.         {
  21.                 KillTimer(2);
  22.                 SetTimer(3,1,NULL);
  23.         }
  24.         if(nIDEvent == 3)  //for  hiding window
  25.         {
  26.                 if(!m_bPauseTrans)
  27.                 {
  28.                         SetWindowTransparency(GetSafeHwnd(),RGB(0,255,0),m_TransDecrease,2);
  29.                         m_TransDecrease -= 1;
  30.                         if(m_TransDecrease<=100)
  31.                         {
  32.                                 ShowWindow(SW_HIDE);
  33.                                 m_TransDecrease = 255;
  34.                                 SetWindowTransparency(GetSafeHwnd(),RGB(0,255,0),m_TransDecrease,2);
  35.                                 KillTimer(3);
  36.                         }
  37.                 }
  38.         }
复制代码
  1. if(nIDEvent == 4) //for pause hiding window
  2.         {
  3.                 CRect rect;
  4.                 GetWindowRect(&rect);
  5.                 CPoint pos;
  6.                 GetCursorPos(&pos);
  7.                 if(rect.PtInRect(pos))
  8.                 {
  9.                         PauseHidingWindow();
  10.                 }
  11.                 else
  12.                 {
  13.                         PauseHidingWindow(FALSE);
  14.                 }
  15.                 if(!IsWindowVisible())
  16.                         KillTimer(3);
  17.         }
  18.         
  19.         CDialog::OnTimer(nIDEvent);
  20. }
复制代码
在父窗口添加此窗口变量进行简单调用便可m_NoticeDlg.ShowNotice("2015.11.24 \n俄战机被击落,你造么?");


我们演示功能实现的过程
源码及视频下载
(仅在电脑可见)

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:43.上位机VC MFC窗口抖动渐隐消失效果.rar 
文件大小:124.87 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!

回复

使用道具 举报

快速回复 返回列表 客服中心 搜索