Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在事件(wxwidgets 2.8,windows xp)之后添加wxsizer时,wxsizer在子面板中不起作用_Wxwidgets - Fatal编程技术网

在事件(wxwidgets 2.8,windows xp)之后添加wxsizer时,wxsizer在子面板中不起作用

在事件(wxwidgets 2.8,windows xp)之后添加wxsizer时,wxsizer在子面板中不起作用,wxwidgets,Wxwidgets,我有一个顶层框架(MyFrame类),它有一个子树(MyTreeCtrl类)和一个子面板(MyPanel类)。MyTreeCtrl中存在MyPanel的对象。树中节点上的事件应填充面板。我正在使用面板设置大小调整器,但未设置。当为其父框架设置大小设定器时,将大小设定器设置为面板时,一切正常。但是,当试图在一个单独的函数中设置面板大小时,它不起作用 void MyTreeCtrl::PopulateElementNode(wxTreeItemId &id) { //adding pane

我有一个顶层框架(MyFrame类),它有一个子树(MyTreeCtrl类)和一个子面板(MyPanel类)。MyTreeCtrl中存在MyPanel的对象。树中节点上的事件应填充面板。我正在使用面板设置大小调整器,但未设置。当为其父框架设置大小设定器时,将大小设定器设置为面板时,一切正常。但是,当试图在一个单独的函数中设置面板大小时,它不起作用

void MyTreeCtrl::PopulateElementNode(wxTreeItemId &id)
{

//adding panel control elements and setting its sizer


wxBoxSizer *paneltopsizer = new wxBoxSizer(wxVERTICAL);
(this->mypanel)->SetSizer(paneltopsizer);

this->MyListCtrl=new wxListCtrl(this->mypanel,
    wxID_LISTCTRL,wxDefaultPosition,wxSize(245,100),wxLC_REPORT);
wxButton *Add=new wxButton(this->mypanel,wxID_ADD,wxT("Add"));
wxButton *Delete=new wxButton(this->mypanel,wxID_DELETE,wxT("Delete"));
wxButton *ApplyChanges=new wxButton(this->mypanel,wxID_APPLYCHANGES,wxT("ApplyChanges"));

wxBoxSizer *panelbuttonsizer = new wxBoxSizer(wxHORIZONTAL);
panelbuttonsizer->Add(Add,0,wxALL|wxALIGN_RIGHT,5);
panelbuttonsizer->Add(Delete,0,wxALL|wxALIGN_RIGHT,5);
panelbuttonsizer->Add(ApplyChanges,0,wxALL|wxALIGN_RIGHT,5);
paneltopsizer->Add(this->MyListCtrl,1,wxALL|wxEXPAND,10);
paneltopsizer->Add(panelbuttonsizer,0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);

//panel control ends
}
调用此函数时,将MyTreeCtrl实例设置为具有新的sizer。这将删除可能已分配给MytreeCtrl实例的任何以前的大小调整器(您确定这是您想要的吗?)

除非MytreeCtrl实例稍后接收到调整大小消息,否则它不会执行其他操作。但你可能想让施胶器做点什么,对吧?因此,您必须添加一些代码来执行sizer

一种方法可能是添加

无效MyTreeCtrl::PopulateElementNode()末尾的paneltopsizer->Layout()


现在会发生一些事情。我不知道这是否会是你想要的!我真的不明白您想做什么。

我认为这里的部分问题是,您甚至在用控件填充面板大小调整器之前就设置了面板大小调整器


此外,您应该调用setSizerAndIt(),而不是SetSizer()(注意:在将控件添加到sizer之后,肯定需要这样做),或者在添加sizer和控件之后调用
mypanel->Layout()
(注意:面板的布局方法,而不是sizer)。后一种方法应该可以在添加控件之前设置sizer,但必须在最后进行。在这两种情况下,在添加任何内容之前设置面板的大小调整器都是不合逻辑的。

我正在尝试创建一个基于树的XML编辑器。面板最初未设置大小调整器。我打算在树中的一个节点上发生事件之前保持它的简单性。仅当用户选择一个节点时,才需要设置大小调整器并用其子节点填充面板。使用我的现有代码,面板上(0,0)处仅显示listctrl。当我在void MyTreeCtrl::PopulateElementNode()的末尾给出paneltopsizer->Layout()时,面板上只会出现一个闪烁,它仍然是普通的。当用户选择一个节点时,面板上应该填充该节点的数据-好的,很好。此面板可以是弹出式面板,也可以是应用程序窗口中的永久性面板。在这两种情况下,它都不应该是树控件的子控件。IMHO,试图使包含所选树节点详细信息的面板成为树控件的子级将给您带来无穷的困难。抱歉,如果我把您弄糊涂了。该面板不是树控件的子级。树控件和面板都是顶层框架的子级。我只是在treecontrol类中包含了一个用于通信的panel对象,它不会干扰两者的父级。为了解决这个问题,我修改了代码,添加了一个非窗口类,该类同时包含treecontrol和panel实例,而不是将panel实例包含在treecontrol类中。我这样做是因为panel和treecontrol实例是相关的。即使这样,也不能解决问题。嘿。我找到了解决这个问题的办法。我将树和面板都添加到了一个非窗口类中。我还将面板的sizer(paneltopsizer)添加到了这个类中。然后我可以在设置顶层框架控件的同时将paneltopsizer设置为面板。这也允许我在稍后阶段设置面板的子级。
(this->mypanel)->SetSizer(paneltopsizer);