165 lines
5.2 KiB
Python
165 lines
5.2 KiB
Python
|
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))
|