SplashScreen.py
上传用户:lswyart
上传日期:2008-06-12
资源大小:3441k
文件大小:5k
源码类别:

杀毒

开发平台:

Visual C++

  1. #-----------------------------------------------------------------------------
  2. # Name:        SplashScreen.py
  3. # Product:     ClamWin Free Antivirus
  4. #
  5. # Licence:     
  6. #   This program is free software; you can redistribute it and/or modify
  7. #   it under the terms of the GNU General Public License as published by
  8. #   the Free Software Foundation; either version 2 of the License, or
  9. #   (at your option) any later version.
  10. #   This program is distributed in the hope that it will be useful,
  11. #   but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. #   GNU General Public License for more details.
  14. #   You should have received a copy of the GNU General Public License
  15. #   along with this program; if not, write to the Free Software
  16. #   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. #-----------------------------------------------------------------------------
  18. #code from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/120687
  19. import win32gui
  20. import win32api
  21. import win32con
  22. import struct
  23. import ThreadFuture
  24. IDC_BITMAP = 1028
  25. g_registeredClass = 0
  26. class Splash:
  27.     def __init__(self, bitmapPath):
  28.         win32gui.InitCommonControls()
  29.         self.hinst = win32api.GetModuleHandle(None)
  30.         #retreive width and height from bitmap file, because GetObject does not work for bitmaps :-(
  31.         bitmapPath = win32api.GetShortPathName(bitmapPath)
  32.         f = open(bitmapPath, 'rb')
  33.         hdrfm = '<18xii'
  34.         self.bmWidth, self.bmHeight = struct.unpack(hdrfm, f.read(struct.calcsize(hdrfm)))
  35.         f.close()
  36.         self.hSplash = win32gui.LoadImage(self.hinst, bitmapPath, win32con.IMAGE_BITMAP, 
  37.                                           0, 0, win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE)
  38.         
  39.             
  40.     def _RegisterWndClass(self):
  41.         className = "PythonSplash"
  42.         global g_registeredClass
  43.         if not g_registeredClass:
  44.             message_map = {}
  45.             wc = win32gui.WNDCLASS()
  46.             wc.SetDialogProc() # Make it a dialog class.
  47.             self.hinst = wc.hInstance = win32api.GetModuleHandle(None)
  48.             wc.lpszClassName = className
  49.             wc.style = 0
  50.             wc.hCursor = win32gui.LoadCursor( 0, win32con.IDC_ARROW )
  51.             wc.hbrBackground = win32con.COLOR_WINDOW + 1
  52.             wc.lpfnWndProc = message_map # could also specify a wndproc.
  53.             wc.cbWndExtra = win32con.DLGWINDOWEXTRA + struct.calcsize("Pi")
  54.             classAtom = win32gui.RegisterClass(wc)
  55.             g_registeredClass = 1
  56.         return className
  57.     def _GetDialogTemplate(self, dlgClassName):
  58.         style = win32con.WS_POPUP
  59.         dlg = [ ["", (0, 0, 0, 0), style, None, (8, "MS Sans Serif"), None, dlgClassName], ]
  60.         dlg.append([130, "", IDC_BITMAP, (0, 0, 0, 0), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.SS_BITMAP])
  61.         return dlg
  62.     def CreateWindow(self):
  63.         self._DoCreate(win32gui.CreateDialogIndirect)
  64.     def DoModal(self):
  65.         return self._DoCreate(win32gui.DialogBoxIndirect)
  66.     def _DoCreate(self, fn):
  67.         message_map = {
  68.             win32con.WM_INITDIALOG: self.OnInitDialog,
  69.             win32con.WM_CLOSE: self.OnClose,
  70.         }
  71.         dlgClassName = self._RegisterWndClass()
  72.         template = self._GetDialogTemplate(dlgClassName)
  73.         return fn(self.hinst, template, 0, message_map)
  74.     def OnInitDialog(self, hwnd, msg, wparam, lparam):
  75.         self.hwnd = hwnd
  76.         desktop = win32gui.GetDesktopWindow()
  77.         dt_l, dt_t, dt_r, dt_b = win32gui.GetWindowRect(desktop)
  78.         centre_x, centre_y = win32gui.ClientToScreen( desktop, ( (dt_r-dt_l)/2, (dt_b-dt_t)/2) )
  79.         bmCtrl = win32gui.GetDlgItem(self.hwnd, IDC_BITMAP)
  80.         win32gui.SendMessage(bmCtrl, win32con.STM_SETIMAGE, win32con.IMAGE_BITMAP, self.hSplash)
  81.         win32gui.SetWindowPos(self.hwnd, win32con.HWND_TOPMOST, 
  82.                               centre_x-(self.bmWidth/2), centre_y-(self.bmHeight/2), 
  83.                               self.bmWidth, self.bmHeight, win32con.SWP_HIDEWINDOW)
  84.         try:
  85.              win32gui.SetForegroundWindow(self.hwnd)
  86.         except:
  87.              pass
  88.         
  89.         
  90.     def Show(self):
  91.         win32gui.ShowWindow(self.hwnd, win32con.SW_SHOW)
  92.       
  93.     def Timer(self, timeOut):
  94.         import time
  95.         time.sleep(timeOut)
  96.         self.EndDialog()
  97.     def EndDialogAfter(self, timeOut):
  98.         #thread needed because win32gui does not expose SetTimer API
  99.         import thread
  100.         thread.start_new_thread(self.Timer, (timeOut, ))
  101.     
  102.     def EndDialog(self):
  103.         win32gui.EndDialog(self.hwnd, 0)
  104.         
  105.     def OnClose(self, hwnd, msg, wparam, lparam):
  106.         self.EndDialog()
  107. def ShowSplashScreen(filename, timeout):
  108.     s = Splash(filename)
  109.     s.CreateWindow()    
  110.     s.Show()
  111.     Wait = ThreadFuture.Future(s.EndDialogAfter, timeout)            
  112.     Wait()
  113.     
  114.     s.EndDialogAfter(3)
  115. if __name__=='__main__':
  116.     #s = Splash("img\Splash.bmp")
  117.     #s.DoModal()
  118.     
  119.     ShowSplashScreen("img\Splash.bmp", 5)
  120.     win32gui.PumpMessages()