⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printmac.cpp

📁 wxWidgets 是一个跨平台的 GUI 框架。它给开发人员提供了统一的接口
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        src/mac/carbon/printwin.cpp// Purpose:     wxMacPrinter framework// Author:      Julian Smart// Modified by:// Created:     04/01/98// RCS-ID:      $Id: printmac.cpp,v 1.44 2006/12/03 15:28:17 SC Exp $// Copyright:   (c) Julian Smart// Licence:     wxWindows licence/////////////////////////////////////////////////////////////////////////////// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#if wxUSE_PRINTING_ARCHITECTURE#ifdef __BORLANDC__    #pragma hdrstop#endif#ifndef WX_PRECOMP    #include "wx/utils.h"    #include "wx/dc.h"    #include "wx/app.h"    #include "wx/msgdlg.h"    #include "wx/dcprint.h"    #include "wx/math.h"#endif#include "wx/mac/uma.h"#include "wx/mac/printmac.h"#include "wx/mac/private/print.h"#include "wx/printdlg.h"#include "wx/paper.h"#include "wx/mac/printdlg.h"#include <stdlib.h>IMPLEMENT_DYNAMIC_CLASS(wxMacCarbonPrintData, wxPrintNativeDataBase)IMPLEMENT_DYNAMIC_CLASS(wxMacPrinter, wxPrinterBase)IMPLEMENT_CLASS(wxMacPrintPreview, wxPrintPreviewBase)bool wxMacCarbonPrintData::IsOk() const{    return (m_macPageFormat != kPMNoPageFormat) && (m_macPrintSettings != kPMNoPrintSettings) && (m_macPrintSession != kPMNoReference);}wxMacCarbonPrintData::wxMacCarbonPrintData(){    m_macPageFormat = kPMNoPageFormat;    m_macPrintSettings = kPMNoPrintSettings;    m_macPrintSession = kPMNoReference ;    ValidateOrCreate() ;}wxMacCarbonPrintData::~wxMacCarbonPrintData(){    if (m_macPageFormat != kPMNoPageFormat)    {        (void)PMRelease(m_macPageFormat);        m_macPageFormat = kPMNoPageFormat;    }    if (m_macPrintSettings != kPMNoPrintSettings)    {        (void)PMRelease(m_macPrintSettings);        m_macPrintSettings = kPMNoPrintSettings;    }    if ( m_macPrintSession != kPMNoReference )    {        (void)PMRelease(m_macPrintSession);        m_macPrintSession = kPMNoReference;    }}void wxMacCarbonPrintData::ValidateOrCreate(){    OSStatus err = noErr ;    if ( m_macPrintSession == kPMNoReference )    {        err = PMCreateSession( (PMPrintSession *) &m_macPrintSession ) ;    }    //  Set up a valid PageFormat object.    if ( m_macPageFormat == kPMNoPageFormat)    {        err = PMCreatePageFormat((PMPageFormat *) &m_macPageFormat);        //  Note that PMPageFormat is not session-specific, but calling        //  PMSessionDefaultPageFormat assigns values specific to the printer        //  associated with the current printing session.        if ((err == noErr) &&            ( m_macPageFormat != kPMNoPageFormat))        {            err = PMSessionDefaultPageFormat((PMPrintSession) m_macPrintSession,                (PMPageFormat) m_macPageFormat);        }    }    else    {        err = PMSessionValidatePageFormat((PMPrintSession) m_macPrintSession,            (PMPageFormat) m_macPageFormat,            kPMDontWantBoolean);    }    //  Set up a valid PrintSettings object.    if ( m_macPrintSettings == kPMNoPrintSettings)    {        err = PMCreatePrintSettings((PMPrintSettings *) &m_macPrintSettings);        //  Note that PMPrintSettings is not session-specific, but calling        //  PMSessionDefaultPrintSettings assigns values specific to the printer        //  associated with the current printing session.        if ((err == noErr) &&            ( m_macPrintSettings != kPMNoPrintSettings))        {            err = PMSessionDefaultPrintSettings((PMPrintSession) m_macPrintSession,                (PMPrintSettings) m_macPrintSettings);        }    }    else    {        err = PMSessionValidatePrintSettings((PMPrintSession) m_macPrintSession,            (PMPrintSettings) m_macPrintSettings,            kPMDontWantBoolean);    }}bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data ){    ValidateOrCreate() ;    PMSetCopies( (PMPrintSettings) m_macPrintSettings , data.GetNoCopies() , false ) ;    if ( data.IsOrientationReversed() )        PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?            kPMReverseLandscape : kPMReversePortrait , false ) ;    else        PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?            kPMLandscape : kPMPortrait , false ) ;    // collate cannot be set#if 0 // not yet tested    if ( !m_printerName.empty() )        PMSessionSetCurrentPrinter( (PMPrintSession) m_macPrintSession , wxMacCFStringHolder( m_printerName , wxFont::GetDefaultEncoding() ) ) ;#endif#ifndef __LP64__    PMColorMode color ;    PMGetColorMode(  (PMPrintSettings) m_macPrintSettings, &color ) ;    if ( data.GetColour() )    {        if ( color == kPMBlackAndWhite )            PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMColor ) ;    }    else        PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMBlackAndWhite ) ;#endif#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4    if ( PMSetDuplex!=NULL )    {        PMDuplexMode mode = 0 ;        switch( data.GetDuplex() )        {            case wxDUPLEX_HORIZONTAL :                mode = kPMDuplexNoTumble ;                break ;            case wxDUPLEX_VERTICAL :                mode = kPMDuplexTumble ;                break ;            case wxDUPLEX_SIMPLEX :            default :                mode = kPMDuplexNone ;                break ;        }        PMSetDuplex( (PMPrintSettings) m_macPrintSettings, mode ) ;    }#endif    // PMQualityMode not yet accessible via API    // todo paperSize    PMResolution res;    PMPrinter printer;    PMSessionGetCurrentPrinter(m_macPrintSession, &printer);#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5     PMPrinterGetOutputResolution( printer,          (PMPrintSettings) m_macPrintSettings,  &res) ;    // TODO transfer ? into page format ?#else    PMTag tag = kPMMaxSquareResolution;    PMPrinterGetPrinterResolution(printer, tag, &res);    PMSetResolution((PMPageFormat) m_macPageFormat, &res);#endif    // after setting the new resolution the format has to be updated, otherwise the page rect remains     // at the 'old' scaling    PMSessionValidatePageFormat((PMPrintSession) m_macPrintSession,            (PMPageFormat) m_macPageFormat,            kPMDontWantBoolean) ;    return true ;}bool wxMacCarbonPrintData::TransferTo( wxPrintData &data ){    OSStatus err = noErr ;    UInt32 copies ;    err = PMGetCopies( m_macPrintSettings , &copies ) ;    if ( err == noErr )        data.SetNoCopies( copies ) ;    PMOrientation orientation ;    err = PMGetOrientation(  m_macPageFormat , &orientation ) ;    if ( err == noErr )    {        if ( orientation == kPMPortrait || orientation == kPMReversePortrait )        {            data.SetOrientation( wxPORTRAIT  );            data.SetOrientationReversed( orientation == kPMReversePortrait );        }        else        {            data.SetOrientation( wxLANDSCAPE );            data.SetOrientationReversed( orientation == kPMReverseLandscape );        }    }    // collate cannot be set#if 0    {        wxMacCFStringHolder name ;        PMPrinter printer ;        PMSessionGetCurrentPrinter( m_macPrintSession ,            &printer ) ;        m_printerName = name.AsString() ;    }#endif#ifndef __LP64__    PMColorMode color ;    err = PMGetColorMode( m_macPrintSettings, &color ) ;    if ( err == noErr )        data.SetColour( !(color == kPMBlackAndWhite) ) ;#endif#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4    if ( PMGetDuplex!=NULL )    {        PMDuplexMode mode = 0 ;        PMGetDuplex( (PMPrintSettings) m_macPrintSettings, &mode ) ;        switch( mode )        {            case kPMDuplexNoTumble :                data.SetDuplex(wxDUPLEX_HORIZONTAL);                break ;            case kPMDuplexTumble :                data.SetDuplex(wxDUPLEX_VERTICAL);                break ;            case kPMDuplexNone :            default :                data.SetDuplex(wxDUPLEX_SIMPLEX);                break ;        }    }#endif    // PMQualityMode not yet accessible via API        PMPaper paper ;    PMGetPageFormatPaper( m_macPageFormat, &paper );        PMRect rPaper;    err = PMGetUnadjustedPaperRect( m_macPageFormat, &rPaper);    if ( err == noErr )    {        wxSize sz((int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) ,             (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 ));        data.SetPaperSize(sz);        wxPaperSize id = wxThePrintPaperDatabase->GetSize(wxSize(sz.x* 10, sz.y * 10));        if (id != wxPAPER_NONE)        {            data.SetPaperId(id);        }    }    return true ;}void wxMacCarbonPrintData::TransferFrom( wxPageSetupData *data ){    // should we setup the page rect here ?    // since MacOS sometimes has two same paper rects with different    // page rects we could make it roundtrip safe perhaps}void wxMacCarbonPrintData::TransferTo( wxPageSetupData* data ){    PMRect rPaper;    OSStatus err = PMGetUnadjustedPaperRect(m_macPageFormat, &rPaper);    if ( err == noErr )    {        wxSize sz((int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) ,             (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 ));        data->SetPaperSize(sz);        PMRect rPage ;        err = PMGetUnadjustedPageRect(m_macPageFormat , &rPage ) ;        if ( err == noErr )        {            data->SetMinMarginTopLeft( wxPoint (                (int)(((double) rPage.left - rPaper.left ) * pt2mm) ,                (int)(((double) rPage.top - rPaper.top ) * pt2mm) ) ) ;            data->SetMinMarginBottomRight( wxPoint (                (wxCoord)(((double) rPaper.right - rPage.right ) * pt2mm),                (wxCoord)(((double) rPaper.bottom - rPage.bottom ) * pt2mm)) ) ;            if ( data->GetMarginTopLeft().x < data->GetMinMarginTopLeft().x )                data->SetMarginTopLeft( wxPoint( data->GetMinMarginTopLeft().x ,                    data->GetMarginTopLeft().y ) ) ;            if ( data->GetMarginBottomRight().x < data->GetMinMarginBottomRight().x )                data->SetMarginBottomRight( wxPoint( data->GetMinMarginBottomRight().x ,                    data->GetMarginBottomRight().y ) );            if ( data->GetMarginTopLeft().y < data->GetMinMarginTopLeft().y )                data->SetMarginTopLeft( wxPoint( data->GetMarginTopLeft().x , data->GetMinMarginTopLeft().y ) );            if ( data->GetMarginBottomRight().y < data->GetMinMarginBottomRight().y )                data->SetMarginBottomRight( wxPoint( data->GetMarginBottomRight().x ,                    data->GetMinMarginBottomRight().y) );        }    }}void wxMacCarbonPrintData::TransferTo( wxPrintDialogData* data )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -