Monitors.cpp
上传用户:maidou0901
上传日期:2008-10-19
资源大小:68k
文件大小:4k
源码类别:

多显示器编程

开发平台:

Visual C++

  1. // Monitors.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Monitors.h"
  5. #include "MultiMonitor.h"
  6. // CMonitors
  7. CMonitors::CMonitors()
  8. {
  9. m_MonitorArray.SetSize( GetMonitorCount() );
  10. ADDMONITOR addMonitor;
  11. addMonitor.pMonitors = &m_MonitorArray;
  12. addMonitor.currentIndex = 0;
  13. ::EnumDisplayMonitors( NULL, NULL, AddMonitorsCallBack, (LPARAM)&addMonitor );
  14. }
  15. CMonitors::~CMonitors()
  16. {
  17. for ( int i = 0; i < m_MonitorArray.GetSize(); i++ )
  18. delete m_MonitorArray.GetAt( i );
  19. }
  20. // CMonitors member functions
  21. BOOL CALLBACK CMonitors::AddMonitorsCallBack( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData )
  22. {
  23. LPADDMONITOR pAddMonitor = (LPADDMONITOR)dwData;
  24. CMonitor* pMonitor = new CMonitor;
  25. pMonitor->Attach( hMonitor );
  26. pAddMonitor->pMonitors->SetAt( pAddMonitor->currentIndex, pMonitor );
  27. pAddMonitor->currentIndex++;
  28. return TRUE;
  29. }
  30. // returns the primary monitor
  31. CMonitor CMonitors::GetPrimaryMonitor()
  32. {
  33. //the primary monitor always has its origin at 0,0
  34. HMONITOR hMonitor = ::MonitorFromPoint( CPoint( 0,0 ), MONITOR_DEFAULTTOPRIMARY );
  35. ASSERT( IsMonitor( hMonitor ) );
  36. CMonitor monitor;
  37. monitor.Attach( hMonitor );
  38. ASSERT( monitor.IsPrimaryMonitor() );
  39. return monitor;
  40. }
  41. // is the given handle a valid monitor handle
  42. BOOL CMonitors::IsMonitor( const HMONITOR hMonitor )
  43. {
  44. if ( hMonitor == NULL )
  45. return FALSE;
  46. MATCHMONITOR match;
  47. match.target = hMonitor;
  48. match.foundMatch = FALSE;
  49. ::EnumDisplayMonitors( NULL, NULL, FindMatchingMonitorHandle, (LPARAM)&match );
  50. return match.foundMatch;
  51. }
  52. //this is the callback method that gets called via IsMontior
  53. BOOL CALLBACK CMonitors::FindMatchingMonitorHandle( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData )
  54. {
  55. LPMATCHMONITOR pMatch = (LPMATCHMONITOR)dwData;
  56. if ( hMonitor == pMatch->target )
  57. {
  58. //found a monitor with the same handle we are looking for
  59. pMatch->foundMatch = TRUE;
  60. return FALSE; //stop enumerating
  61. }
  62. //haven't found a match yet
  63. pMatch->foundMatch = FALSE;
  64. return TRUE; //keep enumerating
  65. }
  66. BOOL CMonitors::AllMonitorsShareDisplayFormat()
  67. {
  68. return ::GetSystemMetrics( SM_SAMEDISPLAYFORMAT );
  69. }
  70. //
  71. // the number of monitors on the system
  72. int CMonitors::GetMonitorCount()
  73. return ::GetSystemMetrics(SM_CMONITORS);
  74. }
  75. CMonitor CMonitors::GetMonitor( const int index ) const
  76. {
  77. #if _MFC_VER >= 0x0700
  78. ASSERT( index >= 0 && index < m_MonitorArray.GetCount() ); 
  79. #else
  80. ASSERT( index >= 0 && index < m_MonitorArray.GetSize() );
  81. #endif
  82. CMonitor* pMonitor = (CMonitor*)m_MonitorArray.GetAt( index );
  83. return *pMonitor;
  84. }
  85. //
  86. // returns the rectangle that is the union of all active monitors
  87. void CMonitors::GetVirtualDesktopRect( LPRECT lprc )
  88. {
  89. ::SetRect(  lprc, 
  90. ::GetSystemMetrics( SM_XVIRTUALSCREEN ),
  91. ::GetSystemMetrics( SM_YVIRTUALSCREEN ),
  92. ::GetSystemMetrics( SM_CXVIRTUALSCREEN ),
  93. ::GetSystemMetrics( SM_CYVIRTUALSCREEN )  );
  94. }
  95. //
  96. // these methods determine wheter the given item is
  97. // visible on any monitor
  98. BOOL CMonitors::IsOnScreen( const LPRECT lprc )
  99. {
  100. return ::MonitorFromRect( lprc, MONITOR_DEFAULTTONULL ) != NULL;
  101. }
  102. BOOL CMonitors::IsOnScreen( const POINT pt )
  103. {
  104. return ::MonitorFromPoint( pt, MONITOR_DEFAULTTONULL ) != NULL;
  105. }
  106. BOOL CMonitors::IsOnScreen( const CWnd* pWnd )
  107. {
  108. return ::MonitorFromWindow( pWnd->GetSafeHwnd(), MONITOR_DEFAULTTONULL ) != NULL;
  109. }
  110. CMonitor CMonitors::GetNearestMonitor( const LPRECT lprc )
  111. {
  112. CMonitor monitor;
  113. monitor.Attach( ::MonitorFromRect( lprc, MONITOR_DEFAULTTONEAREST ) );
  114. return monitor;
  115. }
  116. CMonitor CMonitors::GetNearestMonitor( const POINT pt )
  117. {
  118. CMonitor monitor;
  119. monitor.Attach( ::MonitorFromPoint( pt, MONITOR_DEFAULTTONEAREST ) );
  120. return monitor;
  121. }
  122. CMonitor CMonitors::GetNearestMonitor( const CWnd* pWnd )
  123. {
  124. ASSERT( pWnd );
  125. ASSERT( ::IsWindow( pWnd->m_hWnd ) );
  126. CMonitor monitor;
  127. monitor.Attach( ::MonitorFromWindow( pWnd->GetSafeHwnd(), MONITOR_DEFAULTTONEAREST ) );
  128. return monitor;
  129. }