/* * $Id$ * * Author: Donald Kackman * Email: don@itsEngineering.com * Copyright 2002, Donald Kackman * * This file is part of mplayerc. * * Mplayerc is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Mplayerc is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "stdafx.h" #include "Monitors.h" // CMonitors CMonitors::CMonitors() { // WARNING : GetSystemMetrics(SM_CMONITORS) return only visible display monitors, and EnumDisplayMonitors // enumerate visible and pseudo invisible monitors !!! // m_MonitorArray.SetSize( GetMonitorCount() ); ADDMONITOR addMonitor; addMonitor.pMonitors = &m_MonitorArray; addMonitor.currentIndex = 0; ::EnumDisplayMonitors( NULL, NULL, AddMonitorsCallBack, (LPARAM)&addMonitor ); } CMonitors::~CMonitors() { for ( int i = 0; i < m_MonitorArray.GetSize(); i++ ) delete m_MonitorArray.GetAt( i ); } // CMonitors member functions BOOL CALLBACK CMonitors::AddMonitorsCallBack( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ) { LPADDMONITOR pAddMonitor = (LPADDMONITOR)dwData; CMonitor* pMonitor = DNew CMonitor; pMonitor->Attach( hMonitor ); pAddMonitor->pMonitors->Add( pMonitor ); pAddMonitor->currentIndex++; return TRUE; } // // returns the primary monitor CMonitor CMonitors::GetPrimaryMonitor() { //the primary monitor always has its origin at 0,0 HMONITOR hMonitor = ::MonitorFromPoint( CPoint( 0,0 ), MONITOR_DEFAULTTOPRIMARY ); ASSERT( IsMonitor( hMonitor ) ); CMonitor monitor; monitor.Attach( hMonitor ); ASSERT( monitor.IsPrimaryMonitor() ); return monitor; } // // is the given handle a valid monitor handle BOOL CMonitors::IsMonitor( const HMONITOR hMonitor ) { if ( hMonitor == NULL ) return FALSE; MATCHMONITOR match; match.target = hMonitor; match.foundMatch = FALSE; ::EnumDisplayMonitors( NULL, NULL, FindMatchingMonitorHandle, (LPARAM)&match ); return match.foundMatch; } //this is the callback method that gets called via IsMontior BOOL CALLBACK CMonitors::FindMatchingMonitorHandle( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ) { LPMATCHMONITOR pMatch = (LPMATCHMONITOR)dwData; if ( hMonitor == pMatch->target ) { //found a monitor with the same handle we are looking for pMatch->foundMatch = TRUE; return FALSE; //stop enumerating } //haven't found a match yet pMatch->foundMatch = FALSE; return TRUE; //keep enumerating } BOOL CMonitors::AllMonitorsShareDisplayFormat() { return ::GetSystemMetrics( SM_SAMEDISPLAYFORMAT ); } // // the number of monitors on the system int CMonitors::GetMonitorCount() { return ::GetSystemMetrics(SM_CMONITORS); } CMonitor CMonitors::GetMonitor( const int index ) const { #if _MFC_VER >= 0x0700 ASSERT( index >= 0 && index < m_MonitorArray.GetCount() ); #else ASSERT( index >= 0 && index < m_MonitorArray.GetSize() ); #endif CMonitor* pMonitor = static_cast(m_MonitorArray.GetAt( index )); return *pMonitor; } // // returns the rectangle that is the union of all active monitors void CMonitors::GetVirtualDesktopRect( LPRECT lprc ) { ::SetRect( lprc, ::GetSystemMetrics( SM_XVIRTUALSCREEN ), ::GetSystemMetrics( SM_YVIRTUALSCREEN ), ::GetSystemMetrics( SM_CXVIRTUALSCREEN ), ::GetSystemMetrics( SM_CYVIRTUALSCREEN ) ); } // // these methods determine wheter the given item is // visible on any monitor BOOL CMonitors::IsOnScreen( const LPRECT lprc ) { return ::MonitorFromRect( lprc, MONITOR_DEFAULTTONULL ) != NULL; } BOOL CMonitors::IsOnScreen( const POINT pt ) { return ::MonitorFromPoint( pt, MONITOR_DEFAULTTONULL ) != NULL; } BOOL CMonitors::IsOnScreen( const CWnd* pWnd ) { return ::MonitorFromWindow( pWnd->GetSafeHwnd(), MONITOR_DEFAULTTONULL ) != NULL; } CMonitor CMonitors::GetNearestMonitor( const LPRECT lprc ) { CMonitor monitor; monitor.Attach( ::MonitorFromRect( lprc, MONITOR_DEFAULTTONEAREST ) ); return monitor; } CMonitor CMonitors::GetNearestMonitor( const POINT pt ) { CMonitor monitor; monitor.Attach( ::MonitorFromPoint( pt, MONITOR_DEFAULTTONEAREST ) ); return monitor; } CMonitor CMonitors::GetNearestMonitor( const CWnd* pWnd ) { ASSERT( pWnd ); ASSERT( ::IsWindow( pWnd->m_hWnd ) ); CMonitor monitor; monitor.Attach( ::MonitorFromWindow( pWnd->GetSafeHwnd(), MONITOR_DEFAULTTONEAREST ) ); return monitor; }