基本思路 定义窗口类-为类赋初始值-注册类-使用类创建窗口-显示窗口-更新窗口-创建消息循环
-等待消息。其中涉及一些命名约定都是基于C语言版本的 有这些背景知识程序无需太多注释。后期继续加入菜单
我的在Windows10系统测试通过
import win32gui import win32con import ctypes import ctypes.wintypes user32 = ctypes.windll.user32 #--------因为python是解释型语言 所以回调函数最先创建---------------------------------------- def windowProc(hwnd, msg, wParam, lParam): #-----------使用if风格的回调函数 显示立体边框------------------ # if msg == win32con.WM_DESTROY: # win32gui.PostQuitMessage(0) # return 0 # else: # print("消息编号",msg) # print("w参数",wPrame) # print("l参数",lParam) # return win32gui.DefWindowProc(hwnd, msg, wParam, lParam) #-----------使用这种语句 显示老式风格的边框----------------- match msg: case win32con.WM_CREATE: print("窗口第一次创建") return 0 case win32con.WM_PAINT: print("接收到绘制消息",msg) hdc,ps=win32gui.BeginPaint(hwnd) print(ps) # hdc=win32gui.GetDC(hwnd) rect=win32gui.GetClientRect(hwnd) win32gui.DrawTextW(hdc,"hello中国",len("hello中国"),rect,win32con.DT_SINGLELINE | win32con.DT_CENTER | win32con.DT_VCENTER) # win32gui.ReleaseDC(hwnd,hdc) win32gui.EndPaint(hwnd,ps) return 0 case win32con.WM_DESTROY: win32gui.PostQuitMessage(0) return 0 return win32gui.DefWindowProc(hwnd, msg, wParam, lParam) className = 'MyWindowClass' #---------第一步 初始化类结构-python版本和C语言版本有一定的不同 某些域没有cbClsExtra----------------------------------------- wndClass = win32gui.WNDCLASS() wndClass.cbWndExtra=0 wndClass.style = win32con.CS_HREDRAW | win32con.CS_VREDRAW #每当窗口水平方向或垂直方向尺寸发生改变后 要完全刷新窗口 wndClass.lpfnWndProc = windowProc #这个过程要处理基于这个窗口类创建的所有窗口的全部消息 使用函数名 实际引用提供指向函数的指针 wndClass.hInstance = win32gui.GetModuleHandle(None) #程序的实例句柄 wndClass.hCursor = win32gui.LoadCursor(None, win32con.IDC_ARROW) #使用预定义图标 第一个参数为None 使用自定义图片 第一个参数为程序的实例句柄 wndClass.hbrBackground = win32con.COLOR_WINDOW #win32gui.GetStockObject(win32con.WHITE_BRUSH) 或者获取图像对象#将窗口客户区边界设置为指定颜色 wndClass.lpszClassName = className #--------第二步 注册类--------------------------------------------- wndClassAtom = win32gui.RegisterClass(wndClass) #-------第三步 创建程序主窗口------------------------------------------------- hwnd = win32gui.CreateWindow(className, "我的窗口", win32con.WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, None, None, win32gui.GetModuleHandle(None), None) #---------第四步 显示并更新窗口 win32gui.ShowWindow(hwnd, win32con.SW_SHOW) win32gui.UpdateWindow(hwnd) #-------第五步 创建消息结构体并建立消息循环 ------------------------------- msg = ctypes.wintypes.MSG() wPrame=None lparame=None #手动调用一次回调函数 python调试时中不自动执行创建初始化 windowProc(hwnd,win32con.WM_CREATE,0,0) #第六步 自动执行消息队列 msg由操作系统自动生成 传递给你的程序 while user32.GetMessageW(ctypes.byref(msg), None, wPrame, lparame) != 0: user32.TranslateMessage(ctypes.byref(msg)) user32.DispatchMessageW(ctypes.byref(msg))
效果如下图: