窗体显示类
Posted zsychanpin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了窗体显示类相关的知识,希望对你有一定的参考价值。
窗体在前面已经注冊。而且已经创建出来了,但这时这个窗体并不能出如今我们的眼前,又是什么原因呢?哦,还不显示出来,原来是有原因的,就是窗体有多种状态。窗体能够隐藏、普通显示、最大化显示、最小化显示等。而且创建出来时。不马上显示。也是能够方便一性地创建非常多非常多窗体,最后才一次性地显示出来。另外创建窗体之后在系统看来窗体已经是可用的。这时能够先在窗体上画图。当完毕时再一次性显示出来,也避免窗体不断地刷新时窗体在闪动,看起来让人眼花缭乱。因而在这里就封装一个窗体显示类Window。这个类非常easy,它的代码例如以下:
#开发者:蔡军生(QQ:9073204) 深圳 2014-8-24 #窗体类 class Window: def __init__(self, hWnd): self.hWnd = hWnd def 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 = 0 WNDPROCTYPE = 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 = hWnd def 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_VREDRAW self.wndClass.lpfnWndProc = wndProc self.wndClass.cbClsExtra = 0 self.wndClass.cbWndExtra = 0 self.wndClass.hInstance = hInst self.wndClass.hIcon = 0 self.wndClass.hCursor = 0 self.wndClass.hBrush = windll.gdi32.GetStockObject(WHITE_BRUSH) self.wndClass.lpszMenuName = 0 self.wndClass.lpszClassName = className self.wndClass.hIconSm = 0 def Register(self): return windll.user32.RegisterClassExW(byref(self.wndClass)) #创建窗体 class WinMaker: def __init__(self, className, hInst): self.className = className self.hInst = hInst self.style = WS_OVERLAPPEDWINDOW | WS_CAPTION self.exStyle = 0 self.x = CW_USEDEFAULT self.y = 0 self.width = CW_USEDEFAULT self.height = 0 self.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()
以上是关于窗体显示类的主要内容,如果未能解决你的问题,请参考以下文章