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)) | |