Spaces:
Sleeping
Sleeping
import os | |
import win32api | |
import win32con | |
import win32ui | |
from pywin.mfc import docview, window | |
from . import app | |
bStretch = 1 | |
class BitmapDocument(docview.Document): | |
"A bitmap document. Holds the bitmap data itself." | |
def __init__(self, template): | |
docview.Document.__init__(self, template) | |
self.bitmap = None | |
def OnNewDocument(self): | |
# I can not create new bitmaps. | |
win32ui.MessageBox("Bitmaps can not be created.") | |
def OnOpenDocument(self, filename): | |
self.bitmap = win32ui.CreateBitmap() | |
# init data members | |
f = open(filename, "rb") | |
try: | |
try: | |
self.bitmap.LoadBitmapFile(f) | |
except IOError: | |
win32ui.MessageBox("Could not load the bitmap from %s" % filename) | |
return 0 | |
finally: | |
f.close() | |
self.size = self.bitmap.GetSize() | |
return 1 | |
def DeleteContents(self): | |
self.bitmap = None | |
class BitmapView(docview.ScrollView): | |
"A view of a bitmap. Obtains data from document." | |
def __init__(self, doc): | |
docview.ScrollView.__init__(self, doc) | |
self.width = self.height = 0 | |
# set up message handlers | |
self.HookMessage(self.OnSize, win32con.WM_SIZE) | |
def OnInitialUpdate(self): | |
doc = self.GetDocument() | |
if doc.bitmap: | |
bitmapSize = doc.bitmap.GetSize() | |
self.SetScrollSizes(win32con.MM_TEXT, bitmapSize) | |
def OnSize(self, params): | |
lParam = params[3] | |
self.width = win32api.LOWORD(lParam) | |
self.height = win32api.HIWORD(lParam) | |
def OnDraw(self, dc): | |
# set sizes used for "non stretch" mode. | |
doc = self.GetDocument() | |
if doc.bitmap is None: | |
return | |
bitmapSize = doc.bitmap.GetSize() | |
if bStretch: | |
# stretch BMP. | |
viewRect = (0, 0, self.width, self.height) | |
bitmapRect = (0, 0, bitmapSize[0], bitmapSize[1]) | |
doc.bitmap.Paint(dc, viewRect, bitmapRect) | |
else: | |
# non stretch. | |
doc.bitmap.Paint(dc) | |
class BitmapFrame(window.MDIChildWnd): | |
def OnCreateClient(self, createparams, context): | |
borderX = win32api.GetSystemMetrics(win32con.SM_CXFRAME) | |
borderY = win32api.GetSystemMetrics(win32con.SM_CYFRAME) | |
titleY = win32api.GetSystemMetrics(win32con.SM_CYCAPTION) # includes border | |
# try and maintain default window pos, else adjust if cant fit | |
# get the main client window dimensions. | |
mdiClient = win32ui.GetMainFrame().GetWindow(win32con.GW_CHILD) | |
clientWindowRect = mdiClient.ScreenToClient(mdiClient.GetWindowRect()) | |
clientWindowSize = ( | |
clientWindowRect[2] - clientWindowRect[0], | |
clientWindowRect[3] - clientWindowRect[1], | |
) | |
left, top, right, bottom = mdiClient.ScreenToClient(self.GetWindowRect()) | |
# width, height=context.doc.size[0], context.doc.size[1] | |
# width = width+borderX*2 | |
# height= height+titleY+borderY*2-1 | |
# if (left+width)>clientWindowSize[0]: | |
# left = clientWindowSize[0] - width | |
# if left<0: | |
# left = 0 | |
# width = clientWindowSize[0] | |
# if (top+height)>clientWindowSize[1]: | |
# top = clientWindowSize[1] - height | |
# if top<0: | |
# top = 0 | |
# height = clientWindowSize[1] | |
# self.frame.MoveWindow((left, top, left+width, top+height),0) | |
window.MDIChildWnd.OnCreateClient(self, createparams, context) | |
return 1 | |
class BitmapTemplate(docview.DocTemplate): | |
def __init__(self): | |
docview.DocTemplate.__init__( | |
self, win32ui.IDR_PYTHONTYPE, BitmapDocument, BitmapFrame, BitmapView | |
) | |
def MatchDocType(self, fileName, fileType): | |
doc = self.FindOpenDocument(fileName) | |
if doc: | |
return doc | |
ext = os.path.splitext(fileName)[1].lower() | |
if ext == ".bmp": # removed due to PIL! or ext=='.ppm': | |
return win32ui.CDocTemplate_Confidence_yesAttemptNative | |
return win32ui.CDocTemplate_Confidence_maybeAttemptForeign | |
# return win32ui.CDocTemplate_Confidence_noAttempt | |
# For debugging purposes, when this module may be reloaded many times. | |
try: | |
win32ui.GetApp().RemoveDocTemplate(bitmapTemplate) | |
except NameError: | |
pass | |
bitmapTemplate = BitmapTemplate() | |
bitmapTemplate.SetDocStrings( | |
"\nBitmap\nBitmap\nBitmap (*.bmp)\n.bmp\nPythonBitmapFileType\nPython Bitmap File" | |
) | |
win32ui.GetApp().AddDocTemplate(bitmapTemplate) | |
# This works, but just didnt make it through the code reorg. | |
# class PPMBitmap(Bitmap): | |
# def LoadBitmapFile(self, file ): | |
# magic=file.readline() | |
# if magic <> "P6\n": | |
# raise TypeError, "The file is not a PPM format file" | |
# rowcollist=string.split(file.readline()) | |
# cols=string.atoi(rowcollist[0]) | |
# rows=string.atoi(rowcollist[1]) | |
# file.readline() # whats this one? | |
# self.bitmap.LoadPPMFile(file,(cols,rows)) | |
def t(): | |
bitmapTemplate.OpenDocumentFile("d:\\winnt\\arcade.bmp") | |
# OpenBMPFile( 'd:\\winnt\\arcade.bmp') | |
def demo(): | |
import glob | |
winDir = win32api.GetWindowsDirectory() | |
for fileName in glob.glob1(winDir, "*.bmp")[:2]: | |
bitmapTemplate.OpenDocumentFile(os.path.join(winDir, fileName)) | |