質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • C#

    7422questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

コンソールアプリケーションでFormを使う

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 5,336

gari

score 14

コンソールアプリケーションで開発しています。
コンソールアプリケーション上で処理している配列を
引数にしてFormアプリケーションを呼び出し、
配列内の数字に応じて画像を描画したいのですが、
コンソールアプリケーション上でFormがうまく扱えません。

コンソールアプリケーションを開始した時にFormを作成し、
Formに値を渡したタイミングで描画されなおされ
かつ、バックグラウンド(って表現で合ってるかわからないですが)で処理され続けるようにしたいのです。

イメージとしては、

public static void Main(string[] args)
{
    System.Windows.Forms.Application.Run(new System.Windows.Forms.Form());

    Form1 app = new Form1();
    int[] value = new int[9];
    //コンソールアプリケーション処理で valueに値を入れる
    app(value);
}
class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    Image[] image = new Image[]
     {
        Image.FromFile("imag\\000.bmp"),
        Image.FromFile("imag\\001.bmp")
    };
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        swtch(app_value[0])
        {
            case 0:
                e.Graphics.DrawImage( image[0] );
        }
    }
}

という感じで、配列内の数字をFormでグラフィカルに表示したいです。
どうしたら良いでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

普通に作成した場合、1つのプログラムでは1つしか命令が動きません(シングルスレッド)
つまりコンソールアプリと画面のアプリはどちらかが動いていたらどちらかが止まります。
これを回避するにはいくつかの方法があります。

・見せかけ上で同時に動いているようにする(イベントなど)
→イベント駆動についての知識が必要

・プログラム内で別スレッドで同時実行する
→並列プログラミングの知識が必要

・そもそも別のEXEプログラムとする(Excelとメモ帳のように)
→プロセス間でデータのやりとりをする方法が必要(例えばコピペバッファを使うとか)

どれも一長一短があるのでどれとは言えません。
簡単に2ついっぺんに動かすという事はできないかと思います。意外と大変です。
ちなみにWindows.FormsではApplication.Run内でFormの処理(表示や入力など)をずっとぐるぐるやっています。
そのためそれより下のプログラムは動きません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

イメージのソースを基にするのであれば

Main関数の開始直後にフォーム生成・表示を行う
    Form1 app = new Form1();
    app.Show();
class Form1にデータ設定用のメソッドを追加し、データをセットする際にReflesh関数を呼ぶ
    public void SetValue(int[] value)
    {
        // valueの要素数をチェックしてからapp_valueにコピー(略)

        // Formの再描画
        Reflesh();
    }
Reflesh関数を呼ぶとフォームの再描画イベントが発生するので、Form1_Paint()が呼ばれます。
Main関数ないのデータを更新したい箇所でapp.SetValue()で値をセットします。
実際に試してませんが、こんな感じでできると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/20 17:18 編集

    ```C#
    public static void Main(string[] args)
    {
    System.Windows.Forms.Application.Run(new System.Windows.Forms.Form());
    Form1 app = new Form1();
    app.Show();
    }
    ```
    こうやって
    Formを作成出来たのですが、
    >>System.Windows.Forms.Application.Run(new System.Windows.Forms.Form());
    のところでコンソールアプリケーション側の処理が止まってしまいます。

    Form作成後もコンソールアプリケーションの処理を続ける場合どうしたらよいのでしょうか

    キャンセル

  • 2015/08/20 18:54

    >System.Windows.Forms.Application.Run(new System.Windows.Forms.Form());
    この行を消してみてください。

    キャンセル

  • 2015/08/20 20:54

    あと注意点としてフォームをMain関数の中で呼ぶ場合、ループ処理などが走る際に適宜Application.DoEvents()を呼んでやらないと、フォームの描画が止まったりします。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • C#

    7422questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。