没有在旧程序中选择的单选按钮

时间:2012-11-11 19:41:56

标签: c windows api windows-xp

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

现在我需要再次使用它。不幸的是,它中的单选按钮似乎不再正常工作(普通的按钮都表现正常)。当我点击单选按钮时,我得到一些反馈,即窗口确认我的点击,因为我看到按钮的文本周围出现了一条虚线,只要我的手指在按钮上,按钮的圆圈就会变灰,但当我脱下手指时,我发现所选按钮没有改变。

我怀疑我可能在使用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);
    }
}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

一些建议:

  • 我尝试使用spy ++来监视该对话框中的消息,特别是来自radiobutton控件的消息。我想知道你是否会看到你的程序发送的BM_SETCHECK(例如,你正在以编程方式取消选中按钮)。
  • 您的代码是否有机会检查Windows版本号?我已经使用==刻录了几次,我应该使用> =以确保版本检查兼容性。
  • 你是否对任何控件进行了分类?我不记得了,但在我看来,有一些方法可能会出现错误的分类(并且在新版本的Windows推出之前效果不会立即引起注意)。
  • 所有者 - 绘制控件?对于所有者绘制来说,使用较新的Windows GUI样式非常容易。

使用这样的旧代码,记忆会一点一滴地回到我身边,而不是洪水,所以通常需要一些时间才能告诉我当时正在做的事情。

答案 2 :(得分:0)

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

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

但是,如果您拥有较大的预期软件使用寿命,则可能需要考虑重写它。由于一些因素,重写它并不是最初写入的复杂性或工作的任何地方:

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

希望有帮助...