1

C で MVC デザイン パターンを使用して GUI アプリケーションを作成しています。Connect 4 のゲームを意図しています。

コントローラーが GUI にデータを送信できるようにしたい。GUI には、ボードやボタンなどの開始要素を描画して、チェッカーをドロップする列を選択するメソッドがあります。

このメソッドの最後で、GUI を画面に表示するために gtk_main() を呼び出す必要があります。ビューとコントローラー クラスの間でデータを送信できるようにしたいのですが、このメソッドを呼び出した後、制御がコントローラー クラスに戻されません。

明確にするために、メイン メソッドはコントローラー クラスにあり、ビュー クラスの「setup」メソッドを呼び出します。gtk_main() 呼び出しは「setup」メソッドの最後にあります。

これを解決するにはどうすればよいですか?

また、たとえば、私のビューには次のメソッドがあります。

void drop_checker(GtkWidget *widget, cairo_t *cr, gint col, gint row, int r, int g, int b)

ウィジェットと cr 変数にアクセスできるので、GTK コールバックを使用してこれを呼び出すのは簡単ですが、コントローラー クラスからこれを呼び出す方法がわかりません。

これはアプリケーションの設計上の誤りですか、それとも技術的な誤解ですか?

4

1 に答える 1

2

アプリケーションが正しく設計されていないのは、技術的な誤解だと思います。GUI アプリケーションの場合、メイン ループを常に実行する必要があり、プログラム フローは次のようになります。

int main (int argc, char **argv)
{
    <do setup>
    <do UI setup>

    gtk_main ();

    return 0;
}

メイン ループは、呼び出したときにのみ終了しますgtk_main_quit();。通常、これは、ウィンドウ コントロールまたはメニュー オプションを介してゲームが終了した場合にのみ終了します。ゲームで発生する他のすべてのことは、メイン ループからのイベントによって発生する必要があります。GtkButton の「クリックされた」シグナルのようなウィジェットのシグナルにコールバックをアタッチできます。または、何かを個別に発生させる必要がある場合は、g_timeout_add を使用して特定の時間に、または g_idle_add を使用してメインループがアイドル状態のときにコールバックを呼び出すように設定できます。

(最初のループ内で 2 番目のループを実行したい場合があることに注意してください。ただし、それらはほとんどなく、現在の状況とは関係なく、一般的に GTK+ は詳細を知る必要なくそれらを処理します)

于 2013-02-09T06:48:49.273 に答える