Lightningbeam/PyGUI-2.5.3/build/lib/GUI/WinPrint.py

130 lines
3.1 KiB
Python

#------------------------------------------------------------------------------
#
# PyGUI - Win32 API - Printing
#
#------------------------------------------------------------------------------
from ctypes import *
from ctypes.wintypes import *
comdlg32 = windll.comdlg32
gdi32 = windll.gdi32
PD_ALLPAGES = 0x0
PD_RETURNDC = 0x100
LOGPIXELSX = 88
LOGPIXELSY = 90
PHYSICALOFFSETX = 112
PHYSICALOFFSETY = 113
LPDWORD = POINTER(DWORD)
LPHANDLE = POINTER(HANDLE)
LPPOINT = POINTER(POINT)
LPPRINTHOOKPROC = c_void_p
LPSETUPHOOKPROC = c_void_p
ABORTPROC = CFUNCTYPE(c_int, HDC, c_int)
LPPRINTER_DEFAULTS = c_void_p
class PRINTDLG(Structure):
_pack_ = 2
_fields_ = [
('lStructSize', DWORD),
('hwndOwner', HWND),
('hDevMode', HGLOBAL),
('hDevNames', HGLOBAL),
('hDC', HDC),
('Flags', DWORD),
('nFromPage', WORD),
('nToPage', WORD),
('nMinPage', WORD),
('nMaxPage', WORD),
('nCopies', WORD),
('hInstance', HINSTANCE),
('lCustData', LPARAM),
('lpfnPrintHook', LPPRINTHOOKPROC),
('lpfnSetupHook', LPSETUPHOOKPROC),
('lpPrintTemplateName', LPCSTR),
('lpSetupTemplateName', LPCSTR),
('hPrintTemplate', HGLOBAL),
('hSetupTemplate', HGLOBAL),
]
def __init__(self):
self.lStructSize = sizeof(PRINTDLG)
class DOCINFO(Structure):
_fields_ = [
('cbSize', c_int),
('lpszDocName', LPCSTR),
('lpszOutput', LPCSTR),
('lpszDatatype', LPCSTR),
('fwType', DWORD),
]
def __init__(self):
self.cbSize = sizeof(DOCINFO)
class FORM_INFO_1_W(Structure):
_fields_ = [
('Flags', DWORD),
('pName', LPWSTR),
('Size', SIZEL),
('ImageableArea', RECTL),
]
_PrintDlg = comdlg32.PrintDlgA
_PrintDlg.argtypes = [POINTER(PRINTDLG)]
SetAbortProc = gdi32.SetAbortProc
SetAbortProc.argtypes = [HDC, ABORTPROC]
StartDoc = gdi32.StartDocA
StartDoc.argtypes = [HDC, POINTER(DOCINFO)]
StartPage = gdi32.StartPage
StartPage.argtypes = [HDC]
EndPage = gdi32.EndPage
EndPage.argtypes = [HDC]
EndDoc = gdi32.EndDoc
EndDoc.argtypes = [HDC]
DeleteDC = gdi32.DeleteDC
DeleteDC.argtypes = [HDC]
CommDlgExtendedError = comdlg32.CommDlgExtendedError
CommDlgExtendedError.argtypes = []
def PrintDlg(pd):
pd.nFromPage = pd.nMinPage
pd.nToPage = pd.nMaxPage
pd.Flags = PD_RETURNDC
#if pd.nMaxPage > pd.nMinPage:
# pd.Flags |= PD_PAGENUMS
result = _PrintDlg(pd)
if result == 0:
err = CommDlgExtendedError()
if err <> 0:
raise EnvironmentError("Common Dialog error %s" % err)
return bool(result)
def GetPrintingOffset(hdc):
dpix = gdi32.GetDeviceCaps(hdc, LOGPIXELSX)
dpiy = gdi32.GetDeviceCaps(hdc, LOGPIXELSY)
offx = gdi32.GetDeviceCaps(hdc, PHYSICALOFFSETX)
offy = gdi32.GetDeviceCaps(hdc, PHYSICALOFFSETY)
return 72.0 * offx / dpix, 72.0 * offy / dpiy
def abort_proc(hdc, err):
return printing_aborted
def install_abort_proc(hdc):
global printing_aborted
printing_aborted = False
SetAbortProc(hdc, ABORTPROC(abort_proc))