SaverWindow.cpp
上传用户:qdhuadeli
上传日期:2007-02-07
资源大小:978k
文件大小:5k
源码类别:

多显示器编程

开发平台:

Visual C++

  1. // SaverWindow.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "multiscreen.h"
  5. #include "SaverWindow.h"
  6. #include "multimon.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CSaverWindow
  14. CSaverWindow::CSaverWindow()
  15. {
  16. }
  17. CSaverWindow::~CSaverWindow()
  18. {
  19. }
  20. BEGIN_MESSAGE_MAP(CSaverWindow, CWnd)
  21. //{{AFX_MSG_MAP(CSaverWindow)
  22. ON_WM_CREATE()
  23. ON_WM_PAINT()
  24. //}}AFX_MSG_MAP
  25. END_MESSAGE_MAP()
  26. // Following Code taken from Ben Bryant's Smoov Saver. A great saver!
  27. BOOL CSaverWindow::Create( HWND hwndParent )
  28. {
  29.     // Register a class with no cursor.
  30.     const char* pszClassName 
  31.         = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_SAVEBITS|CS_DBLCLKS,NULL);
  32. #ifdef _DEBUG
  33. DWORD dwExStyle = 0;
  34. #else
  35. DWORD dwExStyle = WS_EX_TOPMOST;
  36. #endif
  37. DWORD dwStyle = WS_POPUP | WS_VISIBLE;
  38. m_bPreview = FALSE;
  39. if ( hwndParent )
  40. {
  41. // Get dimensions of preview window
  42. ::GetClientRect( hwndParent, &rect );
  43. dwExStyle = 0;
  44. dwStyle = WS_CHILD | WS_VISIBLE;
  45. m_bPreview = TRUE;
  46. }
  47. else
  48. {
  49. rect.left = ::GetSystemMetrics( SM_XVIRTUALSCREEN );
  50. rect.top = ::GetSystemMetrics( SM_YVIRTUALSCREEN );
  51. rect.right = rect.left + ::GetSystemMetrics( SM_CXVIRTUALSCREEN );
  52. rect.bottom = rect.top + ::GetSystemMetrics( SM_CYVIRTUALSCREEN );
  53. }
  54.     return CWnd::CreateEx( dwExStyle, pszClassName, "", dwStyle,
  55. rect.left, rect.top, rect.Width(), rect.Height(), hwndParent, NULL );
  56. }
  57. LRESULT CSaverWindow::WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
  58. {
  59. static int i = 0;
  60. static PAINTSTRUCT ps = {NULL};
  61. static HDC hDC = NULL;
  62. static HBRUSH hBrush = NULL;
  63. static UINT uTimer = 0;
  64. static int xpos, ypos;
  65. static RECT rc;
  66.     static BOOL bHere = FALSE;
  67.     static POINT ptLast;
  68.     POINT ptCursor, ptCheck;
  69. CRect rectWnd;
  70.     switch ( nMsg )
  71. {
  72.     case WM_SYSCOMMAND:
  73.         if ( (wParam == SC_SCREENSAVE) || (wParam == SC_CLOSE) )
  74.             return FALSE;
  75.         break;
  76.     case WM_ERASEBKGND:
  77. GetClientRect(&rectWnd);
  78. FillRect( (HDC)wParam, &rectWnd, m_hBackgroundBrush );
  79. break;
  80.     case WM_SETCURSOR:
  81. if ( ! m_bPreview )
  82.         SetCursor( NULL );
  83.         break;
  84.     case WM_NCACTIVATE:
  85. if ( ! m_bPreview )
  86. if ( wParam == FALSE )
  87. return FALSE;
  88.         break;
  89.     case WM_ACTIVATE:
  90.     case WM_ACTIVATEAPP:
  91. if ( m_bPreview )
  92. break;
  93.         if ( wParam != FALSE )
  94. break;
  95.         // Only fall through if we are losing the focus...
  96.     case WM_MOUSEMOVE:
  97. if ( m_bPreview )
  98. break;
  99. if( ! bHere )
  100. {
  101. GetCursorPos( &ptLast );
  102. bHere = TRUE;
  103. }
  104. else
  105. {
  106. GetCursorPos( &ptCheck );
  107. ptCursor.x = ptCheck.x - ptLast.x;
  108. ptCursor.y = ptCheck.y - ptLast.y;
  109. if ( ptCursor.x < 0 )
  110. ptCursor.x *= -1;
  111. if ( ptCursor.y < 0 )
  112. ptCursor.y *= -1;
  113. if ( (ptCursor.x + ptCursor.y) > 5 )
  114. PostMessage( WM_CLOSE, 0, 0 );
  115. }
  116.         break;
  117.     case WM_RBUTTONDOWN:
  118.     case WM_LBUTTONDOWN:
  119.     case WM_MBUTTONDOWN:
  120. if ( m_bPreview )
  121. break;
  122.         GetCursorPos( &ptCursor );
  123.         ptCursor.x ++;
  124.         ptCursor.y ++;
  125.         SetCursorPos( ptCursor.x, ptCursor.y );
  126.         GetCursorPos( &ptCheck );
  127.         if ( ptCheck.x != ptCursor.x && ptCheck.y != ptCursor.y )
  128.         ptCursor.x -= 2;
  129.         ptCursor.y -= 2;
  130.         SetCursorPos( ptCursor.x, ptCursor.y );
  131.     case WM_KEYDOWN:
  132.     case WM_SYSKEYDOWN:
  133. if ( m_bPreview )
  134. break;
  135.         PostMessage(WM_CLOSE, 0, 0l);
  136.         break;
  137.     }
  138.     return CWnd::WindowProc(nMsg, wParam, lParam);
  139. }
  140. ///////////////////Back to my own work//////////////////////
  141. ///////
  142. int CSaverWindow::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  143. {
  144. if (CWnd::OnCreate(lpCreateStruct) == -1)
  145. return -1;
  146. m_hBackgroundBrush = CreateSolidBrush(RGB(20, 23, 126));
  147. GetClientRect( &m_rect );
  148. // m_ae.SetScreen( m_rect );
  149. return 0;
  150. }
  151. void CSaverWindow::OnPaint() 
  152. {
  153. CPaintDC dc(this); // device context for painting
  154. CPoint myPoint;
  155. myPoint = rect.CenterPoint();
  156. // TODO: Add your message handler code here
  157. CDC* pDC = GetDC();
  158. CSaverWindow scrWnd;
  159. CRect textRect;
  160. //textRect.CenterPoint() = rect.CenterPoint();
  161. textRect.top = (rect.top);
  162. textRect.left = (rect.left);
  163. pDC->DrawIcon(myPoint,AfxGetApp()->LoadStandardIcon(IDI_QUESTION));
  164. pDC->DrawText("This will show on all monitors!",textRect,NULL);
  165. // Do not call CWnd::OnPaint() for painting messages
  166. }