最小化还原后,MFC CListCtrl不会出现

时间:2016-04-06 08:06:19

标签: visual-c++ mfc clistctrl ctabctrl

首先我要说的是,按照今天的标准,我使用旧技术!这发生在Visual Studio 2005上的MFC中并在WinXP下运行。 (如果它打破.... ;-))

我有一个基于对话框的应用程序,它有一个带有两个标签的CTabCtrl。每个包含一个CListCtrl。这些在正常情况下完美地工作。它们正确填充并显示和隐藏它们应该。当我第一次打开应用程序时,显示选择是正确的。如果我然后最小化对话框并恢复,则CList Ctrl不显示,选项卡为空。它是唯一具有此问题的控件。 CTabCtrl之外的另一个CListCtrl确实正确显示。如果我然后再换回标签然后再返回,则显示另一个标签,然后第一个显示正常。

如果在最小化之前访问对话框的任何其他部分,则不会发生这种情况,只有当最小化是我采取的绝对第一个动作时才会发生。如果我在OnInitDialog中启动时选中此选项卡,我在其他选项卡中也会出现CListCtrl,我设置了CTabCtrl。

我实际上通过在OnSysCommand(...)中添加以下内容来解决这个问题的影响:

if ((nID & 0xFFF0) == SC_RESTORE)
{
    m_ctrlReadList.Invalidate();
}

但是我不知道我是在添加代码来解决只在如此奇怪的环境中发生的问题。我无法帮助您认为我在设置中遗漏了一些导致此行为的内容。任何人都可以首先解释导致它的原因吗?

1 个答案:

答案 0 :(得分:0)

我的解释是基于我所发现的事实,但这对我来说是一次学习经历如此道歉,如果我对它有些困惑,我仍然会让它在我脑海中解决。< / p>

随着这个问题,我发现另一个结果是相关的。从我编写的程序的性质来看,我的CListCtrls需要固定宽度的标题。现在结果证明是另一件我无法建立的事情!我只需要阻止用户抓取并调整标题分隔符的大小或双击它们以自动调整大小,当然CListCtrl中有基于其子CHeaderCtrl的功能来设置它不在那里?显然不是。例如,LVS_EX_HEADERDRAGDROP不是。

所以我探索了尝试捕捉那些让我自己的信息,你知道什么,我无法做到!我可以捕获一些而不是我需要的那些。我在寻找HDN_BEGINTRACK和HDN_DIVIDERDBLCLICK。 (我们不会进入你必须单独处理这些版本的A和W版本的事实!)CHeaderCtrl是CListCtrl的子代,但它将其消息作为CListCtrl发送回CDialog&#39;父母。我在那里尝试使用我的列表&0和0作为标题显然使用的ID。他们中的许多人根本没有出现在那里。

所以我创建了自己的CListCtrl类,继承自CListCtrl,覆盖OnNotify并且它们出现在那里。我只是阻止了对这些消息调用CListCtrl :: On Notify,它起作用了,根本没有调整大小的功能。

我也玩Z-order也可能是相关的。我之前没有解释,但是这个和另一个列表在两个选项卡上,完全相互对齐。选择选项卡依次隐藏和显示每个列表。即使我在OnInitDialog中更改默认显示以在启动时显示它,另一个列表也没有显示问题。

这是有问题的。因此,在我设置它们的OnInitDialog中更改Z顺序 - 什么也没做!并且在第二个列表中擦除它也是默认情况下默认情况下就像我想要的那样,我无法找到原因。他们的属性列出完全相同,并且在代码中没有任何地方手动设置任何不同的方面,它们在理论上实际上是相同的,但实际上并非如此。太令人沮丧了!!!

它的结果是,现在标题调整大小问题已解决,我的显示问题也消失了!它看起来像我和其他一些人,他们报告了类似于我自己的症状,好像CListCtrl是另一个稍微片状的,需要一点点按摩才能充分利用它。

我希望对那些熟悉这种控制的人有意义。我很惊讶解决方案是多么简单,但它也让我感到惊讶,诊断过程非常困难。它当然可以归结为我在其中工作的老化系统。现在我这样做只是为了好玩,而且从2005年开始更新VS偶尔使用的费用并不是一个高优先级。我确信某些症状不会在其他构建和运行环境下显示,但可能值得将问题和我的解决方案记录在某个地方供Google查找。