博客
关于我
wxWidgets源码分析(5) - 窗口管理
阅读量:473 次
发布时间:2019-03-06

本文共 2099 字,大约阅读时间需要 6 分钟。

窗口管理与创建过程

在wxWidgets开发中,窗口管理是核心的功能之一。所有的窗口都继承自wxTopLevelWindows,这一基类在Windows系统中负责管理所有顶层窗口。wxTopLevelWindows是一个全局变量,用于存储和管理所有顶层窗口的引用。

Frame窗口创建过程

当我们需要创建一个Frame窗口时,通常会继承自wxFrame,并通过调用Create方法来实现。此方法的实现通常是通过调用wxTopLevelWindow::Create来完成窗口的创建。以下是wxFrame的继承关系:

wxFrame -> wxFrameBase -> wxTopLevelWindow -> wxTopLevelWindowMSW -> wxTopLevelWindowBase -> wxNonOwnedWindow -> wxWindow

需要注意的是,wxTopLevelWindowNative是一个宏定义,在include/wx/toplevel.h中定义:

#if defined(__WXMSW__)    #include "wx/msw/toplevel.h"    #define wxTopLevelWindowNative wxTopLevelWindowMSW#endif

在创建窗口时,wxFrame会调用wxTopLevelWindow::Create,具体实现如下:

bool wxFrame::Create(wxWindow *parent, wxWindowID id) {    if (!wxTopLevelWindow::Create(parent, id, wxEmptyString, wxDefaultPosition, ...)) {        return false;    }    // ... 其他初始化代码 ...}

wxTopLevelWindow::Create方法主要负责将窗口添加到wxTopLevelWindows队列中,并初始化窗口的基础参数。接着,根据窗口类型调用CreateDialog或CreateFrame来完成具体窗口的创建。

CreateFrame实现

CreateFrame方法的实现通常是通过调用wxTopLevelWindowMSW::CreateFrame来完成的,这个方法最终会调用MSWCreate来创建窗口。MSWCreate会根据窗口的类型和风格,调用Win32 API的CreateWindowEx函数来创建窗口,并返回窗口的HANDLE。

bool wxTopLevelWindowMSW::CreateFrame(const wxString &title, const wxPoint &pos, const wxSize &size) {    // 获取窗口类名和其他参数    wxWindowCreationHook hook(this);    m_hWnd = (WXHWND)CreateWindowEx(extendedStyle, className.t_str(), ...);    SubclassWin(m_hWnd);    return true;}

需要注意的是,在创建窗口之前,需要确保该窗口类已经注册。如果窗口类没有注册,会导致无法正常创建窗口。注册窗口类的过程通常是在应用启动时进行的。

窗口全局管理

wxWidgets通过全局的HashMap gs_windowHandles来管理窗口与HWND的关联。每当一个窗口被创建时,会调用SubclassWin方法,将 HWND 和 wxWindow 的指针进行关联。

void wxWindowMSW::SubclassWin(WXHWND hWnd) {    wxAssociateWinWithHandle(hwnd, this);    wxWindowCreateEvent event((wxWindow *)this);    HandleWindowEvent(event);}

同时,在消息处理函数wxWndProc中,也会进行窗口与HWND的关联,以确保消息能够正确地发送到对应的wxWindow对象。

为何会出现在两个地方?

在Windows系统中,窗口创建后会立即收到消息,此时会调用wxWndProc来处理消息。为了确保窗口能够正确关联,SubclassWin方法会在窗口创建完成后进行关联。而在wxWndProc中,如果窗口尚未关联,则会通过全局变量gs_winBeingCreated进行关联。

这种双重关联机制确保了窗口在任何情况下都能正确地与其对应的HWND关联,从而保证消息的正确传递和处理。

总结

wxWidgets通过其窗口管理机制,有效地将Windows系统的Win32API与用户代码隔离开来,提供了一套高级的GUI开发框架。这种机制不仅屏蔽了底层的API细节,还通过全局的窗口管理和消息处理机制,确保了窗口的生命周期管理和消息的正确传递。

转载地址:http://voyfz.baihongyu.com/

你可能感兴趣的文章
python numpy矩阵索引_python – 在2D numpy ndarray或numpy矩阵中获取前N个值的索引
查看>>
python os.system
查看>>
Python os.system执行多条语句,os.system的返回值以及与os.popen的区别
查看>>
Python os和sys模块
查看>>
python os文件/目录
查看>>
Python Package 之 Faker(随机姓名、电话)
查看>>
python运算符优先级
查看>>
Python Panda TIME 系列重新采样
查看>>
python pandas TimeStamps到夏令时的本地时间字符串
查看>>
Python pandas 数据清洗与数据绘图实战
查看>>
Python Pandas 用顶行替换标题
查看>>
Python pandas 通过 dt 访问器有效地将日期时间转换为时间戳
查看>>
Python Pandas-从DataFrame按类别绘制多个条形图
查看>>
Python Pandas:每月或每周拆分 TimeSerie
查看>>
python pandas中融化的对面
查看>>
python pandas从时间序列中提取唯一日期
查看>>
Python PyQt5 将不再显示此消息复选框添加到 QMessageBox
查看>>
Python PyQt5:如何使用 PyQt5 显示错误消息
查看>>
Python PYSFTP-以字符串/文本形式传递私钥,而不是传递文件路径
查看>>
Python pytest 面试题!
查看>>