窗体显示类
窗體在前面已經注冊。而且已經創建出來了,但這時這個窗體并不能出如今我們的眼前,又是什么原因呢?哦,還不顯示出來,原來是有原因的,就是窗體有多種狀態。窗體能夠隱藏、普通顯示、最大化顯示、最小化顯示等。而且創建出來時。不馬上顯示。也是能夠方便一性地創建非常多非常多窗體,最后才一次性地顯示出來。另外創建窗體之后在系統看來窗體已經是可用的。這時能夠先在窗體上畫圖。當完畢時再一次性顯示出來,也避免窗體不斷地刷新時窗體在閃動,看起來讓人眼花繚亂。因而在這里就封裝一個窗體顯示類Window。這個類非常easy,它的代碼例如以下:
#開發者:蔡軍生(QQ:9073204) 深圳 2014-8-24 #窗體類 class Window:def __init__(self, hWnd):self.hWnd = hWnddef Display(self, cmdShow):windll.user32.ShowWindow(self.hWnd, cmdShow)windll.user32.UpdateWindow(self.hWnd)在這個類里主要提供構造函數__init__和顯示函數Display。在構造函數里主要是創建保存窗體句柄的成員變量self.hWnd,用來保存相應的窗體與本類的關系。顯示函數Display主要是調用系統的API函數ShowWindow把窗體顯示出來,調用系統的API函數UpdateWindow把窗體的客戶區進行更新。
到這里已經把界面操作功能封裝成三個類:WinClassMaker、WinMaker和Window。
這三個類的功能是各司其職,WinClassMaker是負責把窗體樣式注冊,定制不同的窗體類型。WinMaker是負責樣式定下來的窗體創建一個實體對象出來。站在開發者的角度就是分配內存給一個對象;Window是負責把窗體顯示、隱藏或者相應的移動等操作。因為這三部分是全部窗體類的基本功能,以后再須要創建新的窗體。都能夠繼承這三個類來進行復用代碼。
把這三個類放在一起。就把前面的樣例代碼再重寫一遍,就變成了以下這個樣子:
#windows應用程序 #使用類來描寫敘述 from ctypes import * from ctypes.wintypes import *WS_EX_APPWINDOW = 0x40000 WS_OVERLAPPEDWINDOW = 0xcf0000 WS_CAPTION = 0xc00000 SW_SHOWNORMAL = 1 SW_SHOW = 5 CS_HREDRAW = 2 CS_VREDRAW = 1 CW_USEDEFAULT = 0x80000000 WM_DESTROY = 2 WHITE_BRUSH = 0WNDPROCTYPE = WINFUNCTYPE(c_int, HWND, c_uint, WPARAM, LPARAM) #定義窗體類結構 class WNDCLASSEX(Structure):_fields_ = [("cbSize", c_uint),("style", c_uint),("lpfnWndProc", WNDPROCTYPE),("cbClsExtra", c_int),("cbWndExtra", c_int),("hInstance", HANDLE),("hIcon", HANDLE),("hCursor", HANDLE),("hBrush", HANDLE),("lpszMenuName", LPCWSTR),("lpszClassName", LPCWSTR),("hIconSm", HANDLE)]#開發者:蔡軍生(QQ:9073204) 深圳 2014-8-24 #窗體類 class Window:def __init__(self, hWnd):self.hWnd = hWnddef Display(self, cmdShow):windll.user32.ShowWindow(self.hWnd, cmdShow)windll.user32.UpdateWindow(self.hWnd)#窗體類型注冊類 class WinClassMaker:def __init__(self, wndProc, className, hInst):self.wndClass = WNDCLASSEX()self.wndClass.cbSize = sizeof(WNDCLASSEX)self.wndClass.style = CS_HREDRAW | CS_VREDRAWself.wndClass.lpfnWndProc = wndProcself.wndClass.cbClsExtra = 0self.wndClass.cbWndExtra = 0self.wndClass.hInstance = hInstself.wndClass.hIcon = 0self.wndClass.hCursor = 0self.wndClass.hBrush = windll.gdi32.GetStockObject(WHITE_BRUSH)self.wndClass.lpszMenuName = 0self.wndClass.lpszClassName = classNameself.wndClass.hIconSm = 0def Register(self):return windll.user32.RegisterClassExW(byref(self.wndClass))#創建窗體 class WinMaker:def __init__(self, className, hInst):self.className = classNameself.hInst = hInstself.style = WS_OVERLAPPEDWINDOW | WS_CAPTIONself.exStyle = 0self.x = CW_USEDEFAULTself.y = 0self.width = CW_USEDEFAULTself.height = 0self.hWndParent = HWND(0)self.hMenu = HWND(0)self.wndCreatData = c_void_p(0)def Create(self, title):self.hWnd = windll.user32.CreateWindowExW(self.exStyle, self.className, title,self.style,self.x, self.y,self.width, self.height,self.hWndParent,self.hMenu, self.hInst, self.wndCreatData)if not self.hWnd:print('Failed to create window')exit(0)return self.hWnd#窗體消息處理回調函數 def PyWndProc(hWnd, Msg, wParam, lParam):if Msg == WM_DESTROY:windll.user32.PostQuitMessage(0)else:return windll.user32.DefWindowProcW(hWnd, Msg, wParam, lParam)return 0#主函數入口 def main(): hInst = windll.kernel32.GetModuleHandleW(None)WndProc = WNDPROCTYPE(PyWndProc) className = u'ShenzhenCai'wname = u'Hello World' winClass = WinClassMaker(WndProc, className, hInst)winClass.Register()maker = WinMaker(className, hInst)win = Window(maker.Create(wname))win.Display(SW_SHOW)msg = MSG()lpmsg = pointer(msg)print('Entering message loop')while windll.user32.GetMessageW(lpmsg, 0, 0, 0) != 0:windll.user32.TranslateMessage(lpmsg)windll.user32.DispatchMessageW(lpmsg)print('done.')if __name__ == "__main__":print( "Win32 Application in python" )main()轉載于:https://www.cnblogs.com/zsychanpin/p/6920210.html
總結
- 上一篇: 一个基于cocos2d-x 3.0和Bo
- 下一篇: VBS脚本获取安全标识符SID(Secu