python中的窗口显示类

窗口在前面已经注册,并且已经创建出来了,但这时这个窗口并不能出现在我们的眼前,又是什么原因呢?哦,还不显示出来,原来是有原因的,就是窗口有多种状态,窗口可以隐藏、普通显示、最大化显示、最小化显示等。并且创建出来时,不立即显示,也是可以方便一性地创建很多很多窗口,最后才一次性地显示出来;另外创建窗口之后在系统看来窗口已经是可用的,这时可以先在窗口上绘图,当完成时再一次性显示出来,也避免窗口不断地刷新时窗口在闪动,看起来让人眼花缭乱。因而在这里就封装一个窗口显示类Window,这个类非常简单,它的代码如下:

#开发人员:蔡军生(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把窗口的客户区进行更新。

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/

到这里已经把界面操作功能封装成三个类: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()

作者:csdn博客 caimouse

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, 窗口
, hwnd
, 窗口显示不出来
, classname
, Self
WNDCLASS
python 显示窗口、python 窗口显示图片、python 窗口程序、python 获取窗口句柄、python 窗口,以便于您获取更多的相关知识。

时间: 2024-09-08 11:10:36

python中的窗口显示类的相关文章

python中的窗口创建类

在前面已经学习怎么样把注册窗口的功能封装成类的形式,接着下来就是创建窗口的功能,而这部分功能又是怎么样编写才是最合适的呢,以便后面所有开发工作都可以复用这些代码.我们来仔细地分析一下窗口上主要有什么东西是可变的,什么东西不变的,原则上就是把可变的东西变成通过函数方式来改变,不变的东西放在类内部,这样减少类的使用者在细节上考虑的问题.目前来看,一个窗口最容易变化的就两样东西:窗口类型,指明这个窗口是属于那一个种类的,比如Edit.List等:另外一个就是窗口的标题,因为软件的使用者只能从窗口的标题

win7电脑中切换窗口显示的数目如何设置?

  win7电脑中切换窗口显示的数目如何设置?下面,就让小编来告诉大家,应该如何操作吧! 1.首先,咱们需要使用win+r的快捷组合键来打开运行窗口,在打开的运行窗口中,咱们输入regedit并单击回车,这样就可以打开电脑的注册表编辑器窗口了. 2.在打开的注册表编辑器窗口中,咱们在左侧的菜单中依次点击展开HKEY_CURRENT_USER Control Panel Desktop,然后咱们将鼠标移动到右侧窗口中,就可以找到其中名称为"CoolSwitchColumns"的选项了.

python中每个窗口单独处理消息的例子源码

整个窗口使用消息类重新写的源码如下: #windows应用程序 #使用类来描述 #开发人员:蔡军生(QQ:9073204) 深圳 2014-8-24 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

解读Python中的

  这篇文章主要介绍了Python中的__init__()方法,__init__()方法是Python学习当中重要的基础知识,需要的朋友可以参考下 __init__()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步;每个对象必须正确初始化后才能正常工作.第二个原因是__init__()参数值可以有多种形式. 因为有很多种方式为__init__()提供参数值,对于对象创建有大量的用例,我们可以看看其中的几个.我们想尽可能的弄清楚,因此我们需要定义一个初始化来正确的描述问

深入理解Python中的ThreadLocal变量(中)

在 深入理解Python中的ThreadLocal变量(上)中我们看到 ThreadLocal 的引入,使得可以很方便地在多线程环境中使用局部变量.如此美妙的功能到底是怎样实现的?如果你对它的实现原理没有好奇心或一探究竟的冲动,那么接下来的内容估计会让你后悔自己的浅尝辄止了. 简单来说,Python 中 ThreadLocal 就是通过下图中的方法,将全局变量伪装成线程局部变量,相信读完本篇文章你会理解图中内容的.(对这张图不眼熟的话,可以回顾下上篇)). 在哪里找到源码? 好了,终于要来分析

全面了解python中的类,对象,方法,属性_python

python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗,它的颜色,大小,年龄,体重等是它的属性或特征.它会汪汪叫,会摇尾巴等是它的行为. 我们在描述一个真实对象(物体)时包括两个方面: 它可以做什么(行为) 它是什么样的(属性或特征). 在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象

Python中的类与对象之描述符详解

 这篇文章主要介绍了Python中的描述符详解,属于Python学习过程中类与对象的基本知识,需要的朋友可以参考下     描述符(Descriptors)是Python语言中一个深奥但却重要的一部分.它们广泛应用于Python语言的内核,熟练掌握描述符将会为Python程序员的工具箱添加一个额外的技巧.为了给接下来对描述符的讨论做一些铺垫,我将描述一些程序员可能会在日常编程活动中遇到的场景,然后我将解释描述符是什么,以及它们如何为这些场景提供优雅的解决方案.在这篇总结中,我会使用新样式类来指代

在Python中使用元类的教程

  这篇文章主要介绍了在Python中使用元类的教程,是Python当中的基础知识,代码基于Python2.x版本,需要的朋友可以参考下 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: ? 1 2 3 class Hello(object): def hello(self, name='world'): print('Hello, %s.' % name) 当Py

如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错。

问题描述 如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错. class Person { private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName(){ return name; } pu