1

私は大規模で複雑な 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);
    }
}
4

3 に答える 3

2

ラジオ ボタンを使用する場合は、2 つの簡単な確認事項があります。まず、それぞれに BS_AUTORADIOBUTTON プロパティが設定されていることを確認します。2 つ目は、タブ オーダーの最初のボタンとボタン セットの後の次のコントロール (通常はグループ ボックス) に 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 に答える