用java创建窗口程序,创建窗口的应用程序

创建窗口的应用程序

通过前面的基础知识的学习,已经对ctypes库的基本功能学会了使用,为了加强这种知识训练,以及运用刚学习的知识的快乐,我们来创建一个稍稍复杂一点的应用程序。这个应用程序是所有后面应用程序的基础,只有学会这个程序的基本原理,才可以更进一步学习WIN32的API程序开发。更何况后面所有程序都会在这个程序上修改而成,这个就相当你的爬向高楼顶层的第一个台阶。在所有工程技术里,都会从一个小小的演示程序开始,逐渐地增加功能,慢慢地变成一个强大的应用程序。如果发现这些API函数不清楚,可以参考我写的另外一本书《Windows API一日一练》,在那本书里有完整的介绍和例子,不过这些例子使用C++来编写的。

下面就来开始浏览整个程序的功能吧,第一步是先把ctypes库导入,这样才可以使用它的功能,并且还导入ctypes.wintypes,它有对应WIN32的类型,这样使用起来更方便,比如消息结构MSG。这段代码如下:

#windows应用程序

from ctypes import *

from ctypes.wintypes import *

接着下来定义一个Windows的窗口回调函数的原型,因为Windows指定了每个窗口都需要有一个窗口消息函数来处理窗口所有发生的事件消息,这样你写的应用程序才有机会去响应窗口所发生的事件或操作。这行代码如下:

WNDPROCTYPE = WINFUNCTYPE(c_int, HWND, c_uint, WPARAM, LPARAM)

由于WIN32的定义常量全部是在C语言的头文件里定义,要想在Python中直接使用是不行的。目前只有两种方法,一个是使用一个转换程序,把所有SDK里提供的头文件进行转换为Python定义的形式的模块文件;另外一个就是自己使用到那些,就定义那些常量。本例子里,采用的是最后一种方法,使用到那些就定义就定义那些常量,这样做是为了这个例子保持简单,这些常量定义如下:

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

在这些常量主要是窗口的格式、样式、以及显示方式,还有一个消息定义和画笔。由于每个新创建的窗口都需要在Windows里注册唯一的名称,以便创建时从系统内存里找到相应的窗口类,所有其它窗口可以以这个窗口为基本模板,复制N个相同的出来。每个窗口还有一个主题名称,又叫做窗口名称,这两个定义常量如下:

#窗口类的名称

wclassName = u'ShenzhenCai'

wname = u'Hello World'

第一个常量窗口类名称,第二个常量是窗口显示的标题。

窗口的格式、样式通过定义一个结构的方式传递给WIN32的API函数,在这里定义窗口类的结构体如下:

#定义窗口类结构

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)]

这个窗口类的结构体与C语言里描述的结构体是一样的,通过这样定义,就可以给窗口说明窗口的类型了。具体每项的值,请参考《Windows API一日一练》。接着下来,查看窗口回调函数,这里定义了处理窗口收到消息。主要处理了当窗口关闭(WM_DESTROY)时就退出程序。调用API函数PostQuitMessage发送消息给主程序循环,需要结束应用程序了。其它的消息都是调用API函数DefWindowProcW来做默认的处理。

#窗口消息处理回调函数

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

接着下来是设置窗口类的属性,注册窗口的类型,以便后面可以创建这个窗口,这里主要是调用函数RegisterClassExW来实现。同时这里把前面的回调函数WndProc、程序实例句柄hInst、窗口类名称wclassName组合一起了。

#初始化主窗口

def initwinclass(hInst, WndProc):

wndClass = WNDCLASSEX()

wndClass.cbSize = sizeof(WNDCLASSEX)

wndClass.style = CS_HREDRAW | CS_VREDRAW

wndClass.lpfnWndProc = WndProc

wndClass.cbClsExtra = 0

wndClass.cbWndExtra = 0

wndClass.hInstance = hInst

wndClass.hIcon = 0

wndClass.hCursor = 0

wndClass.hBrush = windll.gdi32.GetStockObject(WHITE_BRUSH)

wndClass.lpszMenuName = 0

wndClass.lpszClassName = wclassName

wndClass.hIconSm = 0

return windll.user32.RegisterClassExW(byref(wndClass))

窗口的回调函数已经定义,窗口类型又已经注册,接着下来就是创建窗口,并把窗口显示出来了,代码如下:

#主函数入口

def main():

hInst = windll.kernel32.GetModuleHandleW(None)

WndProc = WNDPROCTYPE(PyWndProc)

if initwinclass(hInst, WndProc) <= 0:

return False

hWnd = windll.user32.CreateWindowExW(

0, wclassName, wname,

WS_OVERLAPPEDWINDOW | WS_CAPTION,

CW_USEDEFAULT, CW_USEDEFAULT,

800, 600, 0, 0, hInst, 0)

if not hWnd:

print('Failed to create window')

exit(0)

windll.user32.ShowWindow(hWnd, SW_SHOW)

windll.user32.UpdateWindow(hWnd)

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.')

在这个主函数里,融合前面介绍内容。如果对前面介绍都比较了解,那么在这里就很容易理解它,如果还是不懂,请再查看前面的内容,多练习一下。GetModuleHandleW函数是用来获取当前进程的实例句柄,WNDPROCTYPE是用来转换回调函数,initwinclass函数是用来初始化窗口类型并注册,CreateWindowExW函数是用来创建窗口,ShowWindow函数是用来显示窗口出来,UpdateWindow是用来刷新窗口的显示客户区,pointer函数是用来转换消息指针,GetMessageW函数是获取窗口的消息,TranslateMessage函数是用来转换消息,DispatchMessageW函数是把转换后的消息发送到消息队列。通过创建窗口、显示窗口及更新窗口这三步曲,就完成窗口的显示。后面通过消息循环处理,响应了窗口所有的事件处理。最后还差一个触发这个主函数main的方式,它的实现如下:

if __name__ == "__main__":

print( "Win32 Application in python" )

main()

这里使用了Python的一个特性,当本文件最先运行加载时,就会设置当前文件运行的名称为__main__属性,这样就会调用main函数运行了。当你运行这个例子时,最激动人心的时刻到来了,它运行的结果如下:

efc636a0b78d4ce5e00f92fed028d3b5.png编程已经是目前的主流方向,正在学习编程的小伙伴们努力、加油吧。

http://www.dengb.com/Javabc/866195.htmlwww.dengb.comtruehttp://www.dengb.com/Javabc/866195.htmlTechArticle创建窗口的应用程序 通过前面的基础知识的学习,已经对ctypes库的基本功能学会了使用,为了加强这种知识训练,以及运用刚学习的知识的...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬取b站排行榜_实时爬取B站排行榜并保存为表格——每周一个爬虫小教程系列...

从这周开始&#xff0c;每周来一个爬虫小教程&#xff0c;希望对你们有所帮助&#xff0c;这次的目标是B站排行榜至于爬取什么内容&#xff0c;目前感觉就把序号&#xff0c;名称以及评分爬取下来吧&#xff08;因为我是边写教程边写代码的&#xff09; 这次需要用到的知识&…

css 垂直居中_html中div使用CSS实现水平/垂直居中的多种方式

CSS中的居中&#xff0c;在工作中&#xff0c;会经常遇到。它可以分为水平居中和垂直居中&#xff0c;以下是几种实现居中的方式。以下例子中&#xff0c;涉及到的CSS属性值。.parent-frame { width: 200px; height: 200px; border: 1px solid red; } .child-frame { width…

php表白情话,朋友圈唯美表白短句情话 适合发朋友圈的情话

1、一个人经历了所有的苦难&#xff0c;也不要指望能和谁在一起&#xff1b;我曾经真诚的尝试过&#xff0c;但是结果我不想说。2、只要你愿意&#xff0c;只要我有&#xff0c;整个世界都是你的&#xff0c;而你只能是我的。3、只要你愿意&#xff0c;当你失落失意的时候&…

高德地图看各省分界线_深度解读|高德宣布高精地图“百元时代”背后的商业逻辑是什么...

车展前夕&#xff0c;高德的一次媒体沟通会&#xff0c;或许将为国内自动驾驶的发展带来深远影响。4月11日&#xff0c;高德地图在北京举行“高精宣言”媒体沟通会&#xff0c;表示将对高精地图服务进行升级&#xff0c;并以成本价格提供标准化高精地图&#xff0c;与合作伙伴分…

js获取ip地址_(原创)Node.JS实战31:大名鼎鼎的Express!

Express &#xff08;http://expressjs.com&#xff09;是Node.JS中一个简洁、灵活、强大的Web应用框架&#xff0c; 它提供了一系列强大特性&#xff0c;可以帮助我们快速创建各种Web 应用&#xff0c;也可用来编写各种的Web工具。Express博大精深&#xff0c;本文在此只做简单…

mysql跳过安全_Navicat连接MySQL数据库

前言:在使用Gin架构搭建博客的时候,需要设计数据库,以及连接数据库.命令端口操控效率实在是太低且不好管理,这个时候使用Navicat就能轻松高效的使用数据库了.步骤:下载安装Navicat,Mysql配置Mysql及其账号密码 Navicat连接Mysql1.下载安装Navicat,MysqlNavicat官网下载地址:…

java 切面_实用|AOP切面编程手段大汇总

点击上方"欧学长的架构成长之路" 关注我前言首先说一下什么是AOP&#xff1f;AOP就是面向切面编程&#xff0c;它是一个思想&#xff0c;通过切面&#xff0c;我们可以将那些反复出现的代码抽取出来&#xff0c;放在一个地方统一处理&#xff0c;提高代码的复用性。A…

php可以控制硬件吗,控制面板的作用是设置硬件接口吗?

错误&#xff0c;控制面板的作用是对系统进行有关的设置。控制面板是一个系统文件夹&#xff0c;用来提供各种对计算机系统进行设置和管理的工具&#xff1b;使用控制面板可以对系统进行设置与管理&#xff0c;例如设置系统环境参数的默认值和属性&#xff0c;添加新的应用程序…

不知道工作组名称怎样加入_剩米饭不知道怎样做?试试泡菜炒饭,再也不用担心米饭做多了...

剩米饭不知道怎样做&#xff1f;试试泡菜炒饭&#xff0c;再也不用担心米饭做多了东北的朋友这几天连续经历了春天&#xff0c;初夏和冬天&#xff0c;甚至在一天中看到了雪、雨和冰雹。这变化莫测的天气让大家一时间慌了神&#xff0c;不知到底要穿些什么。由于楼上都已经停了…

php元素浮动会产生哪些影响,css浮动带来什么问题

css浮动带来的影响&#xff1a;1、由于浮动元素脱离了文档流&#xff0c;所以父元素的高度无法被撑开&#xff0c;影响了与父元素同级的元素&#xff1b;若没有给父元素设置高度&#xff0c;那么父元素就不会在显示屏上显示。2、浮动元素不再占用原文档流的位置&#xff0c;它会…

linux将字符串转小写_小猿圈总结Linux常见命令(一)

科技发展的今天&#xff0c;互联网不断的发达&#xff0c;很多人学习Linux云计算的时候回因为记不住一些命令从而去找度娘&#xff0c;有时候因为因为找不到linux的命令而烦恼&#xff0c;下面是小猿圈linux讲师给大家总结的linux常见命令&#xff0c;希望对你有所帮助。1、cd命…

cnpm安装webpack_Webpack(一)介绍

一、Webpack是什么、为什么要使用它简单来说&#xff0c;Webpack是一个打包工具。站在2018年的角度&#xff0c;成为一个优秀的前端工程师&#xff0c;除了要会写页面样式和动态效果之外&#xff0c;还需要会用主流的单页面框架、Node.js、简单的前端的性能优化等等。加上现在一…

bytes数组转string指定编码_一篇文章弄懂Python中所有数组数据类型

前言数组类型是各种编程语言中基本的数组结构了&#xff0c;本文来盘点下Python中各种“数组”类型的实现。listtuplearray.arraystrbytesbytearray其实把以上类型都说成是数组是不准确的。这里把数组当作一个广义的概念&#xff0c;即把列表、序列、数组都当作array-like数据类…

sklearn保存svm分类模型_【菜菜的sklearn】07 支持向量机(上)

小伙伴们大家好~o(&#xffe3;▽&#xffe3;)ブ&#xff0c;我是菜菜&#xff0c;这里是我的sklearn课堂第7期&#xff0c;今天分享的内容是支持向量机&#xff08;上&#xff09;&#xff0c;下周还有下篇哦~我的开发环境是Jupyter lab&#xff0c;所用的库和版本大家参考&a…

unity 敌人自动攻击和寻路_Unity暑期萌新入门:环境篇

大家好&#xff0c;新一期又跟大家见面了。上一节我们完成了角色的移动控制&#xff0c;然而John只能在空白的场景中移动。因此接下来这一节我们将添加关卡、调节光照&#xff0c;让John来到阴森的鬼屋。然后设置NavMesh(导航网格&#xff0c;现在先听个概念就好)&#xff0c;为…

element 表格宽度自适应_Java 设置Word中的表格自适应的3种方式

概述在Word创建表格时&#xff0c;可设置表格“自动调整”&#xff0c;有3种情况&#xff0c;通过Java程序设置可调用相应的方法来实现&#xff0c;即&#xff1a;根据内容调整表格AutoFitBehaviorType.Auto_Fit_To_Contents根据窗口调整表格AutoFitBehaviorType.Auto_Fit_To_W…

源码里没有configure_深入源码理解.NET Core中Startup的注册及运行

开发.NET Core应用&#xff0c;直接映入眼帘的就是Startup类和Program类&#xff0c;它们是.NET Core应用程序的起点。通过使用Startup&#xff0c;可以配置化处理所有向应用程序所做的请求的管道&#xff0c;同时也可以减少.NET应用程序对单一服务器的依赖性&#xff0c;使我们…

oracle查询慢怎么优化,Oracle查询优化-怎样建立索引优化下面的查询语句啊

下面是转换出来的查询语句SELECT *FROM (SELECT "Project1"."C1" AS "C1","Project1"."ID" AS "ID","Project1"."NVC_ORDERBY" AS "NVC_ORDERBY","Project1"."I_ST…

复试情报准备

英语自我介绍&#xff0c;介绍完老师会根据你的回答用英语问你问题&#xff0c;比如介绍一下你的本科学校&#xff0c;或者家乡什么的。计网过一遍&#xff0c;会问两道题。接下来是重点&#xff0c;我当时是根据我成绩单&#xff0c;问了我本科学过的科目&#xff0c;比如pyth…

oracle创建索引01652,建立数据表快照导致ora-01652异常

建立数据表快照导致ora-01652错误由于源表过大&#xff0c;数据查询速度较慢&#xff0c;在做后台的相关查询的时候较慢&#xff0c;于是决定创建数据快照&#xff0c;提高查询速度&#xff0c;快照创建语句如下&#xff1a;CREATE SNAPSHOT sn_ydmobilebankREFRESH COMPLETE S…