📄 display.cpp
字号:
/////////////////////////////////////////////////////////////////////////////// Name: src/mac/carbon/display.cpp// Purpose: Mac implementation of wxDisplay class// Author: Ryan Norton & Brian Victor// Modified by: Royce Mitchell III, Vadim Zeitlin// Created: 06/21/02// RCS-ID: $Id: display.cpp,v 1.22 2006/10/02 05:38:00 PC Exp $// Copyright: (c) wxWidgets team// Licence: wxWindows licence/////////////////////////////////////////////////////////////////////////////// ============================================================================// declarations// ============================================================================// ----------------------------------------------------------------------------// headers// ----------------------------------------------------------------------------#include "wx/wxprec.h"#ifdef __BORLANDC__ #pragma hdrstop#endif#if wxUSE_DISPLAY#include "wx/display.h"#ifndef WX_PRECOMP #include "wx/dynarray.h" #include "wx/log.h" #include "wx/string.h" #include "wx/gdicmn.h"#endif#ifdef __DARWIN__ #include <Carbon/Carbon.h>#else #include <Gestalt.h> #include <Displays.h> #include <Quickdraw.h> #include <Video.h> // for VDSwitchInfoRec #include <FixMath.h> #include <Debugging.h>#endif#include "wx/display_impl.h"// ----------------------------------------------------------------------------// display classes implementation// ----------------------------------------------------------------------------#ifdef __WXMAC_OSX__class wxDisplayImplMacOSX : public wxDisplayImpl{public: wxDisplayImplMacOSX(unsigned n, CGDirectDisplayID id) : wxDisplayImpl(n), m_id(id) { } virtual wxRect GetGeometry() const; virtual wxString GetName() const { return wxString(); } virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const; virtual wxVideoMode GetCurrentMode() const; virtual bool ChangeMode(const wxVideoMode& mode);private: CGDirectDisplayID m_id; DECLARE_NO_COPY_CLASS(wxDisplayImplMacOSX)};class wxDisplayFactoryMacOSX : public wxDisplayFactory{public: wxDisplayFactoryMacOSX() {} virtual wxDisplayImpl *CreateDisplay(unsigned n); virtual unsigned GetCount(); virtual int GetFromPoint(const wxPoint& pt);protected: DECLARE_NO_COPY_CLASS(wxDisplayFactoryMacOSX)};// ============================================================================// wxDisplayFactoryMacOSX implementation// ============================================================================unsigned wxDisplayFactoryMacOSX::GetCount(){ CGDisplayCount count;#ifdef __WXDEBUG__ CGDisplayErr err =#endif CGGetActiveDisplayList(0, NULL, &count); wxASSERT(err == CGDisplayNoErr); return count;}int wxDisplayFactoryMacOSX::GetFromPoint(const wxPoint& p){ CGPoint thePoint = {(float)p.x, (float)p.y}; CGDirectDisplayID theID; CGDisplayCount theCount; CGDisplayErr err = CGGetDisplaysWithPoint(thePoint, 1, &theID, &theCount); wxASSERT(err == CGDisplayNoErr); int nWhich = wxNOT_FOUND; if (theCount) { theCount = GetCount(); CGDirectDisplayID* theIDs = new CGDirectDisplayID[theCount]; err = CGGetActiveDisplayList(theCount, theIDs, &theCount); wxASSERT(err == CGDisplayNoErr); for (nWhich = 0; nWhich < (int) theCount; ++nWhich) { if (theIDs[nWhich] == theID) break; } delete [] theIDs; if (nWhich == (int) theCount) { wxFAIL_MSG(wxT("Failed to find display in display list")); nWhich = wxNOT_FOUND; } } return nWhich;}wxDisplayImpl *wxDisplayFactoryMacOSX::CreateDisplay(unsigned n){ CGDisplayCount theCount = GetCount(); CGDirectDisplayID* theIDs = new CGDirectDisplayID[theCount];#ifdef __WXDEBUG__ CGDisplayErr err =#endif CGGetActiveDisplayList(theCount, theIDs, &theCount); wxASSERT( err == CGDisplayNoErr ); wxASSERT( n < theCount ); wxDisplayImplMacOSX *display = new wxDisplayImplMacOSX(n, theIDs[n]); delete [] theIDs; return display;}// ============================================================================// wxDisplayImplMacOSX implementation// ============================================================================wxRect wxDisplayImplMacOSX::GetGeometry() const{ CGRect theRect = CGDisplayBounds(m_id); return wxRect( (int)theRect.origin.x, (int)theRect.origin.y, (int)theRect.size.width, (int)theRect.size.height ); //floats}static int wxCFDictKeyToInt( CFDictionaryRef desc, CFStringRef key ){ CFNumberRef value = (CFNumberRef) CFDictionaryGetValue( desc, key ); if (value == NULL) return 0; int num = 0; CFNumberGetValue( value, kCFNumberIntType, &num ); return num;}wxArrayVideoModes wxDisplayImplMacOSX::GetModes(const wxVideoMode& mode) const{ wxArrayVideoModes resultModes; CFArrayRef theArray = CGDisplayAvailableModes( m_id ); for (CFIndex i = 0; i < CFArrayGetCount(theArray); ++i) { CFDictionaryRef theValue = (CFDictionaryRef) CFArrayGetValueAtIndex( theArray, i ); wxVideoMode theMode( wxCFDictKeyToInt( theValue, kCGDisplayWidth ), wxCFDictKeyToInt( theValue, kCGDisplayHeight ), wxCFDictKeyToInt( theValue, kCGDisplayBitsPerPixel ), wxCFDictKeyToInt( theValue, kCGDisplayRefreshRate )); if (theMode.Matches( mode )) resultModes.Add( theMode ); } return resultModes;}wxVideoMode wxDisplayImplMacOSX::GetCurrentMode() const{ CFDictionaryRef theValue = CGDisplayCurrentMode( m_id ); return wxVideoMode( wxCFDictKeyToInt( theValue, kCGDisplayWidth ), wxCFDictKeyToInt( theValue, kCGDisplayHeight ), wxCFDictKeyToInt( theValue, kCGDisplayBitsPerPixel ), wxCFDictKeyToInt( theValue, kCGDisplayRefreshRate ));}bool wxDisplayImplMacOSX::ChangeMode( const wxVideoMode& mode ){ // Changing to default mode (wxDefaultVideoMode) doesn't // work because we don't have access to the system's 'scrn' // resource which holds the user's mode which the system // will return to after this app is done boolean_t bExactMatch; CFDictionaryRef theCGMode = CGDisplayBestModeForParametersAndRefreshRate( m_id, (size_t)mode.bpp, (size_t)mode.w, (size_t)mode.h, (double)mode.refresh, &bExactMatch ); bool bOK = bExactMatch; if (bOK) bOK = CGDisplaySwitchToMode( m_id, theCGMode ) == CGDisplayNoErr; return bOK;}// ============================================================================// wxDisplay::CreateFactory()// ============================================================================/* static */ wxDisplayFactory *wxDisplay::CreateFactory(){ return new wxDisplayFactoryMacOSX;}#else // !__WXMAC_OSX__class wxDisplayImplMac : public wxDisplayImpl{public: wxDisplayImplMac(unsigned n, GDHandle hndl) : wxDisplayImpl(n), m_hndl(hndl) { } virtual wxRect GetGeometry() const; virtual wxString GetName() const { return wxString(); } virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const; virtual wxVideoMode GetCurrentMode() const; virtual bool ChangeMode(const wxVideoMode& mode);private: GDHandle m_hndl; DECLARE_NO_COPY_CLASS(wxDisplayImplMac)};class wxDisplayFactoryMac : public wxDisplayFactory{public: wxDisplayFactoryMac(); virtual wxDisplayImpl *CreateDisplay(unsigned n); virtual unsigned GetCount(); virtual int GetFromPoint(const wxPoint& pt);protected: DECLARE_NO_COPY_CLASS(wxDisplayFactoryMac)};// ============================================================================// wxDisplayFactoryMac implementation// ============================================================================unsigned wxDisplayFactoryMac::GetCount(){ unsigned num = 0; GDHandle hndl = DMGetFirstScreenDevice(true); while(hndl) { num++; hndl = DMGetNextScreenDevice(hndl, true); } return num;}int wxDisplayFactoryMac::GetFromPoint(const wxPoint &p){ unsigned num = 0; GDHandle 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 wxNOT_FOUND;}wxDisplayImpl *wxDisplayFactoryMac::CreateDisplay(unsigned n){ unsigned nOrig = n; GDHandle hndl = DMGetFirstScreenDevice(true); while(hndl) { if (n == 0) { return new wxDisplayImplMac(nOrig, hndl); } n--; hndl = DMGetNextScreenDevice(hndl, true); } return NULL;}// ============================================================================// wxDisplayImplMac implementation// ============================================================================wxRect wxDisplayImplMac::GetGeometry() const{ Rect screenrect = (*m_hndl)->gdRect; return wxRect(screenrect.left, screenrect.top, screenrect.right - screenrect.left, screenrect.bottom - screenrect.top);}struct DMModeIteratorRec{ wxArrayVideoModes* pModes; const wxVideoMode* pMatchMode;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -