窗体显示类
窗體在前面已經(jīng)注冊。而且已經(jīng)創(chuàng)建出來了,但這時(shí)這個(gè)窗體并不能出如今我們的眼前,又是什么原因呢?哦,還不顯示出來,原來是有原因的,就是窗體有多種狀態(tài)。窗體能夠隱藏、普通顯示、最大化顯示、最小化顯示等。而且創(chuàng)建出來時(shí)。不馬上顯示。也是能夠方便一性地創(chuàng)建非常多非常多窗體,最后才一次性地顯示出來。另外創(chuàng)建窗體之后在系統(tǒng)看來窗體已經(jīng)是可用的。這時(shí)能夠先在窗體上畫圖。當(dāng)完畢時(shí)再一次性顯示出來,也避免窗體不斷地刷新時(shí)窗體在閃動(dòng),看起來讓人眼花繚亂。因而在這里就封裝一個(gè)窗體顯示類Window。這個(gè)類非常easy,它的代碼例如以下:
#開發(fā)者:蔡軍生(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)在這個(gè)類里主要提供構(gòu)造函數(shù)__init__和顯示函數(shù)Display。在構(gòu)造函數(shù)里主要是創(chuàng)建保存窗體句柄的成員變量self.hWnd,用來保存相應(yīng)的窗體與本類的關(guān)系。顯示函數(shù)Display主要是調(diào)用系統(tǒng)的API函數(shù)ShowWindow把窗體顯示出來,調(diào)用系統(tǒng)的API函數(shù)UpdateWindow把窗體的客戶區(qū)進(jìn)行更新。
到這里已經(jīng)把界面操作功能封裝成三個(gè)類:WinClassMaker、WinMaker和Window。
這三個(gè)類的功能是各司其職,WinClassMaker是負(fù)責(zé)把窗體樣式注冊,定制不同的窗體類型。WinMaker是負(fù)責(zé)樣式定下來的窗體創(chuàng)建一個(gè)實(shí)體對象出來。站在開發(fā)者的角度就是分配內(nèi)存給一個(gè)對象;Window是負(fù)責(zé)把窗體顯示、隱藏或者相應(yīng)的移動(dòng)等操作。因?yàn)檫@三部分是全部窗體類的基本功能,以后再須要?jiǎng)?chuàng)建新的窗體。都能夠繼承這三個(gè)類來進(jìn)行復(fù)用代碼。
把這三個(gè)類放在一起。就把前面的樣例代碼再重寫一遍,就變成了以下這個(gè)樣子:
#windows應(yīng)用程序 #使用類來描寫敘述 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) #定義窗體類結(jié)構(gòu) 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)]#開發(fā)者:蔡軍生(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))#創(chuàng)建窗體 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#窗體消息處理回調(diào)函數(shù) 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#主函數(shù)入口 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()轉(zhuǎn)載于:https://www.cnblogs.com/zsychanpin/p/6920210.html
總結(jié)
- 上一篇: 一个基于cocos2d-x 3.0和Bo
- 下一篇: VBS脚本获取安全标识符SID(Secu