📄 printmac.cpp
字号:
/////////////////////////////////////////////////////////////////////////////// Name: src/mac/classic/printwin.cpp// Purpose: wxMacPrinter framework// Author: Julian Smart// Modified by:// Created: 04/01/98// RCS-ID: $Id: printmac.cpp,v 1.9 2006/10/27 13:07:27 JS Exp $// Copyright: (c) Julian Smart// Licence: wxWindows licence/////////////////////////////////////////////////////////////////////////////// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#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"#endif#include "wx/mac/uma.h"#include "wx/mac/printmac.h"#include "wx/mac/private/print.h"#define mm2pt 2.83464566929#define pt2mm 0.352777777778#include "wx/printdlg.h"#include <stdlib.h>IMPLEMENT_DYNAMIC_CLASS(wxMacPrinter, wxPrinterBase)IMPLEMENT_CLASS(wxMacPrintPreview, wxPrintPreviewBase)#if TARGET_CARBONwxNativePrintData* wxNativePrintData::Create(){ return new wxMacCarbonPrintData() ;}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); }}void wxMacCarbonPrintData::TransferFrom( wxPrintData* data ){ ValidateOrCreate() ; PMSetCopies( (PMPrintSettings) m_macPrintSettings , data->GetNoCopies() , false ) ; 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 PMColorMode color ; PMGetColorMode( (PMPrintSettings) m_macPrintSettings, &color ) ; if ( data->GetColour() ) { if ( color == kPMBlackAndWhite ) PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMColor ) ; } else PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMBlackAndWhite ) ; // PMDuplexMode not yet accessible via API // PMQualityMode not yet accessible via API // todo paperSize}void 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 ); else data->SetOrientation( wxLANDSCAPE ); } // collate cannot be set#if 0 { wxMacCFStringHolder name ; PMPrinter printer ; PMSessionGetCurrentPrinter( m_macPrintSession , &printer ) ; m_printerName = name.AsString() ; }#endif PMColorMode color ; err = PMGetColorMode( m_macPrintSettings, &color ) ; if ( err == noErr ) data->SetColour( !(color == kPMBlackAndWhite) ) ; // PMDuplexMode not yet accessible via API // PMQualityMode not yet accessible via API // todo paperSize PMRect rPaper; err = PMGetUnadjustedPaperRect( m_macPageFormat, &rPaper); if ( err == noErr ) { data->SetPaperSize( wxSize ( (int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) , (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 ) ) ); }}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#if TARGET_CARBON#else#endif}void wxMacCarbonPrintData::TransferTo( wxPageSetupData* data ){ PMRect rPaper; OSStatus err = PMGetUnadjustedPaperRect(m_macPageFormat, &rPaper); if ( err == noErr ) { 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)) ) ; } }}void wxMacCarbonPrintData::TransferTo( wxPrintDialogData* data ){ UInt32 minPage , maxPage ; PMGetPageRange( m_macPrintSettings , &minPage , &maxPage ) ; data->SetMinPage( minPage ) ; data->SetMaxPage( maxPage ) ; UInt32 copies ; PMGetCopies( m_macPrintSettings , &copies ) ; data->SetNoCopies( copies ) ; UInt32 from , to ; PMGetFirstPage( m_macPrintSettings , &from ) ; PMGetLastPage( m_macPrintSettings , &to ) ; data->SetFromPage( from ) ; data->SetToPage( to ) ;}void wxMacCarbonPrintData::TransferFrom( wxPrintDialogData* data ){ PMSetPageRange( m_macPrintSettings , data->GetMinPage() , data->GetMaxPage() ) ; PMSetCopies( m_macPrintSettings , data->GetNoCopies() , false ) ; PMSetFirstPage( m_macPrintSettings , data->GetFromPage() , false ) ; int toPage = data->GetToPage(); if (toPage < 1) toPage = data->GetFromPage(); PMSetLastPage( m_macPrintSettings , toPage , false ) ;}void wxMacCarbonPrintData::CopyFrom( wxNativePrintData* d ){ wxMacCarbonPrintData *data = (wxMacCarbonPrintData*) d ; if ( data->m_macPrintSession != kPMNoReference ) PMRetain( data->m_macPrintSession ) ; if ( m_macPrintSession != kPMNoReference ) { PMRelease( m_macPrintSession ) ; m_macPrintSession = kPMNoReference ; } if ( data->m_macPrintSession != kPMNoReference ) m_macPrintSession = data->m_macPrintSession ; if ( data->m_macPrintSettings != kPMNoPrintSettings ) PMRetain( data->m_macPrintSettings ) ; if ( m_macPrintSettings != kPMNoPrintSettings ) { PMRelease( m_macPrintSettings ) ; m_macPrintSettings = kPMNoPrintSettings ; } if ( data->m_macPrintSettings != kPMNoPrintSettings ) m_macPrintSettings = data->m_macPrintSettings ; if ( data->m_macPageFormat != kPMNoPageFormat ) PMRetain( data->m_macPageFormat ) ; if ( m_macPageFormat != kPMNoPageFormat ) { PMRelease( m_macPageFormat ) ; m_macPageFormat = kPMNoPageFormat ; } if ( data->m_macPageFormat != kPMNoPageFormat ) m_macPageFormat = data->m_macPageFormat ;}int wxMacCarbonPrintData::ShowPrintDialog(){ int result = wxID_CANCEL ; OSErr err = noErr ; wxString message ; Boolean accepted; { // Display the Print dialog. if (err == noErr) { err = PMSessionPrintDialog( m_macPrintSession, m_macPrintSettings, m_macPageFormat, &accepted); if ((err == noErr) && !accepted) { err = kPMCancel; // user clicked Cancel button } } if ( err == noErr ) { result = wxID_OK ; } } if ((err != noErr) && (err != kPMCancel)) { message.Printf( wxT("Print Error %d"), err ) ; wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ; dialog.ShowModal(); } return result ;}int wxMacCarbonPrintData::ShowPageSetupDialog(){ int result = wxID_CANCEL ; OSErr err = noErr ; wxString message ; Boolean accepted; { // Display the Page Setup dialog. if (err == noErr) { err = PMSessionPageSetupDialog( m_macPrintSession, m_macPageFormat, &accepted); if ((err == noErr) && !accepted) { err = kPMCancel; // user clicked Cancel button } } // If the user did not cancel, flatten and save the PageFormat object // with our document. if (err == noErr) { result = wxID_OK ; } } if ((err != noErr) && (err != kPMCancel)) { message.Printf( wxT("Print Error %d"), err ) ; wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ; dialog.ShowModal(); } return result ;}#elsewxNativePrintData* wxNativePrintData::Create(){ return new wxMacClassicPrintData() ;}wxMacClassicPrintData::wxMacClassicPrintData(){ m_macPrintSettings = NULL ; ValidateOrCreate() ;}wxMacClassicPrintData::~wxMacClassicPrintData(){ wxASSERT( m_macPrintSettings ); DisposeHandle( (Handle) m_macPrintSettings ) ;}void wxMacClassicPrintData::ValidateOrCreate(){ if ( m_macPrintSettings == NULL ) { m_macPrintSettings = (THPrint) NewHandleClear( sizeof( TPrint ) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -