Spaces:
Sleeping
Sleeping
# 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() | |