0

我有一个应用程序,它创建了一系列以“级联”形式显示的无模式对话框窗口。用户应该能够单击任何窗口以将其带到顶部并与之交互。

这是一个屏幕截图,显示了它按预期工作。用户点击了底部第三个窗口,成功地将其带到顶部。

在此处输入图像描述

用户报告说,当他运行此程序并单击其中一个被遮挡的窗口时,该窗口不会升到顶部

这是显示问题发生的视频。它显示了笔记本窗口的正常级联,其行为符合预期。然后出现我的应用程序窗口的级联,但用户无法将任何选定的窗口置于顶部。所选窗口的外观发生变化,表明它已被选中,但仍处于隐藏状态。(视频最后展示了一个相关问题,我们现在可能可以忽略它)

用户报告此问题发生在他尝试过的其他 PC 上。我无法重现该问题。

我完全被难住了,甚至无法猜测可能是什么原因造成的。

(我的一个理论是应用程序已冻结并且不再响应绘制消息。但是,视频显示用户将被遮挡的窗口拖出级联,然后窗口被绘制得很好。看起来很明显选择窗口时,应用程序没有收到或忽略它的绘制消息)

该应用程序使用 C++ 和 wxWidgets 2.9.4 编写并在 windows 7 下运行

这似乎是 wxWidgets 2.9 的问题。当使用 v2.8.12 库构建时,用户报告它工作正常。

这是创建窗口的代码。请注意,父项为 NULL。(这允许在不最小化级联窗口的情况下最小化主应用程序窗口 - 这是一项必需的功能。)

cNewDataPopup::cNewDataPopup(  cPatDataset& data )
    : wxDialog(NULL,-1,L"New data",wxPoint(200,200),wxSize(570,242),
        wxDEFAULT_DIALOG_STYLE|wxSTAY_ON_TOP )
    , myData( data )
{
4

2 回答 2

1

经过一些实验,我发现将 wxDIALOG_NO_PARENT 添加到 wxSTAY_ON_TOP 可以“修复”问题。

(下面的解释是由于VZ。)

显然,将窗口的父级指定为 NULL 不足以让 wxWidgets 相信您不需要父级。无论如何,它都会继续分配父母,或多或少是随机的。这就是为什么观察到奇怪的、意外的和不可重现的行为的原因。分配父级的算法在 v2.9.x 中发生了变化,这就是我升级 wxWidgets 时奇怪和意外行为发生变化的原因。为了让 wxWidgets 相信,是的,真的,我不想要窗口的父级,我必须同时指定 NULL 父级和 wxDIALOG_NO_PARENT 样式。

于 2012-08-20T20:49:43.553 回答
0

使用wxSTAY_ON_TOP几乎可以肯定是罪魁祸首。如果您只需要窗口保持在父窗口的顶部,请不要使用这种样式,或者通过在父框架中覆盖来使用wxFRAME_TOOL_WINDOW或覆盖WM_SIZE处理。MSWWindowProc()

于 2012-08-19T16:11:12.400 回答