From a536e411022b21280532c9daadc806a437fbb4c6 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Fri, 19 Jul 2002 20:42:34 +0000 Subject: [PATCH] Applied patch [ 573644 ] wxDisplay for Mac (again) Applied patch [ 573172 ] Implements wxDisplay for mac Applied patch [ 573356 ] wxDisplay for MSW Alterations: Put sample in regular samples, not contrib Removed multimon.h for copyright reasons git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16217 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/display.h | 81 ++++++++++ include/wx/mac/display.h | 40 +++++ include/wx/msw/display.h | 27 ++++ samples/multimon/multimon_test.cpp | 39 +++++ samples/multimon/multimon_test.dsp | 114 ++++++++++++++ samples/multimon/multimon_test.dsw | 29 ++++ src/mac/carbon/display.cpp | 135 +++++++++++++++++ src/mac/display.cpp | 135 +++++++++++++++++ src/msw/display.cpp | 232 +++++++++++++++++++++++++++++ 9 files changed, 832 insertions(+) create mode 100644 include/wx/display.h create mode 100644 include/wx/mac/display.h create mode 100644 include/wx/msw/display.h create mode 100644 samples/multimon/multimon_test.cpp create mode 100644 samples/multimon/multimon_test.dsp create mode 100644 samples/multimon/multimon_test.dsw create mode 100644 src/mac/carbon/display.cpp create mode 100644 src/mac/display.cpp create mode 100644 src/msw/display.cpp diff --git a/include/wx/display.h b/include/wx/display.h new file mode 100644 index 0000000000..e62be18768 --- /dev/null +++ b/include/wx/display.h @@ -0,0 +1,81 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: display.h +// Purpose: wxDisplay class +// Author: Royce Mitchell III +// Modified by: +// Created: 06/21/02 +// RCS-ID: $Id$ +// Copyright: (c) wxWindows team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DISPLAY_H_BASE_ +#define _WX_DISPLAY_H_BASE_ + +#if wxUSE_DISPLAY + +#ifdef __GNUG__ + #pragma interface "display.h" +#endif + +class wxPoint; +class wxRect; +class wxString; + +class WXDLLEXPORT wxDisplayBase +{ +public: + // initialize the object containing all information about the given + // display + wxDisplayBase ( size_t index = 0 ) : m_index ( index ) + { + wxASSERT_MSG(m_index < wxDisplayBase::GetCount(), wxT("An invalid index was passed to wxDisplay")); + } + + // accessors + + // return the number of available displays, valid parameters to + // wxDisplay ctor are from 0 up to this number + static size_t GetCount(); + + // find the display where the given point lies, return -1 if + // it doesn't belong to any display + static int GetFromPoint ( const wxPoint& pt ); + + virtual wxRect GetGeometry() const = 0; + virtual int GetDepth() const = 0; + bool IsColour() const { return GetDepth() != 1; } + + // some people never learn to spell ;-) + bool IsColor() const { return IsColour(); } + + // name may be empty + virtual wxString GetName() const = 0; + + // let display 0 always be the primary display + bool IsPrimary() { return m_index == 0; } + + + virtual ~wxDisplayBase() {} + +protected: + size_t m_index; // which display did we select when creating this file? + + DECLARE_NO_COPY_CLASS(wxDisplayBase); +}; + +#if defined(__WXMSW__) + #include "wx/msw/display.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/display.h" +#elif defined(__WXGTK__) + #include "wx/gtk/display.h" +#elif defined(__WXMAC__) + #include "wx/mac/display.h" +#elif defined(__WXPM__) + #include "wx/os2/display.h" +#endif + +#endif // wxUSE_DISPLAY + +#endif // _WX_DISPLAY_H_BASE_ diff --git a/include/wx/mac/display.h b/include/wx/mac/display.h new file mode 100644 index 0000000000..b06a7d7173 --- /dev/null +++ b/include/wx/mac/display.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: display.h +// Purpose: wxDisplay class customization for Mac +// Author: Brian Victor +// Modified by: Royce Mitchell III +// Created: 06/21/02 +// RCS-ID: $Id$ +// Copyright: (c) wxWindows team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MAC_DISPLAY_H_ +#define _WX_MAC_DISPLAY_H_ + +#include "wx/object.h" +#include "wx/display.h" + +class wxDisplayMacPriv; +class wxRect; +class wxString; + +class WXDLLEXPORT wxDisplay : public wxDisplayBase +{ +public: + wxDisplay ( size_t index = 0 ); + + virtual wxRect GetGeometry() const; + virtual int GetDepth() const; + virtual wxString GetName() const; + + + ~wxDisplay(); + +private: + wxDisplayMacPriv* m_priv; + + DECLARE_NO_COPY_CLASS(wxDisplay); +}; + +#endif // _WX_MAC_DISPLAY_H_ diff --git a/include/wx/msw/display.h b/include/wx/msw/display.h new file mode 100644 index 0000000000..766e4e3401 --- /dev/null +++ b/include/wx/msw/display.h @@ -0,0 +1,27 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: display.h +// Purpose: wxDisplay class customization for WXMSW +// Author: Royce Mitchell III +// Modified by: +// Created: 06/21/02 +// RCS-ID: $Id$ +// Copyright: (c) wxWindows team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_DISPLAY_H_ +#define _WX_MSW_DISPLAY_H_ + +class WXDLLEXPORT wxDisplay : public wxDisplayBase +{ +public: + wxDisplay ( size_t index = 0 ); + + virtual wxRect GetGeometry() const; + virtual int GetDepth() const; + virtual wxString GetName() const; + + DECLARE_NO_COPY_CLASS(wxDisplay); +}; + +#endif // _WX_MSW_DISPLAY_H_ diff --git a/samples/multimon/multimon_test.cpp b/samples/multimon/multimon_test.cpp new file mode 100644 index 0000000000..6d51f3cf88 --- /dev/null +++ b/samples/multimon/multimon_test.cpp @@ -0,0 +1,39 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: multimon_test.cpp +// Purpose: tests wxDisplay class +// Author: Royce Mitchell III +// Modified by: +// Created: 06/21/02 +// RCS-ID: $Id$ +// Copyright: (c) wxWindows team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include +#define wxUSE_DISPLAY 1 +#include + +class TestApp : public wxApp +{ + bool OnInit(); +}; + +DECLARE_APP(TestApp) +IMPLEMENT_APP(TestApp) + +bool TestApp::OnInit() +{ + size_t count = wxDisplay::GetCount(); + wxLogDebug ( "I detected %i display(s) on your system", count ); + size_t i = 0; + while ( i < count ) + { + wxDisplay display ( i ); + wxRect r = display.GetGeometry(); + wxLogDebug ( "Display #%i \"%s\" = ( %i, %i, %i, %i ) @ %i bits", + i, display.GetName().c_str(), r.GetLeft(), r.GetTop(), r.GetWidth(), r.GetHeight(), + display.GetDepth() ); + i++; + } + return FALSE; +} diff --git a/samples/multimon/multimon_test.dsp b/samples/multimon/multimon_test.dsp new file mode 100644 index 0000000000..e735a538ab --- /dev/null +++ b/samples/multimon/multimon_test.dsp @@ -0,0 +1,114 @@ +# Microsoft Developer Studio Project File - Name="multimon_test" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=multimon_test - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "multimon_test.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "multimon_test.mak" CFG="multimon_test - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "multimon_test - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "multimon_test - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "multimon_test - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "multimon_test - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "multimon_test___Win32_Debug" +# PROP BASE Intermediate_Dir "multimon_test___Win32_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_WIN32" /D "DEBUG" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "__WIN95__" /D "__WIN32__" /D "__WXMSW__" /D "__WINDOWS__" /D "__WXDEBUG__" /D WXUSINGDLL=1 /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wx22_9d.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "multimon_test - Win32 Release" +# Name "multimon_test - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\multimon_test.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\..\include\wx\display.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\wx\msw\display.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/samples/multimon/multimon_test.dsw b/samples/multimon/multimon_test.dsw new file mode 100644 index 0000000000..2b477f0659 --- /dev/null +++ b/samples/multimon/multimon_test.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "multimon_test"=.\multimon_test.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/src/mac/carbon/display.cpp b/src/mac/carbon/display.cpp new file mode 100644 index 0000000000..e25b2486e3 --- /dev/null +++ b/src/mac/carbon/display.cpp @@ -0,0 +1,135 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: display.cpp +// Purpose: Mac implementation of wxDisplay class +// Author: Brian Victor +// Modified by: Royce Mitchell III +// Created: 06/21/02 +// RCS-ID: $Id$ +// Copyright: (c) wxWindows team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ + #pragma implementation "display.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DISPLAY + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" +#endif + +#ifdef __DARWIN__ + #include +#else + #include + #include +#endif + +#include "wx/display.h" +#include "wx/gdicmn.h" +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +class wxDisplayMacPriv +{ +public: + GDHandle m_hndl; +}; + +size_t wxDisplayBase::GetCount() +{ + GDHandle hndl; + size_t num = 0; + hndl = DMGetFirstScreenDevice(true); + while(hndl) + { + num++; + hndl = DMGetNextScreenDevice(hndl, true); + } + return num; +} + +int wxDisplayBase::GetFromPoint(const wxPoint &p) +{ + GDHandle hndl; + size_t num = 0; + hndl = DMGetFirstScreenDevice(true); + while(hndl) + { + Rect screenrect = (*hndl)->gdRect; + if (p.x >= screenrect.left && + p.x <= screenrect.right && + p.y >= screenrect.top && + p.y <= screenrect.bottom) + { + return num; + } + num++; + hndl = DMGetNextScreenDevice(hndl, true); + } + return -1; +} + +wxDisplay::wxDisplay(size_t index) : wxDisplayBase ( index ), + m_priv ( new wxDisplayMacPriv() ) +{ + GDHandle hndl; + hndl = DMGetFirstScreenDevice(true); + m_priv->m_hndl = NULL; + while(hndl) + { + if (index == 0) + { + m_priv->m_hndl = hndl; + } + index--; + hndl = DMGetNextScreenDevice(hndl, true); + } +} + +wxRect wxDisplay::GetGeometry() const +{ + if (!(m_priv)) return wxRect(0, 0, 0, 0); + if (!(m_priv->m_hndl)) return wxRect(0, 0, 0, 0); + Rect screenrect = (*(m_priv->m_hndl))->gdRect; + return wxRect( screenrect.left, screenrect.top, + screenrect.right - screenrect.left, screenrect.bottom - screenrect.top); +} + +int wxDisplay::GetDepth() const +{ + if (!(m_priv)) return 0; + if (!(m_priv->m_hndl)) return 0; + + // This cryptic looking code is based on Apple's sample code: + // http://developer.apple.com/samplecode/Sample_Code/Graphics_2D/GDevVideo/Gen.cp.htm + return ((*(*(m_priv->m_hndl))->gdPMap)->pixelSize) & 0x0000FFFF; +} + +wxString wxDisplay::GetName() const +{ + // Macs don't name their displays... + return wxT(""); +} + +wxDisplay::~wxDisplay() +{ + if ( m_priv ) + { + delete m_priv; + m_priv = 0; + } +} + +#endif // wxUSE_DISPLAY diff --git a/src/mac/display.cpp b/src/mac/display.cpp new file mode 100644 index 0000000000..e25b2486e3 --- /dev/null +++ b/src/mac/display.cpp @@ -0,0 +1,135 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: display.cpp +// Purpose: Mac implementation of wxDisplay class +// Author: Brian Victor +// Modified by: Royce Mitchell III +// Created: 06/21/02 +// RCS-ID: $Id$ +// Copyright: (c) wxWindows team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ + #pragma implementation "display.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DISPLAY + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" +#endif + +#ifdef __DARWIN__ + #include +#else + #include + #include +#endif + +#include "wx/display.h" +#include "wx/gdicmn.h" +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +class wxDisplayMacPriv +{ +public: + GDHandle m_hndl; +}; + +size_t wxDisplayBase::GetCount() +{ + GDHandle hndl; + size_t num = 0; + hndl = DMGetFirstScreenDevice(true); + while(hndl) + { + num++; + hndl = DMGetNextScreenDevice(hndl, true); + } + return num; +} + +int wxDisplayBase::GetFromPoint(const wxPoint &p) +{ + GDHandle hndl; + size_t num = 0; + hndl = DMGetFirstScreenDevice(true); + while(hndl) + { + Rect screenrect = (*hndl)->gdRect; + if (p.x >= screenrect.left && + p.x <= screenrect.right && + p.y >= screenrect.top && + p.y <= screenrect.bottom) + { + return num; + } + num++; + hndl = DMGetNextScreenDevice(hndl, true); + } + return -1; +} + +wxDisplay::wxDisplay(size_t index) : wxDisplayBase ( index ), + m_priv ( new wxDisplayMacPriv() ) +{ + GDHandle hndl; + hndl = DMGetFirstScreenDevice(true); + m_priv->m_hndl = NULL; + while(hndl) + { + if (index == 0) + { + m_priv->m_hndl = hndl; + } + index--; + hndl = DMGetNextScreenDevice(hndl, true); + } +} + +wxRect wxDisplay::GetGeometry() const +{ + if (!(m_priv)) return wxRect(0, 0, 0, 0); + if (!(m_priv->m_hndl)) return wxRect(0, 0, 0, 0); + Rect screenrect = (*(m_priv->m_hndl))->gdRect; + return wxRect( screenrect.left, screenrect.top, + screenrect.right - screenrect.left, screenrect.bottom - screenrect.top); +} + +int wxDisplay::GetDepth() const +{ + if (!(m_priv)) return 0; + if (!(m_priv->m_hndl)) return 0; + + // This cryptic looking code is based on Apple's sample code: + // http://developer.apple.com/samplecode/Sample_Code/Graphics_2D/GDevVideo/Gen.cp.htm + return ((*(*(m_priv->m_hndl))->gdPMap)->pixelSize) & 0x0000FFFF; +} + +wxString wxDisplay::GetName() const +{ + // Macs don't name their displays... + return wxT(""); +} + +wxDisplay::~wxDisplay() +{ + if ( m_priv ) + { + delete m_priv; + m_priv = 0; + } +} + +#endif // wxUSE_DISPLAY diff --git a/src/msw/display.cpp b/src/msw/display.cpp new file mode 100644 index 0000000000..cd5548c708 --- /dev/null +++ b/src/msw/display.cpp @@ -0,0 +1,232 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: display.cpp +// Purpose: MSW Implementation of wxDisplay class +// Author: Royce Mitchell III +// Modified by: +// Created: 06/21/02 +// RCS-ID: $Id$ +// Copyright: (c) wxWindows team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// =========================================================================== +// declarations +// =========================================================================== + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +#ifdef __GNUG__ + #pragma implementation "display.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DISPLAY + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" +#endif + +#include "wx/display.h" + +// the following define is necessary to access the multi-monitor function +// declarations in a manner safe to use w/ Windows 95 +// JACS: not used for now until we're clear about the legality +// of distributing multimon.h. Meanwhile you can download the file +// yourself from: +// http://www.microsoft.com/msj/0697/monitor/monitortextfigs.htm#fig4 + +#if 0 +#define COMPILE_MULTIMON_STUBS +#include "wx/msw/multimon.h" +#endif + +// --------------------------------------------------------------------------- +// constants +// --------------------------------------------------------------------------- + +// --------------------------------------------------------------------------- +// private functions +// --------------------------------------------------------------------------- + +void wxmswInitDisplayRectArray(); + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +class wxmswDisplayInfo; + +WX_DECLARE_OBJARRAY(wxmswDisplayInfo, wxmswDisplayInfoArray); + +class wxmswDisplayInfo +{ +public: + HMONITOR m_hmon; + DISPLAY_DEVICE m_dd; + wxRect m_rect; + int m_depth; +}; + +wxmswDisplayInfoArray* g_wxmswDisplayInfoArray = 0; + +#include // this is a magic incantation which must be done! +WX_DEFINE_OBJARRAY(wxmswDisplayInfoArray); + +// =========================================================================== +// implementation +// =========================================================================== + +BOOL CALLBACK wxmswMonitorEnumProc ( + HMONITOR hMonitor, // handle to display monitor + HDC hdcMonitor, // handle to monitor-appropriate device context + LPRECT lprcMonitor, // pointer to monitor intersection rectangle + LPARAM dwData // data passed from EnumDisplayMonitors +) +{ + wxmswDisplayInfo* info = new wxmswDisplayInfo(); + info->m_hmon = hMonitor; + info->m_rect.SetX ( lprcMonitor->left ); + info->m_rect.SetY ( lprcMonitor->top ); + info->m_rect.SetWidth ( lprcMonitor->right - lprcMonitor->left ); + info->m_rect.SetHeight ( lprcMonitor->bottom - lprcMonitor->top ); + // now add this monitor to the array + g_wxmswDisplayInfoArray->Add ( info ); + + return TRUE; // continue the enumeration +} + +class wxmswDisplayModule : public wxModule +{ + DECLARE_DYNAMIC_CLASS(wxmswDisplayModule) +public: + wxmswDisplayModule() {} + bool OnInit(); + void OnExit(); +}; + +IMPLEMENT_DYNAMIC_CLASS(wxmswDisplayModule, wxModule) + +bool wxmswDisplayModule::OnInit() +{ + g_wxmswDisplayInfoArray = new wxmswDisplayInfoArray(); + if ( !g_wxmswDisplayInfoArray ) + { + wxFAIL_MSG(wxT("Couldn't allocate array for display information")); + return FALSE; + } + + // Royce3: I'm assuming that the monitor's are enumerated in the same + // order as the calls to EnumDisplayDevices below. We shall soon see + // if that assumption is correct. + if ( !EnumDisplayMonitors ( NULL, NULL, wxmswMonitorEnumProc, 0 ) ) + wxLogLastError(wxT("EnumDisplayMonitors")); + + size_t iDevNum = 0, count = g_wxmswDisplayInfoArray->Count(); + while ( iDevNum < count ) + { + wxmswDisplayInfo& info = (*g_wxmswDisplayInfoArray)[iDevNum]; + + // MSDN: Before calling EnumDisplayDevices, you must initialize the cb + // member of DISPLAY_DEVICE to the size, in bytes, of DISPLAY_DEVICE + info.m_dd.cb = sizeof(info.m_dd); + + if ( !EnumDisplayDevices ( NULL, iDevNum, &info.m_dd, 0 ) ) + wxLogLastError(wxT("EnumDisplayDevices")); + + // get this display's Depth + DEVMODE devmode; + memset ( &devmode, 0, sizeof(devmode) ); + + // MSDN: Before calling EnumDisplaySettings, set the dmSize member to + // sizeof(DEVMODE), and set the dmDriverExtra member to indicate the size, + // in bytes, of the additional space available to receive private + // driver-data. + devmode.dmSize = sizeof(devmode); + devmode.dmDriverExtra = 0; + + if ( !EnumDisplaySettings ( info.m_dd.DeviceName, ENUM_CURRENT_SETTINGS, &devmode ) ) + { + wxLogLastError(wxT("EnumDisplaySettings")); + devmode.dmFields = 0; + } + + if ( !(devmode.dmFields&DM_BITSPERPEL) ) + info.m_depth = -1; + else + info.m_depth = devmode.dmBitsPerPel; + + + iDevNum++; + } + return TRUE; +} + +void wxmswDisplayModule::OnExit() +{ + size_t count = g_wxmswDisplayInfoArray->Count(); + while ( count-- ) + { + wxmswDisplayInfo* info = g_wxmswDisplayInfoArray->Detach ( count ); + delete info; + } + delete g_wxmswDisplayInfoArray; + g_wxmswDisplayInfoArray = 0; +} + +// --------------------------------------------------------------------------- +// wxDisplay +// --------------------------------------------------------------------------- + +size_t wxDisplayBase::GetCount() +{ + return GetSystemMetrics ( SM_CMONITORS ); +} + +int wxDisplayBase::GetFromPoint ( const wxPoint& pt ) +{ + POINT pt2; + pt2.x = pt.x; + pt2.y = pt.y; + + HMONITOR hmon = MonitorFromPoint ( pt2, 0 ); + if ( !hmon ) + return -1; + size_t count = wxDisplayBase::GetCount(), index; + + for ( index = 0; index < count; index++ ) + { + if ( hmon == (*g_wxmswDisplayInfoArray)[index].m_hmon ) + return index; + } + + return -1; +} + +wxDisplay::wxDisplay ( size_t index ) : wxDisplayBase ( index ) +{ +} + +wxRect wxDisplay::GetGeometry() const +{ + return (*g_wxmswDisplayInfoArray)[m_index].m_rect; +} + +int wxDisplay::GetDepth() const +{ + return (*g_wxmswDisplayInfoArray)[m_index].m_depth; +} + +wxString wxDisplay::GetName() const +{ + return wxString ( (*g_wxmswDisplayInfoArray)[m_index].m_dd.DeviceName ); +} + +#endif//wxUSE_DISPLAY -- 2.45.2