• 窗体显示类


    窗体在前面已经注冊。而且已经创建出来了,但这时这个窗体并不能出如今我们的眼前,又是什么原因呢?哦,还不显示出来,原来是有原因的,就是窗体有多种状态。窗体能够隐藏、普通显示、最大化显示、最小化显示等。而且创建出来时。不马上显示。也是能够方便一性地创建非常多非常多窗体,最后才一次性地显示出来。另外创建窗体之后在系统看来窗体已经是可用的。这时能够先在窗体上画图。当完毕时再一次性显示出来,也避免窗体不断地刷新时窗体在闪动,看起来让人眼花缭乱。因而在这里就封装一个窗体显示类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把窗体的客户区进行更新。

    到这里已经把界面操作功能封装成三个类:WinClassMakerWinMakerWindow

    这三个类的功能是各司其职,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()    
           
    


  • 相关阅读:
    codepen
    css3 animate
    dowebok 网站
    java第四次实验
    java第九周学习总结
    java第三次实验
    java第八周学习总结
    java第二次试验
    java第七周学习总结
    java第六周学习总结
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6920210.html
Copyright © 2020-2023  润新知