1

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

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

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

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

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

但它让我感到困扰,我正在添加代码来解决仅在这种奇怪情况下发生的问题。我不禁想到我在设置中遗漏了一些导致这种行为的东西。任何人都可以首先解释是什么原因造成的吗?

4

1 回答 1

0

我的解释是基于我所发现的事实,但这对我来说是一次学习经历,所以如果我对其中的一些内容感到有些困惑,我深表歉意,我仍然让它在我的脑海中沉淀下来。

除了这个问题,我还发现了另一个相关的问题。从我正在编写的程序的性质来看,我的 CListCtrls 需要固定宽度的标题。现在事实证明这是我无法设置的另一件事!我只需要防止用户抓取和调整标题的分隔线大小或双击它们以自动调整大小,当然 CListCtrl 中有基于其子 CHeaderCtrl 的功能来设置它不是吗?显然不是。例如 LVS_EX_HEADERDRAGDROP 不是这样。

因此,我探索了尝试捕获可以让我了解自己的消息,而您知道吗,我做不到!我可以捕获一些但不是我需要的。我正在寻找 HDN_BEGINTRACK 和 HDN_DIVIDERDBLCLICK。(我们不会讨论您必须分别处理 A 和 W 版本的事实!) CHeaderCtrl 是 CListCtrl 的子级,但它会将其消息作为 CListCtrl 的父级发送回 CDialog。我在那里尝试使用我的列表和 0 作为标题显然使用的 ID。他们中的许多人根本没有出现在那里。

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

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

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

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

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

于 2016-04-09T13:42:21.673 回答