为什么我的CTreeCtrl复选框没有检查?

时间:2009-08-17 18:13:33

标签: c++ windows mfc

我在打开TVS_CHECKBOXES样式的对话框中卡住了MFC CTreeCtrl。我的所有树项旁边都有复选框。在OnInitDialog中,我使用CTreeCtrl :: SetCheck设置了某些项的已检查状态,但在显示树时,不会检查树中的任何项。 SetCheck返回TRUE。使用鼠标检查项目工作正常。以前有人遇到过这个吗?

3 个答案:

答案 0 :(得分:10)

弄清楚问题是什么。我在visual studio资源编辑器中设置了TVS_CHECKBOXES样式。显然,这会导致初始检查时遇到的问题。相反,你必须做


   m_nodeTree.ModifyStyle (TVS_CHECKBOXES, 0);
   m_nodeTree.ModifyStyle (0, TVS_CHECKBOXES);

在OnInitDialog中填充树之前。一旦我这样做,一切正常。

答案 1 :(得分:2)

我使用以下代码创建了myTreeCtrl:

myTreeCtrl.Create(WS_CHILD|TVS_HASBUTTONS|TVS_CHECKBOX|, CtrlRect, this, IDC_TREECTRL);

我尝试检查OnInitialDialog()中的某些项目并遇到同样的问题 我试过了:

myTreeCtrl.ModifyStyle(TVS_CHECKBOXES, 0);
myTreeCtrl.ModifyStyle(0, TVS_CHECKBOXES);

现在它运作正常。

更重要的是,它没有检查项目是否不在窗口的可见部分。我必须在OnVScroll()上设置触发器。

答案 2 :(得分:0)

树视图控件中的复选框很古怪。正如documented

  

如果要使用此样式,则必须在创建树视图控件之后,在填充树之前,使用SetWindowLong 设置TVS_CHECKBOXES样式。否则,复选框可能会取消选中,具体取决于时间问题。

换句话说,您无法在控件创建时设置TVS_CHECKBOXES树视图样式。在控件创建时使用Visual Studio资源编辑器中设置的控件样式(它只是.rc脚本的图形前端)。

解决方案非常简单:在填充控件之前,创建没有TVS_CHECKBOXES样式的控件,并在代码中打开它:

::SetWindowLong( hwndTreeView, GWL_STYLE,
                 ::GetWindowLong( hwndTreeView, GWL_STYLE ) | TVS_CHECKBOXES );

在MFC中,可以使用

完成
m_treeView.ModifyStyle( 0x0, TVS_CHECKBOXES );

其中m_treeView是树视图控件实例变量。

背景资料:

复选框不是初始树视图控件实现的一部分。它们是后来添加的,方案开发人员在可用之前使用了所需的复选框:通过使用状态图像列表并在树视图项上设置状态项索引。

需要解决的一个问题是确定复选框大小。如果树视图控件具有指定的图像列表(“正常图像列表”),则复选框应与这些图像的大小匹配。否则,复选框应使用系统小图标大小。这样做的一个推论是,如果您使用的是“普通图像列表”,则需要在设置图像列表后启用TVS_CHECKBOXES样式

另一个怪癖是,状态图像索引0表示“无状态图像”(1表示“未检查”状态项图像)。如果将项添加到具有TVS_CHECKBOXES样式集的树视图控件,则控件会将状态项索引设置为1(即使您指定了0)。这就是在创建时设置TVS_CHECKBOXES样式时所有项目都未选中的原因。这也意味着,如果您想要一个没有状态图像的树视图项,您必须添加树视图项,然后手动重置状态项索引。

这应该是足够的信息,以了解和解决问题。树视图实现还有很多,但我会把它留给某人,这样可以更好地编写它。请参阅下面的参考

参考文献:

Raymond Chen(The Old New Thing)发表了一系列关于树视图控制怪癖的广泛系列。并非所有条目都与这个问题直接相关,但每个条目都具有洞察力和价值,无论如何,所以我只会列出所有条目: