1

大约 20(!)年过去了,我编写了一个大型复杂的 C 程序。据我所知,它当时在各个方面都运行良好——它可能在 Windows 95 上运行。

现在我需要再次使用它。不幸的是,其中的单选按钮似乎不再正常工作(普通按钮都正常工作)。当我单击单选按钮时,我收到一些反馈,即 Windows 正在确认我的点击,就像我看到按钮文本周围出现一条虚线并且只要我的手指在按钮上,按钮的圆圈就会变灰,但是当我松开手指时,我看到所选按钮没有改变。

我的怀疑是,当时我可能正在摆脱一些不良做法,这些做法适用于 Windows 95,但不再适用于较新版本的 Windows,但我正在努力找出我做错了什么。有任何想法吗?

编辑:很难提取相关代码,因为该程序中的消息处理是一场纠结的噩梦。许多按钮是在运行时以编程方式创建的,当程序处于不同的操作模式时,会有不同的消息循环工作。该程序是一个可定制的环境,用于运行某些类型的实验。它甚至有自己的内置解释语言!所以我不期待像“你应该在第 47 行有一个逗号而不是分号”这样的答案,但可能更像是“我在我的程序中观察到类似的症状一次,结果是......” ..或者也许“虚线矩形出现的事实意味着过程AAA已经发生,但可能步骤BBB出错了”。

编辑:我设法提取了一些我包含错误的关键代码......

char *process_messages_one_at_a_time()
{
    MSG msg;
    int temp;

    temp = PeekMessage(&msg,winh,0,0,PM_NOREMOVE);

    if (temp)
    {
        GetMessage (&msg, NULL, 0, 0);
        if (msg.message == WM_LBUTTONUP)
        {
            mouse_just_released_somewhere = TRUE;
        }

        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }

    if (button_command_waiting)
    {
        button_command_waiting = FALSE;
        return (button_command_string);
    }
    else
    {
        return (NULL);
    }
}
4

3 回答 3

2

使用单选按钮时有两件简单的事情需要检查。首先是确保每个都设置了 BS_AUTORADIOBUTTON 属性。第二个是确保选项卡顺序中的第一个按钮和按钮集(通常是组框)之后的下一个控件设置了 WS_GROUP 属性,而其他按钮则设置了它。

于 2012-11-13T23:33:13.863 回答
1

几点建议:

  • 我会尝试使用 spy++ 来监视该对话框中的消息,特别是与单选按钮控件之间的消息。我想知道您是否会看到您的程序正在发送的 BM_SETCHECK(即,您以编程方式取消选中按钮的某个地方)。
  • 您的代码有没有机会检查 Windows 版本号?我已经被 == 烧了几次,我应该使用 >= 来确保版本检查兼容性。
  • 您是否对任何控件进行子类化?我不记得了,但在我看来,子类化可能会出现一些错误(并且在新版本的 Windows 推出之前效果不会立即明显)。
  • 所有者绘制控件?所有者很容易不使用较新的 Windows GUI 样式。

使用这样的旧代码,记忆会零零碎碎地回到我的脑海中,而不是洪水泛滥,所以通常需要一段时间才能让我明白我当时在做什么。

于 2012-11-20T20:45:33.583 回答
0

如果您只是想让程序运行以使用它,我可能会建议“兼容模式”。

http://www.howtogeek.com/howto/windows-vista/using-windows-vista-compatibility-mode/

但是,如果您有一个更大的、预期的软件使用寿命,您可能需要考虑重写它。由于以下几个因素,重写它并不接近初始写入的复杂性或工作:

  • 开发程序的需求是制作软件包所需工作的重要组成部分(需求已经完成)
  • 很多代码已经写好了,只有部分可能需要稍微重构才能更新
  • 新的库组件可能是现有代码库部分的更稳定的替代品
  • 您将学习如何使用当前的库设施编写当前的应用程序
  • 您将有机会评论或只是一般地重构和清理代码(从而使其在预期的延长寿命中更易于维护)
  • 代码库将更易于维护/兼容,以应对需求和操作系统的其他更改(既因为它已更新,也因为您有机会重新理解整个代码库)

希望有帮助...

于 2012-11-20T17:45:18.170 回答