Wine & Windows窗口消息机制
Windows应用消息驱动编程模型
HelloWorld应用
固定套路:
①注册窗口类:指定类名、消息处理函数
②创建窗口:指定类名
②创建窗口:指定类名
③设置窗口显示状态
④更新指定窗口客户区
⑤从线程消息队列获取消息,无消息则阻塞
⑥分发消息:回调类指定的WndProc
Windows应用消息驱动编程模型
DispatchMessage中回调通过类注册的消息处理函数WndProc,用来处理消息
核心:黄色标注的6个Win32 API
Wine运行该HelloWorld应用
如上HelloWorld应用
主要内容
支撑理论
支撑理论
Windows窗口类型、窗口从属关系、窗口层次关系;
ForegroundWindow、BackGroundWindow、ActiveWindow、FocusWindow;
Z-Order、ATOM表、Windows硬件输入模型;
Session / WinStation / Desktop / Desktop Window;
源码分析
WinSton、Desktop、DesktopWindow的创建;
核心API:RegisterClassEx、DispatchMessage、GetMessage、CreateWindowEx
、ShowWindow、UpdateWindow等核心API源码分析;
如何表达函数调用关系
方法1:UML图,专业但画图太耗时;
方法2:如下,用一个Tab键,代表函数一级调用或回退
本PPT源码分析采用方法2;
窗口类型
窗口类型:
可重叠窗口:是App的主窗口,通常具有标题栏、边框、客户区等,style =
WS_OVERLAPPEDWINDOW ;
WS_OVERLAPPEDWINDOW ;
弹出式窗口:特殊的可重叠窗口,往往用作消息框、对话框等,style=WS_POPUP;
子窗口:其有父窗口,受限于父窗口的客户区域,style=WS_CHILD;
层次窗口:实现不规则的窗口,或窗口有动画、
半透明等效果,exStyle=WS_EX_LAYERED;
消息窗口:仅用于发送接收消息,不可见;
style与exStyle还可取很多其它值:
WS_MAXIMIZE
WS_MINIMIZE
WS_SYSMENU
WS_VISIBLE
WS_CAPTION
WS_BORDER
……
窗口类型
实验1: CreateWindow(L"CLS”, L"HELLO”, WS_OVERLAPPEDWINDOW
,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);
现象:有标题栏、菜单栏,最大化、最小化、关闭按钮,窗口大小可拖拽,如下图:
本质原因:
窗口类型
实验2: CreateWindow(L”CLS”, L"HELLO”,
WS_OVERLAPPED,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL,
hInst, NULL);
现象:有标题栏、菜单栏,但没有最大化、最小化、关闭按钮,窗口大小不能拖拽,
如下图;