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.在此类中添加以下函数 - void CNoticeDlg::ShowNotice(CString sNotice)
- {
- CRect rect;
- GetWindowRect(&rect);
- int Xscreen,Yscreen;
- Xscreen = GetSystemMetrics(SM_CXSCREEN);//获取桌面的长
- Yscreen = GetSystemMetrics(SM_CYSCREEN);//获取桌面的宽
- ::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,Xscreen-rect.Width(),Yscreen-rect.Height(),rect.Width(),rect.Height(),
- SWP_SHOWWINDOW);//将窗口移动到桌面右下角
- //
- SetDlgItemText(IDC_NOTICE,sNotice);//设置窗口的提示内容
- ShowWindow(SW_SHOW);
- SetTimer(1,300,NULL);//窗口显示300后抖动
- SetTimer(4,500,NULL); //FOR DETECT HIDING WINDOW
- }
复制代码- BOOL CNoticeDlg::SetWindowTransparency(HWND hWnd,COLORREF rgb,BYTE byte,DWORD dword)
- {
- SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x80000);
- typedef BOOL (WINAPI *FSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD);
- FSetLayeredWindowAttributes SetLayeredWindowAttributes ;
- HINSTANCE hInst = LoadLibrary("User32.DLL");
- SetLayeredWindowAttributes = (FSetLayeredWindowAttributes)GetProcAddress(hInst,"SetLayeredWindowAttributes");
- if(!SetLayeredWindowAttributes)
- {
- return FALSE;
- }
- SetLayeredWindowAttributes(hWnd,rgb,byte,dword);
- FreeLibrary(hInst);
- return TRUE;
- }
- void CNoticeDlg::RockWindow()
- {
- CRect rect;
- GetWindowRect(&rect);
- int Xscreen,Yscreen;
- Xscreen = GetSystemMetrics(SM_CXSCREEN);
- Yscreen = GetSystemMetrics(SM_CYSCREEN);
- Xscreen = Xscreen-rect.Width();
- Yscreen = Yscreen-rect.Height();
- for(int i=0;i<10;i++)
- {
- Sleep(50);
- srand(i);
- int j =rand()%10;
- srand(i+10);
- int k =rand()%10;
- ::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,Xscreen+j,Yscreen+k,rect.Width(),rect.Height(),SWP_SHOWWINDOW|SWP_SHOWWINDOW);
- }
- ::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,Xscreen,Yscreen,rect.Width(),rect.Height(),SWP_SHOWWINDOW|SWP_NOREDRAW);
- }
复制代码- void CNoticeDlg::PauseHidingWindow(BOOL bPause)
- {
- if(bPause)
- {
- m_bPauseTrans = true;
- SetWindowTransparency(GetSafeHwnd(),RGB(128,128,128),255,0X02);
- }
- else
- m_bPauseTrans = FALSE;
- }
- void CNoticeDlg::OnTimer(UINT nIDEvent)
- {
- if(nIDEvent == 1) //300ms后抖动
- {
- RockWindow();
- SetTimer(2,5000,NULL);
- KillTimer(1);
- }
- if(nIDEvent == 2)//窗口显示 2000ms渐隐关闭
- {
- KillTimer(2);
- SetTimer(3,1,NULL);
- }
- if(nIDEvent == 3) //for hiding window
- {
- if(!m_bPauseTrans)
- {
- SetWindowTransparency(GetSafeHwnd(),RGB(0,255,0),m_TransDecrease,2);
- m_TransDecrease -= 1;
- if(m_TransDecrease<=100)
- {
- ShowWindow(SW_HIDE);
- m_TransDecrease = 255;
- SetWindowTransparency(GetSafeHwnd(),RGB(0,255,0),m_TransDecrease,2);
- KillTimer(3);
- }
- }
- }
复制代码- if(nIDEvent == 4) //for pause hiding window
- {
- CRect rect;
- GetWindowRect(&rect);
- CPoint pos;
- GetCursorPos(&pos);
- if(rect.PtInRect(pos))
- {
- PauseHidingWindow();
- }
- else
- {
- PauseHidingWindow(FALSE);
- }
- if(!IsWindowVisible())
- KillTimer(3);
- }
-
- CDialog::OnTimer(nIDEvent);
- }
复制代码在父窗口添加此窗口变量进行简单调用便可m_NoticeDlg.ShowNotice("2015.11.24 \n俄战机被击落,你造么?");
我们演示功能实现的过程 源码及视频下载 (仅在电脑可见)
|