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

169 lines
4.6 KiB
Python

#------------------------------------------------------------------------------
#
# PyGUI - Win32 API - Page setup dialog
#
#------------------------------------------------------------------------------
from ctypes import *
from ctypes.wintypes import *
comdlg32 = windll.comdlg32
kernel32 = windll.kernel32
CCHDEVICENAME = 32
CCHFORMNAME = 32
PSD_MARGINS = 0x2
PSD_INTHOUSANDTHSOFINCHES = 0x4
PSD_RETURNDEFAULT = 0x400
LPPAGESETUPHOOK = c_void_p
LPPAGEPAINTHOOK = c_void_p
class PAGESETUPDLG(Structure):
_fields_ = [
('lStructSize', DWORD),
('hwndOwner', HWND),
('hDevMode', HGLOBAL),
('hDevNames', HGLOBAL),
('Flags', DWORD),
('ptPaperSize', POINT),
('rtMinMargin', RECT),
('rtMargin', RECT),
('hInstance', HINSTANCE),
('lCustData', LPARAM),
('lpfnPageSetupHook', LPPAGESETUPHOOK),
('lpfnPagePaintHook', LPPAGEPAINTHOOK),
('lpPageSetupTemplateName', LPCSTR),
('hPageSetupTemplate', HGLOBAL),
]
def __del__(self):
print "PAGESETUPDLG.__del__" ###
GlobalFree(self.hDevMode)
GlobalFree(self.hDevNames)
class DEVMODE(Structure):
_fields_ = [
('dmDeviceName', c_char * CCHDEVICENAME),
('dmSpecVersion', WORD),
('dmDriverVersion', WORD),
('dmSize', WORD),
('dmDriverExtra', WORD),
('dmFields', DWORD),
('dmOrientation', c_short),
('dmPaperSize', c_short),
('dmPaperLength', c_short),
('dmPaperWidth', c_short),
('dmScale', c_short),
('dmCopies', c_short),
('dmDefaultSource', c_short),
('dmPrintQuality', c_short),
('dmColor', c_short),
('dmDuplex', c_short),
('dmYResolution', c_short),
('dmTTOption', c_short),
('dmCollate', c_short),
('dmFormName', c_char * CCHFORMNAME),
('dmLogPixels', WORD),
('dmBitsPerPel', DWORD),
('dmPelsWidth', DWORD),
('dmPelsHeight', DWORD),
('dmDisplayFlags', DWORD),
('dmDisplayFrequency', DWORD),
('dmICMMethod', DWORD),
('dmICMIntent', DWORD),
('dmMediaType', DWORD),
('dmDitherType', DWORD),
('dmReserved1', DWORD),
('dmReserved2', DWORD),
('dmPanningWidth', DWORD),
('dmPanningHeight', DWORD),
]
class DEVNAMES(Structure):
_fields_ = [
('wDriverOffset', WORD),
('wDeviceOffset', WORD),
('wOutputOffset', WORD),
('wDefault', WORD),
]
_PageSetupDlg = comdlg32.PageSetupDlgA
_PageSetupDlg.argtypes = [POINTER(PAGESETUPDLG)]
GlobalAlloc = kernel32.GlobalAlloc
GlobalAlloc.argtypes = [UINT, DWORD]
GlobalSize = kernel32.GlobalSize
GlobalSize.argtypes = [HGLOBAL]
GlobalLock = kernel32.GlobalLock
GlobalLock.argtypes = [HGLOBAL]
GlobalUnlock = kernel32.GlobalUnlock
GlobalUnlock.argtypes = [HGLOBAL]
GlobalFree = kernel32.GlobalFree
GlobalFree.argtypes = [HGLOBAL]
def PageSetupDlg(psd):
psd.Flags = PSD_INTHOUSANDTHSOFINCHES | PSD_MARGINS
return bool(_PageSetupDlg(psd))
def get_handle_contents(h):
n = GlobalSize(h)
p = GlobalLock(h)
data = string_at(p, n)
GlobalUnlock(h)
return data
def handle_with_contents(data):
n = len(data)
h = GlobalAlloc(n)
p = GlobalLock(h)
memmove(p, data, n)
GlobalUnlock(h)
return h
def lock_devmode_handle(h):
p = c_void_p(GlobalLock(h))
dmp = cast(p, POINTER(DEVMODE))
return dmp[0]
class DevNames(object):
def __init__(self, hdevnames):
a = GlobalLock(hdevnames)
p = c_void_p(a)
dnp = cast(p, POINTER(DEVNAMES))
dn = dnp[0]
self.driver = c_char_p(a + dn.wDriverOffset).value
self.device = c_char_p(a + dn.wDeviceOffset).value
self.output = c_char_p(a + dn.wOutputOffset).value
self.default = dn.wDefault
GlobalUnlock(hdevnames)
def get_defaults():
psd = PAGESETUPDLG()
psd.lStructSize = sizeof(PAGESETUPDLG)
psd.Flags = PSD_INTHOUSANDTHSOFINCHES | PSD_RETURNDEFAULT
_PageSetupDlg(psd)
return psd
if __name__ == "__main__":
def dump_psd(header, psd):
print "%s:" % header, psd
for name, _ in PAGESETUPDLG._fields_:
print " %s = %r" % (name, getattr(psd, name))
psd = PAGESETUPDLG()
psd.lStructSize = sizeof(PAGESETUPDLG)
dump_psd("Initial psd", psd)
result = _PageSetupDlg(psd)
print "Result:", result
dump_psd("Final psd", psd)
#print "DevMode:", repr(get_handle_contents(psd.hDevMode)[:sizeof(DEVMODE)])
dm = lock_devmode_handle(psd.hDevMode)
print "dmDeviceName:", dm.dmDeviceName
#print "DevNames:", repr(get_handle_contents(psd.hDevNames))