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

多显示器编程

开发平台:

Visual C++

  1. // MonitorTestDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MonitorTest.h"
  5. #include "MonitorTestDlg.h"
  6. #include "Monitors.h"
  7. #include "MultiMonitor.h"
  8. #include "MonitorDC.h"
  9. #include ".monitortestdlg.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #endif
  13. // CMonitorTestDlg dialog
  14. //How to Exploit Multiple Monitor Support in Memphis and Windows NT 5.0
  15. //David Campbell
  16. //http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0697/monitor/monitor.htm&nav=/msj/0697/newnav.htm
  17. CMonitorTestDlg::CMonitorTestDlg(CWnd* pParent /*=NULL*/)
  18. : CDialog(CMonitorTestDlg::IDD, pParent)
  19. {
  20. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  21. }
  22. void CMonitorTestDlg::DoDataExchange(CDataExchange* pDX)
  23. {
  24. CDialog::DoDataExchange(pDX);
  25. }
  26. BEGIN_MESSAGE_MAP(CMonitorTestDlg, CDialog)
  27. ON_WM_PAINT()
  28. ON_WM_QUERYDRAGICON()
  29. //}}AFX_MSG_MAP
  30. ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
  31. ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
  32. ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)
  33. ON_WM_MOVE()
  34. ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)
  35. ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6)
  36. ON_BN_CLICKED(IDC_BUTTON_FLASH_ALL, OnBnClickedButtonFlashAll)
  37. ON_BN_CLICKED(IDC_BUTTON_CenterPrimary, OnBnClickedButtonCenterprimary)
  38. ON_BN_CLICKED(IDC_BUTTON_Other, OnBnClickedButtonOther)
  39. ON_BN_CLICKED(IDC_BUTTON_View, OnBnClickedButtonView)
  40. END_MESSAGE_MAP()
  41. // CMonitorTestDlg message handlers
  42. BOOL CMonitorTestDlg::OnInitDialog()
  43. {
  44. CDialog::OnInitDialog();
  45. // Set the icon for this dialog.  The framework does this automatically
  46. //  when the application's main window is not a dialog
  47. SetIcon(m_hIcon, TRUE); // Set big icon
  48. SetIcon(m_hIcon, FALSE); // Set small icon
  49. CString s;
  50. s.Format( "This machine has %d monitor(s) attached right now", CMonitors::GetMonitorCount() );
  51. GetDlgItem( IDC_STATIC_COUNT )->SetWindowText( s );
  52. return TRUE;  // return TRUE  unless you set the focus to a control
  53. }
  54. // If you add a minimize button to your dialog, you will need the code below
  55. //  to draw the icon.  For MFC applications using the document/view model,
  56. //  this is automatically done for you by the framework.
  57. void CMonitorTestDlg::OnPaint() 
  58. {
  59. if (IsIconic())
  60. {
  61. CPaintDC dc(this); // device context for painting
  62. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  63. // Center icon in client rectangle
  64. int cxIcon = GetSystemMetrics(SM_CXICON);
  65. int cyIcon = GetSystemMetrics(SM_CYICON);
  66. CRect rect;
  67. GetClientRect(&rect);
  68. int x = (rect.Width() - cxIcon + 1) / 2;
  69. int y = (rect.Height() - cyIcon + 1) / 2;
  70. // Draw the icon
  71. dc.DrawIcon(x, y, m_hIcon);
  72. }
  73. else
  74. {
  75. CDialog::OnPaint();
  76. }
  77. }
  78. void CMonitorTestDlg::OnMove(int x, int y)
  79. {
  80. CDialog::OnMove(x, y);
  81. CWnd* pWnd = GetDlgItem( IDC_BUTTON5 );
  82. if ( !pWnd )
  83. return;
  84. CRect rect;
  85. pWnd->GetWindowRect( &rect );
  86. GetDlgItem(IDC_STATIC_ONSCREEN)->SetWindowText( CMonitors::IsOnScreen( &rect ) ? "yes" : "no" );
  87. this->GetWindowRect(&rect);
  88. CString str;
  89. str.Format("%d,%d,%d,%d",rect.left,rect.top,rect.right,rect.bottom);
  90. GetDlgItem(IDC_STATIC_Rect)->SetWindowText(str);
  91. CMonitor monitor = CMonitors::GetNearestMonitor( this );
  92. GetDlgItem(IDC_STATIC_SAME_MONITOR)->SetWindowText( monitor.IsOnMonitor( &rect ) ? "yes" : "no" );
  93. CString s;
  94. monitor.GetName( s );
  95. GetDlgItem(IDC_STATIC_NAME)->SetWindowText( s );
  96. GetDlgItem(IDC_STATIC_PRIMARY)->SetWindowText( monitor.IsPrimaryMonitor() ? "yes" : "no" );
  97. s.Format( "%d", monitor.GetBitsPerPixel() );
  98. GetDlgItem(IDC_STATIC_BPP)->SetWindowText( s );
  99. }
  100. // The system calls this function to obtain the cursor to display while the user drags
  101. //  the minimized window.
  102. HCURSOR CMonitorTestDlg::OnQueryDragIcon()
  103. {
  104. return static_cast<HCURSOR>(m_hIcon);
  105. }
  106. //these methods all use the dialog window as the source
  107. //of the monitor handle - the same concepts apply using
  108. //points or rectangles
  109. void CMonitorTestDlg::OnBnClickedButton1()
  110. {
  111. CMonitor monitor = CMonitors::GetNearestMonitor( this );
  112. FlashMonitor( monitor );
  113. }
  114. void CMonitorTestDlg::OnBnClickedButton2()
  115. {
  116. CRect rect;
  117. CMonitors::GetVirtualDesktopRect( &rect );
  118. FlashRect( rect );
  119. }
  120. void CMonitorTestDlg::OnBnClickedButton3()
  121. {
  122. CMonitor monitor = CMonitors::GetNearestMonitor( this );
  123. FlashMonitor( monitor, true );
  124. }
  125. void CMonitorTestDlg::OnBnClickedButton4()
  126. {
  127. CMonitor monitor= CMonitors::GetNearestMonitor(this);
  128. monitor.CenterWindowToMonitor(this);
  129. }
  130. void CMonitorTestDlg::OnBnClickedButton6()
  131. {
  132. CMonitor monitor = CMonitors::GetPrimaryMonitor();
  133. FlashMonitor( monitor );
  134. }
  135. void CMonitorTestDlg::OnBnClickedButtonFlashAll()
  136. {
  137. CMonitor monitor;
  138. CMonitors monitors;
  139. for ( int i = 0; i < monitors.GetCount(); i++ )
  140. {
  141. monitor = monitors.GetMonitor( i );
  142. FlashMonitor( monitor );
  143. Sleep( 500 );
  144. }
  145. }
  146. void CMonitorTestDlg::FlashMonitor( CMonitor& monitor, bool WorkSpace )
  147. {
  148. CRect rect;
  149. if ( WorkSpace )
  150. //get the work area rect of the monitor this window is on
  151. monitor.GetWorkAreaRect( &rect );
  152. else
  153. monitor.GetMonitorRect( &rect );
  154. CMonitorDC dc( &monitor );
  155. dc.Rectangle( &rect );
  156. Sleep( 1000 );
  157. ::InvalidateRect( NULL, &rect, TRUE );
  158. }
  159. void CMonitorTestDlg::FlashRect(CRect& rect )
  160. {
  161. //paint the entire rect
  162. HDC hDC = ::GetDC( NULL );
  163. ::Rectangle( hDC, rect.left, rect.top, rect.right, rect.bottom );
  164. ::ReleaseDC( NULL, hDC );
  165. //pause briefly
  166. Sleep( 1000 );
  167.  
  168. //then redraw the rect
  169. ::InvalidateRect( NULL, &rect, TRUE );
  170. }
  171. void CMonitorTestDlg::OnBnClickedButtonCenterprimary()
  172. {
  173. //CMonitors monitors;
  174. //CMonitor monitor;
  175. //if(monitors.GetCount()>0)
  176. //monitor = monitors.GetMonitor(0);
  177. //CRect rt,rect;
  178. //monitor.GetWorkAreaRect(&rect);
  179. //this->GetWindowRect(&rt);
  180. }
  181. void CMonitorTestDlg::OnBnClickedButtonOther()
  182. {
  183. }
  184. void CMonitorTestDlg::OnBnClickedButtonView()
  185. {
  186. CMonitor monitor;
  187. CMonitors monitors;
  188. CString name;
  189. CString str;
  190. CRect rect,rt;
  191. for ( int i = 0; i < monitors.GetCount(); i++ )
  192. {
  193. monitor = monitors.GetMonitor( i );
  194. monitor.GetWorkAreaRect(&rect);
  195. monitor.GetMonitorRect(&rt);
  196. monitor.GetName(name);
  197. str.Format("显示器名称(%d):%sn%d,%d,%d,%d=WorkArean%d,%d,%d,%d=MonitorRect",
  198. i,name,
  199. rect.left,rect.top,rect.right,rect.bottom,
  200. rt.left,rt.top,rt.right,rt.bottom);
  201. ::AfxMessageBox(str);
  202. }
  203. }