FaderWnd.cpp
上传用户:czfddz
上传日期:2013-03-20
资源大小:1517k
文件大小:4k
源码类别:

酒店行业

开发平台:

C/C++

  1. // FaderWnd.cpp : implementation file
  2. //CFaderWnd类为透明窗口的接口类,其实现的原理是:
  3. //先从要实现透明的窗口得到窗口类指针,作为参数传给CFaderWnd类
  4. //CFaderWnd类得到窗口指针类后,创建一个和得到的窗口指针类很相似的窗口
  5. //创建的窗口类中必须指定WS_EX_LAYERED(0x00080000)和WS_EX_TOPMOST样式
  6. //通过WS_EX_TOPMOST样式的设置,将当前创建的窗口作为分层窗口的上层窗口
  7. //在创建结构体中CFaderWnd()内置一个时间器
  8. //通过调用UpdateLayeredWindow()函数更新分层窗口的透过度
  9. //通过时间器的作用,每隔一定的时间就将透明度降低,渐渐的趋向透明,实现窗口的渐隐功能
  10. //当设置的时间完了后,上层窗口已经透明,这个时候就将下层窗口(也就是要实现渐隐的窗口)关闭或隐藏起来
  11. //调用方法:
  12. //主框架为基础的窗口实现方法:
  13. //new CFaderWnd(this);
  14. //ShowWindow(WS_HIDE);
  15. //一般的文档类的窗口(如CAboutDlg类)实现方法:
  16. //new CFaderWnd(this);
  17. //EndDialog(ID);
  18. #include "stdafx.h"
  19. //#include "FaderWndTest.h"
  20. #include "FaderWnd.h"
  21. #ifdef _DEBUG
  22. #define new DEBUG_NEW
  23. #undef THIS_FILE
  24. static char THIS_FILE[] = __FILE__;
  25. #endif
  26. #define FaderWndTimer 0
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CFaderWnd
  29. CFaderWnd::CFaderWnd(CWnd*pWndToFader/*=NULL*/,UINT nFaderTime/*=2000*/,BYTE ALPHA/*=255*/)
  30. :m_pWndToFader(pWndToFader)//m_pWndtoFader类指针的作用是将要实现渐隐的窗口于当前的类联系起来
  31. {
  32. //检查对象的合法性,只有在调试版本中有用,发行版本中没有用
  33. ASSERT(pWndToFader);
  34. ASSERT_VALID(pWndToFader);
  35. //得到合法的ALPHA值或调用缺省的值
  36. if(ALPHA<5)  return;
  37. //加载UpdateLayeredWindow()函数从user32.dll
  38. HMODULE m_hInstUser32=GetModuleHandle("user32.dll");
  39.     m_lpfunUpdateLayeredWnd=(lpUpdateLayeredWindow)GetProcAddress(m_hInstUser32,"UpdateLayeredWindow");
  40. if(m_hInstUser32==NULL)
  41. {
  42. if(m_lpfunUpdateLayeredWnd==NULL)
  43. {
  44. AfxMessageBox("不能加载user32.dll或UpdateLayeredWindow()函数不存在!!");
  45.      delete this ;
  46. }
  47. }
  48. else
  49. {
  50. //创建分层窗口
  51. CPoint point(0,0);//初始话点对象
  52. SIZE   size;
  53. CRect  pWndToFaderRect;
  54. //得到对象窗口的矩形区域
  55.     m_pWndToFader->GetWindowRect(&pWndToFaderRect);
  56. //得到窗口的对象属性
  57.         size.cx=pWndToFaderRect.Width();
  58. size.cy=pWndToFaderRect.Height();
  59. point=pWndToFaderRect.TopLeft();
  60. //创建分层窗口的上层窗口
  61. //样式WS_EX_LAYERED必要要,是为了为UpdateLayeredWindow()函数的调用
  62. //WS_EX_TRANSPARENT allows mouse clicks through to the window "underneath",
  63. CreateEx(WS_EX_LAYERED|WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_TRANSPARENT,
  64. "STATIC","",WS_VISIBLE|WS_POPUP,pWndToFaderRect,AfxGetMainWnd(),0); 
  65. //创建BLENDFUNCTION结构体为UpdateLayeredWindow()所用
  66.         m_Blend.BlendOp=AC_SRC_OVER;  //唯一保留标志
  67. m_Blend.BlendFlags=0;
  68. m_Blend.SourceConstantAlpha=ALPHA; //定义初始时候的透明度
  69. m_Blend.AlphaFormat=0;
  70. //设计初始时候的分层窗口的透明度
  71.         m_lpfunUpdateLayeredWnd(GetSafeHwnd(),NULL,NULL,&size,::GetDC(m_pWndToFader->GetSafeHwnd()),&point,0,&m_Blend, 0x00000002);
  72. //设置渐隐窗口的时间器
  73. UINT nFaderTimeUnit=nFaderTime/(ALPHA/5);//定义单位时间间隔
  74. SetTimer(FaderWndTimer,nFaderTimeUnit,NULL);
  75. }
  76. }
  77. CFaderWnd::~CFaderWnd()
  78. {
  79. }
  80. BEGIN_MESSAGE_MAP(CFaderWnd, CWnd)
  81. //{{AFX_MSG_MAP(CFaderWnd)
  82. ON_WM_TIMER()
  83. //}}AFX_MSG_MAP
  84. END_MESSAGE_MAP()
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CFaderWnd message handlers
  87. void CFaderWnd::OnTimer(UINT nIDEvent) 
  88. {
  89. // TODO: Add your message handler code here and/or call default
  90. if(nIDEvent== FaderWndTimer)
  91. {
  92. //若是窗口的渐隐时间器的话
  93. if(m_Blend.SourceConstantAlpha>=5)
  94. {
  95. //透明度必须大于或等于5,否则的话透明度减少到负数时又从默认的值开始,达不到透明的效果
  96.          m_Blend.SourceConstantAlpha-=5; //逐渐减少透明度,渐渐趋向透明
  97.  //更新分层窗口的透明程度
  98.          m_lpfunUpdateLayeredWnd(GetSafeHwnd(),NULL,NULL,NULL,NULL,NULL,NULL,&m_Blend,  0x00000002);
  99. }
  100. else
  101. {
  102. KillTimer(FaderWndTimer);//销毁窗口时间器
  103. DestroyWindow();//销毁窗口
  104. }
  105. }
  106. // CWnd::OnTimer(nIDEvent);
  107. }