[Effective WX] 理解wxWindow中增加和去除/销毁子窗口的过程

[Effective WX] 理解wxWindow中的各种size 在wxWidget中,wxWindow有相当多的size,每种size有各种不同的用途,特别是与wxSize联系起来时,就特别容易混淆。这里从代码的角度来理清各种size。 那几种size就是size, min size, max size, best size, virtual size 首先我们来看wxWindowBase类中几个size的数据成员: min size/max s 阅读详情
wxWindow中增加和去除/销毁子窗口的过程:
a) 增加一个子窗口
void wxWindowBase::AddChild(wxWindowBase *child)
{
    wxCHECK_RET( child, wxT("can't add a NULL child") );


    // this should never happen and it will lead to a crash later if it does
    // because RemoveChild() will remove only one node from the children list
    // and the other(s) one(s) will be left with dangling pointers in them
    wxASSERT_MSG( !GetChildren().Find((wxWindow*)child), _T("AddChild() called twice") );


    GetChildren().Append((wxWindow*)child);
    child->SetParent(this);
}

b) 销毁所有的子窗口
bool wxWindowBase::DestroyChildren()
{
    wxWindowList::compatibility_iterator node;
    for ( ;; )
    {
        // we iterate until the list becomes empty
        node = GetChildren().GetFirst();
        if ( !node )
            break;


        wxWindow *child = node->GetData();


        // note that we really want to call delete and not ->Destroy() here
        // because we want to delete the child immediately, before we are
        // deleted, and delayed deletion would result in problems as our (top
        // level) child could outlive its parent
        delete child;


        wxASSERT_MSG( !GetChildren().Find(child),
                      wxT("child didn't remove itself using RemoveChild()") );
    }


    return true;
}


上面直接delete一个子窗口的指针。它会触发子窗口的析构。

   // reset the dangling pointer our parent window may keep to us
    if ( m_parent )
    {
        m_parent->RemoveChild(this);
    }
析构过程中会调用父窗口的RemoveChild函数,用来去除该子窗口,从父窗口的子窗口链表中。

void wxWindowBase::RemoveChild(wxWindowBase *child)
{
    wxCHECK_RET( child, wxT("can't remove a NULL child") );


    GetChildren().DeleteObject((wxWindow *)child);
    child->SetParent(NULL);
}

c) wxWindows的reparent
如果没有指定parent,那么就将这个窗口添加到全局的toplevel windows列表中。
bool wxWindowBase::Reparent(wxWindowBase *newParent)
{
    wxWindow *oldParent = GetParent();
    if ( newParent == oldParent )
    {
        // nothing done
        return false;
    }


    // unlink this window from the existing parent.
    if ( oldParent )
    {
        oldParent->RemoveChild(this);
    }
    else
    {
        wxTopLevelWindows.DeleteObject((wxWindow *)this);
    }


    // add it to the new one
    if ( newParent )
    {
        newParent->AddChild(this);
    }
    else
    {
        wxTopLevelWindows.Append((wxWindow *)this);
    }


    return true;
}

wxWidgets常用组件和布局详解——上 wxWidgets常用组件和布局 阅读详情

相关推荐

wxWidgets:wxWindow类的使用指南

wxWidgets是一个跨平台的C++图形用户界面(GUI)开发框架,它提供了丰富的工具和类来创建各种类型的窗口和控件。其中,wxWindow类是wxWidgets中的基本窗口类,它提供了创建、管理和操作窗口的功能。在上面的代码中,我们创建了一个名为MyWindow的自定义窗口类,它继承自wxWindow。在本篇文章中,我们将详细介绍wxWindow类的使用方法,并提供相应的源代码示例。在上面的代码中,我们创建了一个名为MyApp的应用程序类,它继承自wxApp。希望本文对你有所帮助!希望本文w类的使用。

James_CODER的博客 505

wxWidgets事件(Event)处理(一)

处理函数介绍看源代码include/wx/event.h中如下代码:class WXDLLIMPEXP_BASE wxEvtHandler : public wxObject{..........................................// 立即处理一个事件virtua...

chenkuo4971的博客 1043

wxWidgets:探索wxTopLevelWindow类的用法

在wxWidgets中,wxTopLevelWindow类是一个重要的类,用于创建顶级窗口,例如主窗口、对话框和子窗口。在本文中,我们将探索wxTopLevelWindow类的用法,并提供相应的源代码示例。在上面的示例中,我们在MyFrame类的构造函数中创建了一个wxButton对象,并将其添加到顶级窗口中。在MyFrame的构造函数中,我们调用了wxFrame的构造函数,并传递了相应的参数,包括父窗口(NULL表示没有父窗口)、窗口ID(wxID_ANY表示自动生成ID)和窗口标题。

2301_79365003的博客 173

在win7上安装python3.8 + Robotframework -RIDE,启动报错

报错信息 led at ..\..\src\common\intl.cpp(1694) in wxLocale::GetInfo(): You probably call ed setlocale() directly instead of using wxLocale and now there is a mismatch be tween C/C++ and Windows locale. Things are going to break, please only change locale by

被迫营业的测试员 932

wxWidgets:wxWindow类用法

wxWidgets:wxWindow类用法wxWidgets:wxWindow类用法用法详细说明 wxWidgets:wxWindow类用法 用法详细说明 #include <wx/window.h> wxWindow的继承图 wxWindow是所有窗口的基类,代表屏幕上的任何可见对象。 所有控件、顶级窗口等都是窗口。然而,Sizer 和设备上下文不是,因为它们本身不会出现在屏幕上。 请注意,在删除窗口本身之前,析构函数会自动删除窗口的所有子窗口,这意味着您不必担心手动删除它们。 还要注意,在

希望我的博客,能帮上你解决学习中工作中所遇到的问题 923

如何在 wxWidgets 应用程序中调试 WxWindow?教程与示例代码

当然,在发布版本中,一定要删除或禁用所有与调试相关的代码,以免影响应用程序的性能和安全。wxWidgets 是一个跨平台的 GUI 工具包,它提供了许多方便的类和函数,帮助开发者快速构建跨平台的用户图形界面。需要注意的是,在发布版本中,应该将所有 wxLogDebug 函数调用删除,以免影响应用程序的性能。在开发 wxWidgets 应用程序时,经常需要对 WxWindow 进行调试,以便查找和修复应用程序中的问题。接下来,我们将探讨如何调试 WxWindow 应用程序,并提供相应的代码示例。

带你成为别人眼中的大佬! 304

wxWidgets学习笔记3:wxTopLevelWindowGTK类

wxWidgets库中的Raise()函数用于将窗口置于屏幕的顶部。当窗口被激活时,它将成为焦点窗口,并且将被放置在Z顺序的顶部。在调用Raise()函数之前,必须先确保窗口已经被创建并显示在屏幕上。例如,在一个按钮的事件处理程序中,可以使用以下代码来将窗口提升到顶部: 请注意,如果窗口被最小化或隐藏,Raise()函数将不会起作用。![在这里插入图片描述](https://img-blog.csdnimg.cn/bdcecc3b44534cbc8e1e4eda18e96ea5.png#pic_center

haimianjie2012的专栏 290

子对话框的创建与销毁 - C#编程指南

子对话框是指在一个主对话框窗口内部打开的另一个对话框窗口。在C#编程中,通过创建和销毁子对话框,可以实现更复杂的用户界面和交互逻辑。本篇文章将向您介绍如何在C#中创建和销毁子对话框,并提供相应的源代码示例。希望本篇文章对您理解如何在C#中创建和销毁子对话框有所帮助。通过创建和销毁子对话框,我们可以实现更复杂的用户界面和交互逻辑。销毁子对话框的方法与销毁普通窗口相同,可以使用。在上面的示例中,我们在主对话框中添加了一个名为。在C#中创建子对话框的一种常见方法是使用。的子对话框,并显示在主对话框中。

CyberNova的博客 266

wxWidget窗口基础知识(1)

窗口解析窗口绘制当一个窗口需要重绘的时候,它将收到两个事件,wxEVT_ERASE_BACKGROUND事件用于通知应用程序重新绘制背景, wxEVT_PAINT则用于通知重新绘制前景。颜色和字体每一个窗口都有一个前景色和一个背景色。默认的背景擦除函数会使用背景色来清除窗口背景,如果没有设置背景色,则会使用当前的系统皮肤推 荐的颜色进行背景的清除。前景色则相对来说很少被用到。

黑色星辰 5231

wxWidgets中wxWindow拖动实现方法详解

在上述代码中,我们使用了一个bool变量m_dragging来标记是否正在拖动窗口,以及一个wxPoint变量m_dragPos来保存拖动的起始位置。在拖动过程中,我们通过捕获鼠标移动事件并计算鼠标移动距离来实现窗口的拖动效果。通过重载相应的鼠标事件函数和一些简单的计算,我们可以轻松地实现窗口的拖动功能。要实现窗口的拖动效果,需要对该窗口进行鼠标事件的捕获和处理。在使用wxWidgets编写GUI应用程序时,经常需要对窗口进行拖动操作,以实现用户界面的交互操作。

m0_47037246的博客 367

wxWidgets:wxWindow类实现界面设计和事件处理的完美结合

wxWindow类是wxWidgets中GUI程序的重要组成部分,它实现了界面设计和事件处理的完美结合。在本篇文章中,我们介绍了wxWindow类的使用方法,包括创建窗口、添加控件和处理事件。希望这篇文章能够帮助您更好地理解wxWidgets框架,并用它来开发出更加强大的跨平台GUI应用程序。

. 746

C++GUI之wxWidgets(13)-编写应用涉及的类和方法(8)-事件处理(7)

如果您这样做,请注意您的自定义ID必须为正数,以避免与上面讨论的自动分配的ID冲突,并且不应具有值0或1,这可能会在某些平台下导致令人惊讶的行为。最后,您还需要避免在wxID_LOWEST到wxID_HIGHEST的范围内定义ID,这是为wxWidget定义的ID保留的,有关详细信息,请参阅wxStandardID。仅对自动ID进行引用计数。如果适用,应使用库存ID,如wxID_EXIT(用于菜单项)或wxID_OK(用于按钮),有关此类ID的完整列表,请参阅库存项目。id要取消服务的id范围的起始id。

The research on computer technolog 1047

简易wxWidgets入门示例:基础GUI应用构建

wxWidgets 是一个开源的跨平台C++库,它允许开发者使用同一套代码开发Windows、Mac和Unix等操作系统上的图形用户界面应用程序。作为一个成熟的框架,wxWidgets 为开发者提供了一组丰富的控件,支持多种编程范式,如命令式、事件驱动等。在wxWidgets框架中,任何程序的起点都离不开几个基本的类,尤其是wxApp、wxFrame、wxPanel和wxWindow等。这些类共同构成了程序的基础结构。

weixin_42603332的博客 2194

opencv python destroyAllWindows() destroyWindow() 销毁窗口

destroyAllWindows() def destroyAllWindows(): # real signature unknown; restored from __doc__ """ destroyAllWindows() -> None . @brief Destroys all of the HighGUI windows. 销毁所有HighGUI窗...

Dontla的博客 5025

STM32/GD32以太网开发避坑指南:ZLG EPORTM模块调试实战(含YT8512H配置)

本文针对STM32/GD32平台使用ZLG EPORTM模块进行以太网开发时遇到的常见问题,提供了详细的调试实战指南。重点解析了从传统PHY驱动迁移到YT8512H芯片的核心步骤,包括软件复位延时、RMII时钟配置等关键陷阱,并分享了LWIP集成与稳定性验证的实用经验,帮助开发者高效避坑。

rice5的博客 1161

自动驾驶仿真(二)—— 基于PreScan与Simulink的联合仿真

自动驾驶仿真软件介绍二—— PreScan与Simulink联合仿真1. Prescan仿真软件2. Prescan与Simulink联合仿真2. 1 Prescan和matlab软件安装2. 2 联合仿真配置3. 联合仿真实例3.1 一辆不按法规行驶的小车3.2 另一辆的正常行驶的小车3.3 视觉辅助摄像机3.4 传感器检测4. 系列学习视频教程5. 参考学习的书目教材 上一篇博文简单介绍了Carsim与Simulink联合仿真,接着这篇就再继续简单介绍另一款自动驾驶仿真软件Prescan,并且简单做个P

zhudj08的博客 1万+

Windows使用WxWidgets开发界面(c++)环境搭建

一直想学习wxWidgets,之前使用的都是wxPython,现在终于鼓起勇气学习这个了,发现原来是基于vc6.0开发的。所以最好的学习办法就是安装vistual studio 2010,方便学习看代码。wxWidgets里面也有demo。 基本上wxWidgets是和MFC类似的。 参考:http://www.codeproject.com/Articles/11515/Introd

freewebsys的专栏 6647

从零部署DeepSeek V4 Flash:NVIDIA DGX Spark实战指南

GPU加速计算已成为现代人工智能基础设施的核心,其原理是通过并行处理架构大幅提升深度学习模型的训练与推理效率。在AI工程实践中,NVIDIA GPU凭借CUDA生态和专用驱动栈,为大规模语言模型部署提供了硬件基础。本文聚焦于企业级AI服务器部署场景,针对NVIDIA DGX Spark多节点系统的硬件初始化、驱动兼容性配置、容器化部署等关键环节,提供从系统层到应用层的完整解决方案。通过vLLM推理框架的实战配置,演示如何将DeepSeek V4 Flash模型高效部署于多GPU环境,涵盖Tensor Par

weixin_32296621的博客 377

svn: Can't revert without reverting parent

问题描述: 从svn上checkout代码时, 中途因为网络中断, 没有下载全全部代码, 于是就将那个没下载全的代码整个目录都删掉了. 当第二次重新启动myEclipse, 与资源库同步时, 发现在"Outgoing Mode"下有许多删除标志(减号)的代码, 右击这些代码, 点击还原时, 报出了如下错误 org.apache.subversion.javahl.ClientException

pansanday的专栏 1万+

保姆级教程:用中移ML307模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码

本文详细介绍了如何使用中移ML307系列模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码的全过程。涵盖高德定位服务和OneOS定位服务的配置步骤、常见错误处理及性能优化技巧,帮助开发者快速实现基站定位功能,提升物联网项目的定位精度和稳定性。

weixin_30632089的博客 505

《Autosar_MCAL高阶配置》总目录_培训教程持续更新中...

《Autosar_MCAL高阶配置》总目录_培训教程持续更新中...

「汽车电子助手」的博客 1万+
上一篇: [Happy Coding] 一个正则表达式,支持逻辑和关系运算符组成的表达式计算
下一篇: [Effective WX] wxEvtHandler类相关
zero_lee
博客等级 码龄21年 94粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值