import win32con,win32gui
class MyWindow():
def __init__(self):
#注册一个窗口类
wc = win32gui.WNDCLASS()
wc.lpszClassName = 'MyWindow'
wc.hbrBackground = win32con.COLOR_BTNFACE+1 #这里颜色用法有点特殊,必须+1才能得到正确的颜色
wc.lpfnWndProc = self.wndProc #可以用一个函数,也可以用一个字典
class_atom=win32gui.RegisterClass(wc)
#创建窗口
self.hwnd = win32gui.CreateWindow(
class_atom, u'窗口标题', win32con.WS_OVERLAPPEDWINDOW,
win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
0,0, 0, None)
#显示窗口
win32gui.ShowWindow(self.hwnd, win32con.SW_SHOWNORMAL)
#消息处理
def wndProc(self, hwnd, msg, wParam, lParam):
if msg == win32con.WM_SIZE: print 'message: WM_SIZE'
if msg == win32con.WM_PAINT: print 'message: WM_PAINT'
if msg == win32con.WM_CLOSE: print 'message: WM_CLOSE'
if msg == win32con.WM_DESTROY:
print 'message: WM_DESTROY'
win32gui.PostQuitMessage(0)
return win32gui.DefWindowProc(hwnd, msg, wParam, lParam)
mw = MyWindow()
win32gui.PumpMessages()

对应的C代码可以参考下面文章:

Your First Windows Program

Python和上面的C基本上是一样的,只有以下细微区别:

1. win32gui.PumpMessages()

这里win32gui.PumpMessages()实际上取代了下面的C代码

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

2. WNDCLASS.lpfnWndProc

lpfnWndProc既可以像C那样接受一个函数地址,也可以接受一个dict对象,用于映射具体的消息和针对的函数

wc.lpfnWndProc = {
win32con.WM_SIZE: self.OnSize,
win32con.WM_PAINT: self.OnPaint,
win32con.WM_CLOSE: self.OnClose,
win32con.WM_DESTROY: self.OnDistroy,
}
def OnSize(self, hwnd, msg, wparam, lparam):
print 'message: WM_SIZE'
def OnPaint(self, hwnd, msg, wparam, lparam):
print 'message: WM_PAINT'
def OnClose(self, hwnd, msg, wparam, lparam):
print 'message: WM_CLOSE
def OnDestroy(self, hwnd, msg, wparam, lparam):
print 'message: WM_DESTROY'
PostQuitMessage(0)

pywin32的文档不太全,好在C:\Python27\Lib\site-packages\win32\Demos中有很多示例代码

pywin32 创建一个窗口的更多相关文章

  1. Linux OpenGL 实践篇-2 创建一个窗口

    OpenGL 作为一个图形接口,并没有包含窗口的相关内容,但OpenGL使用必须依赖窗口,即必须在窗口中绘制.这就要求我们必须了解一种窗口系统,但不同的操作系统提供的创建窗口的API都不相同,如果我们 ...

  2. 【pygame游戏编程】第一篇-----创建一个窗口

    下面我们一起来创建一个背景为蓝色的窗口作为游戏编程的开始: import sys import pygame def creat_screen(): #初始化pygame pygame.init() ...

  3. OpenGL编程逐步深入(一)创建一个窗口

    原文地址:http://ogldev.atspace.co.uk/ 原文中使用gnu make进行项目管理,本系列文章使用visual studio2012.在翻译过程中并非直译,加入了一些笔者个人观 ...

  4. C语言创建一个窗口提示

    打开Vs2012[我的是2012] /* X下面这些东西并没有什么用... 就不改了用2013 2015都一样 当然 devC++ 还有最原始的那个vc6.0也都是可以的. 编译环境遇到了相关问题网上 ...

  5. Java 创建一个窗口,使其启动时位于屏幕中间

    import java.awt.Toolkit; import javax.swing.JFrame; public class WindowInTheMiddle extends JFrame { ...

  6. (7)nehe教程1 创建一个OpenGL窗口:

    不要用那个nehe ndk了 误人子弟! 转自: 一个窗口,代码可真多啊 http://www.yakergong.net/nehe/ 在这个教程里,我将教你在Windows环境中创建OpenGL程序 ...

  7. 我的Go语言学习之旅七:创建一个GUI窗口

    在上次中,刚刚学过了  弹窗效果.这里再接着学习一下怎样创建一个窗口. 还是老路子,先上代码: package main import ( "github.com/lxn/go-winapi ...

  8. IE 中创建 子窗口 传值 与接收值 【window.showModalDialog】

    父窗口 创建一个窗口 var backinfo = window.showModalDialog('UserSelect.aspx', '', 'dialogHeight=600px; dialogW ...

  9. Android创建窗口(一)创建应用窗口

    所谓的窗口(Window)就是一个显示在手机屏幕上可视化视图的一片区域.在Android中窗口是一个抽象的概念,每一个Activity就对应着一个窗口,而所有的窗口都是由视图(View)来呈现,而我们 ...

随机推荐

  1. Spring 下默认事务机制中@Transactional 无效的原因

    Spring中 @Transactional 注解的限制1. 同一个类中, 一个nan-transactional的方法去调用transactional的方法, 事务会失效 If you use (d ...

  2. SpringMVC(五) RequestMapping 请求参数和请求头

    可以通过在@RequestMapping的params参数中设置可以传入的参数,且支持简单的表达式,如以下格式: @RequestMapping(value="helloRWorld&quo ...

  3. [LeetCode] Burst Balloons 打气球游戏

    Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...

  4. [LeetCode] Delete Node in a Linked List 删除链表的节点

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  5. [LeetCode] Longest Palindromic Substring 最长回文串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  6. vs2013中2.0类库提示是英文,解决方案

     将C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\zh-Hans下的XML文件复 ...

  7. SQL基础语法(五)

    SQL INSERT INTO 语句INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法:INSERT INTO 表名称 VALUES (值1, 值2,....) ...

  8. 冰冻三尺非一日之寒--web框架Django(三)

      第二十章: django(三,多对多)   1.Django请求的生命周期         路由系统 -> 视图函数(获取模板+数据-->渲染) -> 字符串返回给用户   2. ...

  9. c# ip内外网判断

    /// <summary> /// 判断IP地址是否为内网IP地址 /// </summary> /// <param name="ipAddress" ...

  10. Python 【第五章】:线程、进程和协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...