187 lines
5.8 KiB
Python
187 lines
5.8 KiB
Python
# A demo of an Application object that has some custom print functionality.
|
|
|
|
# If you desire, you can also run this from inside Pythonwin, in which
|
|
# case it will do the demo inside the Pythonwin environment.
|
|
|
|
# This sample was contributed by Roger Burnham.
|
|
|
|
import win32api
|
|
import win32con
|
|
import win32ui
|
|
from pywin.framework import app
|
|
from pywin.mfc import afxres, dialog, docview
|
|
|
|
PRINTDLGORD = 1538
|
|
IDC_PRINT_MAG_EDIT = 1010
|
|
|
|
|
|
class PrintDemoTemplate(docview.DocTemplate):
|
|
def _SetupSharedMenu_(self):
|
|
pass
|
|
|
|
|
|
class PrintDemoView(docview.ScrollView):
|
|
def OnInitialUpdate(self):
|
|
ret = self._obj_.OnInitialUpdate()
|
|
self.colors = {
|
|
"Black": (0x00 << 0) + (0x00 << 8) + (0x00 << 16),
|
|
"Red": (0xFF << 0) + (0x00 << 8) + (0x00 << 16),
|
|
"Green": (0x00 << 0) + (0xFF << 8) + (0x00 << 16),
|
|
"Blue": (0x00 << 0) + (0x00 << 8) + (0xFF << 16),
|
|
"Cyan": (0x00 << 0) + (0xFF << 8) + (0xFF << 16),
|
|
"Magenta": (0xFF << 0) + (0x00 << 8) + (0xFF << 16),
|
|
"Yellow": (0xFF << 0) + (0xFF << 8) + (0x00 << 16),
|
|
}
|
|
self.pens = {}
|
|
for name, color in self.colors.items():
|
|
self.pens[name] = win32ui.CreatePen(win32con.PS_SOLID, 5, color)
|
|
self.pen = None
|
|
self.size = (128, 128)
|
|
self.SetScaleToFitSize(self.size)
|
|
self.HookCommand(self.OnFilePrint, afxres.ID_FILE_PRINT)
|
|
self.HookCommand(self.OnFilePrintPreview, win32ui.ID_FILE_PRINT_PREVIEW)
|
|
return ret
|
|
|
|
def OnDraw(self, dc):
|
|
oldPen = None
|
|
x, y = self.size
|
|
delta = 2
|
|
colors = list(self.colors.keys())
|
|
colors.sort()
|
|
colors = colors * 2
|
|
for color in colors:
|
|
if oldPen is None:
|
|
oldPen = dc.SelectObject(self.pens[color])
|
|
else:
|
|
dc.SelectObject(self.pens[color])
|
|
dc.MoveTo((delta, delta))
|
|
dc.LineTo((x - delta, delta))
|
|
dc.LineTo((x - delta, y - delta))
|
|
dc.LineTo((delta, y - delta))
|
|
dc.LineTo((delta, delta))
|
|
delta = delta + 4
|
|
if x - delta <= 0 or y - delta <= 0:
|
|
break
|
|
dc.SelectObject(oldPen)
|
|
|
|
def OnPrepareDC(self, dc, pInfo):
|
|
if dc.IsPrinting():
|
|
mag = self.prtDlg["mag"]
|
|
dc.SetMapMode(win32con.MM_ANISOTROPIC)
|
|
dc.SetWindowOrg((0, 0))
|
|
dc.SetWindowExt((1, 1))
|
|
dc.SetViewportOrg((0, 0))
|
|
dc.SetViewportExt((mag, mag))
|
|
|
|
def OnPreparePrinting(self, pInfo):
|
|
flags = (
|
|
win32ui.PD_USEDEVMODECOPIES
|
|
| win32ui.PD_PAGENUMS
|
|
| win32ui.PD_NOPAGENUMS
|
|
| win32ui.PD_NOSELECTION
|
|
)
|
|
self.prtDlg = ImagePrintDialog(pInfo, PRINTDLGORD, flags)
|
|
pInfo.SetPrintDialog(self.prtDlg)
|
|
pInfo.SetMinPage(1)
|
|
pInfo.SetMaxPage(1)
|
|
pInfo.SetFromPage(1)
|
|
pInfo.SetToPage(1)
|
|
ret = self.DoPreparePrinting(pInfo)
|
|
return ret
|
|
|
|
def OnBeginPrinting(self, dc, pInfo):
|
|
return self._obj_.OnBeginPrinting(dc, pInfo)
|
|
|
|
def OnEndPrinting(self, dc, pInfo):
|
|
del self.prtDlg
|
|
return self._obj_.OnEndPrinting(dc, pInfo)
|
|
|
|
def OnFilePrintPreview(self, *arg):
|
|
self._obj_.OnFilePrintPreview()
|
|
|
|
def OnFilePrint(self, *arg):
|
|
self._obj_.OnFilePrint()
|
|
|
|
def OnPrint(self, dc, pInfo):
|
|
doc = self.GetDocument()
|
|
metrics = dc.GetTextMetrics()
|
|
cxChar = metrics["tmAveCharWidth"]
|
|
cyChar = metrics["tmHeight"]
|
|
left, top, right, bottom = pInfo.GetDraw()
|
|
dc.TextOut(0, 2 * cyChar, doc.GetTitle())
|
|
top = top + (7 * cyChar) / 2
|
|
dc.MoveTo(left, top)
|
|
dc.LineTo(right, top)
|
|
top = top + cyChar
|
|
# this seems to have not effect...
|
|
# get what I want with the dc.SetWindowOrg calls
|
|
pInfo.SetDraw((left, top, right, bottom))
|
|
dc.SetWindowOrg((0, -top))
|
|
|
|
self.OnDraw(dc)
|
|
dc.SetTextAlign(win32con.TA_LEFT | win32con.TA_BOTTOM)
|
|
|
|
rect = self.GetWindowRect()
|
|
rect = self.ScreenToClient(rect)
|
|
height = rect[3] - rect[1]
|
|
dc.SetWindowOrg((0, -(top + height + cyChar)))
|
|
dc.MoveTo(left, 0)
|
|
dc.LineTo(right, 0)
|
|
|
|
x = 0
|
|
y = (3 * cyChar) / 2
|
|
|
|
dc.TextOut(x, y, doc.GetTitle())
|
|
y = y + cyChar
|
|
|
|
|
|
class PrintDemoApp(app.CApp):
|
|
def __init__(self):
|
|
app.CApp.__init__(self)
|
|
|
|
def InitInstance(self):
|
|
template = PrintDemoTemplate(None, None, None, PrintDemoView)
|
|
self.AddDocTemplate(template)
|
|
self._obj_.InitMDIInstance()
|
|
self.LoadMainFrame()
|
|
doc = template.OpenDocumentFile(None)
|
|
doc.SetTitle("Custom Print Document")
|
|
|
|
|
|
class ImagePrintDialog(dialog.PrintDialog):
|
|
sectionPos = "Image Print Demo"
|
|
|
|
def __init__(self, pInfo, dlgID, flags=win32ui.PD_USEDEVMODECOPIES):
|
|
dialog.PrintDialog.__init__(self, pInfo, dlgID, flags=flags)
|
|
mag = win32ui.GetProfileVal(self.sectionPos, "Document Magnification", 0)
|
|
if mag <= 0:
|
|
mag = 2
|
|
win32ui.WriteProfileVal(self.sectionPos, "Document Magnification", mag)
|
|
|
|
self["mag"] = mag
|
|
|
|
def OnInitDialog(self):
|
|
self.magCtl = self.GetDlgItem(IDC_PRINT_MAG_EDIT)
|
|
self.magCtl.SetWindowText(repr(self["mag"]))
|
|
return dialog.PrintDialog.OnInitDialog(self)
|
|
|
|
def OnOK(self):
|
|
dialog.PrintDialog.OnOK(self)
|
|
strMag = self.magCtl.GetWindowText()
|
|
try:
|
|
self["mag"] = int(strMag)
|
|
except:
|
|
pass
|
|
win32ui.WriteProfileVal(self.sectionPos, "Document Magnification", self["mag"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# Running under Pythonwin
|
|
def test():
|
|
template = PrintDemoTemplate(None, None, None, PrintDemoView)
|
|
template.OpenDocumentFile(None)
|
|
|
|
test()
|
|
else:
|
|
app = PrintDemoApp()
|