C++ 什么会导致TreeView_插入项失败?
在一些计算机上(意味着大多数计算机都可以),当向树控件添加项时,出于某种原因C++ 什么会导致TreeView_插入项失败?,c++,windows,treeview,wxwidgets,C++,Windows,Treeview,Wxwidgets,在一些计算机上(意味着大多数计算机都可以),当向树控件添加项时,出于某种原因TreeView\u InsertItem返回NULL()。 不幸的是,MSDN站点没有指定设置了错误代码(事实上,调用只会告诉我:0=操作已成功完成)。 它也没有具体说明什么可能导致失败或如何处理失败 所以我想知道是否有人以前遇到过这种情况,或者对如何调试这个问题有什么建议 这些机器都运行Windows 7 免责声明:我实际上正在浏览wxWidgets,但我们已经深入研究了代码,问题似乎在于windowsapi级别,而
TreeView\u InsertItem
返回NULL
()。
不幸的是,MSDN站点没有指定设置了错误代码(事实上,调用只会告诉我:0=操作已成功完成
)。
它也没有具体说明什么可能导致失败或如何处理失败
所以我想知道是否有人以前遇到过这种情况,或者对如何调试这个问题有什么建议
这些机器都运行Windows 7
免责声明:我实际上正在浏览wxWidgets
,但我们已经深入研究了代码,问题似乎在于windowsapi
级别,而不是wx
本身
更新:
基本上,这个想法是,您从这个类继承,然后实现populate,它只调用AddItem()
。还有一个版本的AddItem()
用于指定根项,但是由于我第一次调用Append()
失败,它的存在没有帮助。
树是在wxFormBuilder
中创建的,带有以下标志:wxTR\u默认\u样式,wxTR\u有\u按钮,wxTR\u隐藏\u根,wxTR\u根上的行,wxTR\u单
这在我自己的电脑上也能很好地工作
ItemSelector::ItemSelector( wxWindow* parent )
: m_tree( NULL ),
m_initialised( false )
{
wxXmlResource::Get()->LoadFrame( this, parent, wxT( "ItemSelector" ) );
m_tree = XRCCTRL( *this, "itemTree", wxTreeCtrl );
m_rootItem = m_tree->AddRoot( wxT( "ROOT" ) );
Bind( wxEVT_SHOW, &ItemSelector::OnShow, this );
MakeModal( true );
}
void ItemSelector::OnShow( wxShowEvent& event )
{
if( event.IsShown() )
{
if( !m_initialised )
{
Populate();
m_initialised = true;
}
m_tree->SetFocus();
Layout();
}
}
void ItemSelector::AddItem( const wxString& name, void* someData )
{
//Also tried m_tree->AppendItem( m_rootItem, wxT( "Test" ) ) - same problem
wxTreeItemId newItem = m_tree->AppendItem( m_rootItem, name, -1, -1, new TreeDataClass( someData ) );
}
我看不出你的代码中有什么真正的错误,但这很奇怪。首先,为什么你调用弃用的
MakeModal()
,而不是将你的类设为wxDialog
,并使用它的ShowModal()
?其次,为什么要等到wxEVT\u SHOW
来填充控件,而不是立即执行
我建议您按照指示简化代码,我认为问题会消失。如果您感到好奇,您可以将您的更改一分为二,以找到真正的原因。问题似乎是由于我在
wxEVT\u SHOW
事件中调用了Populate()
我发现这一定是一个已知的问题,因为
wxDialog
有一个[wxEVT\u INIT\u DIALOG][1]
事件,正是出于这个目的TreeView\u InsertItem所做的就是向控件发送消息(实际上是通过)这可能会导致很多问题,主要是基于表示控件的窗口句柄的状态;Code=doeswoods.Show please是一个纯虚拟函数,因此无法从构造函数调用。我认为wxEVT_-SHOW可能是解决该问题的最简单的解决方案。感谢MakeModel()上的信息,我将确保修复该问题。感谢VZ,看起来wxEVT_-SHOW毕竟是个问题