python中窗口的消息处理

我们知道一个应用程序一般都不是只有一个窗口组成的,往往是多窗口组成的,比如一个对话框的窗口上有一个按钮,这里对话框是一个窗口,按钮也是一个窗口。如果一个对话框上有100个按钮,就是100个窗口,这样句柄会比较多。因而出现了DirectUI的设计方法,所有按钮和主窗口都是同一个窗口,采用分不同区域来绘画而成。这里就遇到了一个问题,每个窗口是独立存在的,但在前面的例子里,可以看到每个窗口都是调用PyWndProc函数来处理。意味着多个窗口的消息都抛给PyWndProc函数处理,这样处理起来只会越来越多,越来越复杂。站在面向对象设计角度来考虑,是否可以有一个更好的方案解决呢?这个是可以的,由于Windows里给每个窗口保留了一个用户数据字段,只要利用这个字段,就可以关联起每个窗口与消息类之间的关系。比如窗口1就调用窗口1的类来处理消息,窗口2就调用窗口2的类来处理消息,这样每个窗口的独立性就得到保障,不用担心窗口1的消息会跑到窗口2去。为此,我声明了一个类Controller,用这个类来处理窗口的消息,当然不同的窗口都可以继承这个类,而实现其它的窗口消息处理。创建类Controller的实例之后,把这个实例对象保存到窗口的GWL_USERDATA字段里。参考《Windows API一日一练》介绍创建窗口的函数,如下:

HWND CreateWindowEx(

DWORD dwExStyle,//窗口的扩展风格

LPCTSTR lpClassName,//指向注册类名的指针

LPCTSTR lpWindowName,//指向窗口名称的指针

DWORD dwStyle,//窗口风格

int x,//窗口的水平位置

int y,//窗口的垂直位置

int nWidth,//窗口的宽度

int nHeight,//窗口的高度

HWND hWndParent,//父窗口的句柄

HMENU hMenu,//菜单的句柄或是子窗口的标识符

HINSTANCE hInstance,//应用程序实例的句柄

LPVOID lpParam//指向窗口的创建数据

);

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

在这个API函数的最后字段lpParam,就是指向窗口用户自定义的数据,在这里,我把消息处理类对象的指针放到这里,就可以让每个窗口有自己的消息处理类了。

定义类Controller如下:

class Controller:
    def __init__(self):
        self.hWnd = HWND()
    def SetWnd(self, hWnd):
        self.hWnd = hWnd
    def MyWndProc(self, hWnd, Msg, wParam, lParam):
        if Msg == WM_DESTROY:
            windll.user32.PostQuitMessage(0)
            return 0
        else:
            return windll.user32.DefWindowProcW(hWnd, Msg, wParam, lParam)

在类Controller里,主要有成员变量self.hWnd,它是用来保存每个窗口的句柄;成员函数MyWndProc是用来处理每个窗口的消息,如果窗口没有处理,就会把这些消息传递给Windows系统默认处理,而这个处理默认消息的函数是DefWindowProcW函数。因为一个窗口的消息是有很多的,并不是每个窗口都需要处理这么多消息,因此只有需要的才处理,这样处理方式是非常方便的。

作者:csdn博客 caimouse

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, 句柄
, 窗口
, 消息
, directui
, 处理
, 一个
, 窗口消息
消息窗口
python 窗口发送消息、python处理弹出窗口、python 消息队列、python 弹出消息框、python 窗口程序,以便于您获取更多的相关知识。

时间: 2024-10-28 09:37:06

python中窗口的消息处理的相关文章

python中窗口消息处理对象的传递

在前面已经定义好窗口的消息处理类,虽然拥有处理能力了,但还没有放到回调函数里进行相应的调用,那还是达不到目标,还需要下面两个细节的处理,才可以嵌入到消息处理过程里.我们来顺着消息类的传递路径来进行分析它的具体过程,这样理解起来会更顺畅一些,更符常人的思维.具体的过程如下图所示: 从上图可以看到,使用Controller类来创建窗口处理消息的实例对象ctrl,然后把它传送给WinMaker的实例对象,也就是传送给创建窗口的函数Create,通过操作系统的创建窗口的消息WM_NCCREATE带给回调

python中的窗口显示类

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

python中的窗口创建类

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

可爱的Python:Python中的TK编程

David Mertz 用源代码样本以及详细的说明介绍了 TK 和Tkinter 封装器(Python 的 GUI库).为了更便于操作,他演示了曾在以前很多文章中使用的 Txt2Html前端程序的 GUI移植示例.当然,他认为您会定期阅读其专栏. 我想要向您介绍能想像到的开始 GUI 编程的最简单方法,就是使用 Scriptics 的 TK 和 Tkinter 封装器.我们将与 developerWorks 中的 "Python 中的 curses 编程" 提到的 curses 库进行

界面划窗口设计-WIN32汇编中窗口设计,新手求帮助

问题描述 WIN32汇编中窗口设计,新手求帮助 .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib .data? hInstance dd ? nhWnd dd ? .data SZClassName db "My Windows" SZW

在Python中使用第三方模块的教程_python

在Python中,安装第三方模块,是通过setuptools这个工具完成的.Python有两个封装了setuptools的包管理工具:easy_install和pip.目前官方推荐使用pip. 如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了. 如果你正在使用Windows,请参考安装Python一节的内容,确保安装时勾选了pip和Add python.exe to Path. 在命令提示符窗口下尝试运行pip,如果Windows提示未找到命令,可以重新运行安装程序添加pip

在Python中封装GObject模块进行图形化程序编程的教程_python

Python 是用于编码图形界面的极佳语言.由于可以迅速地编写工作代码并且不需要费时的编译周期, 所以可以立即使界面启动和运行起来,并且不久便可使用这些界面. 将这一点与 Python 易于链接本机库的能力结合起来,就可以形成一个出色的环境. gnome-python 是为 Python 封装 GNOME 及其相关库的软件包. 这使您能够用 Python 编写外观与核心 GNOME 应用程序完全相同的应用程序,而所花的时间只是用 C 编写该应用程序所花的一部分. 然而,不用 C 进行编程会有一个

python中aiohttp request 的处理过程解析

使用过 python 的 aiohttp 第三方库的同学会知道,利用 aiohttp 来构造一个最简单的web服务器是非常轻松的事情,只需要下面几行代码就可以搞定: from aiohttp import web import asyncio   def index(request):     return web.Response(body=b'<h1>Hello World!</h1>')   async def init(loop):     app = web.Applic

在Python中调用ggplot的三种方法_python

本文提供了三种不同的方式在Python(IPython Notebook)中调用ggplot. 在大数据时代,数据可视化是一个非常热门的话题.各个BI的厂商无不在数据可视化领域里投入大量的精力.Tableau凭借其强大的数据可视化的功能成为硅谷炙手可热的上市公司.Tableau的数据可视化的产品,其理论基础其实是<The Grammar of Graphic>,该书提出了对信息可视化的图表的语法抽象体系,数据的探索和分析可以由图像的语法来驱动,而非有固定的图表类型来驱动,使得数据的探索过程变得