C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 一つのイベントの中で2種類のCGを表示する方法


(過去ログ 48 を表示中)

[トピック内 21 記事 (1 - 20 表示)]  << 0 | 1 >>

■26069 / inTopicNo.1)  一つのイベントの中で2種類のCGを表示する方法
  
□投稿者/ 裕猫 (70回)-(2008/10/01(Wed) 13:47:23)

分類:[C#] 

一つのイベントの中で2種類のCGを表示する方法ってあるでしょうか?

引用返信 編集キー/
■26070 / inTopicNo.2)  Re[1]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ 裕猫 (71回)-(2008/10/01(Wed) 13:51:15)
一つのイベントの中で2種類のCGを表示する方法ってあるでしょうか?
        private void button2_Click(object sender, EventArgs e)
        {
        ←ここにCG描画処理入る
            Kotoba = "声\\Konokurai.wav";
            OnseiClass.Koe2(Kotoba);
            Application.Exit();
        }
で終了処理をしたときCGが表示されずに終了してしまいます。実際は音声が終わると同時に瞬間表示して消えているのですが、見えない。
回避する方法をご存知の方教えていただけませんか?よろしくお願いいたします。

引用返信 編集キー/
■26075 / inTopicNo.3)  Re[2]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ よねKEN (196回)-(2008/10/01(Wed) 14:17:07)
No26070 (裕猫 さん) に返信
> 一つのイベントの中で2種類のCGを表示する方法ってあるでしょうか?
> private void button2_Click(object sender, EventArgs e)
> {
>         ←ここにCG描画処理入る
> Kotoba = "声\\Konokurai.wav";
> OnseiClass.Koe2(Kotoba);
> Application.Exit();
> }
> で終了処理をしたときCGが表示されずに終了してしまいます。実際は音声が終わると同時に瞬間表示して消えているのですが、見えない。
> 回避する方法をご存知の方教えていただけませんか?よろしくお願いいたします。

button2_Clickイベントの最後ではApplication.Exit()を呼び出して終了させるのではなく、
Timerコントロールの起動だけ行うようにして、
そのTimerコントロールのTick イベントでApplication.Exit()を呼び出すようにしてはいかがですか。

以下は余談ですが、
Windowsアプリケーションの終了にApplication.Exitを呼び出す必要は通常はなくて、
メインのFormを閉じるか、全Formを閉じれば終了しますよ。


引用返信 編集キー/
■26076 / inTopicNo.4)  Re[3]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ 裕猫 (73回)-(2008/10/01(Wed) 14:25:12)
No26075 (よねKEN さん) に返信
> button2_Clickイベントの最後ではApplication.Exit()を呼び出して終了させるのではなく、
> Timerコントロールの起動だけ行うようにして、
> そのTimerコントロールのTick イベントでApplication.Exit()を呼び出すようにしてはいかがですか。
>
以前タイマーを使いましたら、終了までの時間が延びただけで結果はおなじでした。しかしTick イベントでApplication.Exit()はしなかったので試してみます。ありがとうございます。
引用返信 編集キー/
■26077 / inTopicNo.5)  Re[2]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ PATIO (131回)-(2008/10/01(Wed) 14:28:01)
No26070 (裕猫 さん) に返信
> 一つのイベントの中で2種類のCGを表示する方法ってあるでしょうか?
> private void button2_Click(object sender, EventArgs e)
> {
>         ←ここにCG描画処理入る
> Kotoba = "声\\Konokurai.wav";
> OnseiClass.Koe2(Kotoba);
> Application.Exit();
> }
> で終了処理をしたときCGが表示されずに終了してしまいます。
> 実際は音声が終わると同時に瞬間表示して消えているのですが、見えない。
> 回避する方法をご存知の方教えていただけませんか?よろしくお願いいたします。

まず、タイトルに書いてある内容に食い違いがあると思います。
タイトルには2種類のCGを表示と書いているのに、内容はCGの描画と音声の再生です。
質問内容に合わせるならタイトルもCGの描画と音声の再生を同時に出来るかと言う話に
なるのではないでしょうか?

で、消えてしまう件ですが、Application.Exit()を呼んでいるからではないですか?
これを呼んだらアプリケーションが終了してしまうのではないですか?

あと前にも書いたと思いますが、Windowsは基本的に描画処理は後回しにするので
button2_Clickが終わらないと描画をしないと思います。
加えて、OnseiClass.Koe2(Kotoba)という呼び出しは音声の再生が完了するまで
返って来ないのではないでしょうか?
そうなると、音声の再生が終わらないとbutton2_Clickが終わりませんから
描画処理は動かないのでは?
しかも、button2_Clickが終わるときにはアプリが終了してしまうので
ウインドウが破棄されますから画像はほとんど出てこない事になりますよね。
このイベントドリブンの考え方は何をするにもついてまわりますから
きちんと理解しておかないと先々困る事になると思いますよ。



引用返信 編集キー/
■26082 / inTopicNo.6)  Re[3]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ 裕猫 (74回)-(2008/10/01(Wed) 14:55:12)
No26077 (PATIO さん) に返信
> まず、タイトルに書いてある内容に食い違いがあると思います。
> タイトルには2種類のCGを表示と書いているのに、内容はCGの描画と音声の再生です。
> 質問内容に合わせるならタイトルもCGの描画と音声の再生を同時に出来るかと言う話に
> なるのではないでしょうか?
>
> で、消えてしまう件ですが、Application.Exit()を呼んでいるからではないですか?
> これを呼んだらアプリケーションが終了してしまうのではないですか?
>
> あと前にも書いたと思いますが、Windowsは基本的に描画処理は後回しにするので
> button2_Clickが終わらないと描画をしないと思います。
> 加えて、OnseiClass.Koe2(Kotoba)という呼び出しは音声の再生が完了するまで
> 返って来ないのではないでしょうか?
> そうなると、音声の再生が終わらないとbutton2_Clickが終わりませんから
> 描画処理は動かないのでは?
> しかも、button2_Clickが終わるときにはアプリが終了してしまうので
> ウインドウが破棄されますから画像はほとんど出てこない事になりますよね。
> このイベントドリブンの考え方は何をするにもついてまわりますから
> きちんと理解しておかないと先々困る事になると思いますよ。
>
private void button2_Click(object sender, EventArgs e)
{
        ←ここにCG描画処理入る
Kotoba = "声\\Konokurai.wav";
OnseiClass.Koe2(Kotoba);
        ←ここにCG描画処理入る
Application.Exit();
}
すみません。コピペ1回忘れました。やりたいことは終了時に画像を変えてしゃべらせ、表情を変えてから終了したいということです。

よねKENさんへ
テストしてみましたが、終了が長くなっただけで、画像はbutton2_Clickする前の画像のままでした。 PATIOさんの指摘事項が効いているのはわかるんですが、さてどうしたら思いどうりの動作をさせられるのか、__(_ _)__ 悩んでます。

引用返信 編集キー/
■26083 / inTopicNo.7)  Re[4]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ よねKEN (197回)-(2008/10/01(Wed) 15:00:46)
> よねKENさんへ
> テストしてみましたが、終了が長くなっただけで、画像はbutton2_Clickする前の画像のままでした。 PATIOさんの指摘事項が効いているのはわかるんですが、さてどうしたら思いどうりの動作をさせられるのか、__(_ _)__ 悩んでます。

だとすれば別のところに原因があると思います。
「←ここにCG描画処理入る」の内容は具体的にどのように実装されたのですか?
まさかCreateGraphicsで作成したGraphicsオブジェクト使ってませんよね?

引用返信 編集キー/
■26084 / inTopicNo.8)  Re[5]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ 裕猫 (75回)-(2008/10/01(Wed) 15:13:40)
No26083 (よねKEN さん) に返信
> 「←ここにCG描画処理入る」の内容は具体的にどのように実装されたのですか?
> まさかCreateGraphicsで作成したGraphicsオブジェクト使ってませんよね?
>
public static class IllustClass
{
public static void Paint(string usiro, string hito, int Iti, Graphics g)
{
Bitmap Haikei = new Bitmap(usiro);
Bitmap Mask = new Bitmap(hito);
Bitmap Chara = new Bitmap(hito);

Rectangle Kage = new Rectangle(Mask.Width / 2, 0, Mask.Width, Mask.Height);
Rectangle HKage = new Rectangle(0, 0, Chara.Width / 2 - 1, Chara.Height);

Mask.MakeTransparent(System.Drawing.Color.White);
Chara.MakeTransparent(System.Drawing.Color.Black);

g.DrawImage(Haikei, 0, 0);
g.DrawImage(Mask, Iti, 511 - Mask.Height, Kage, GraphicsUnit.Pixel);
g.DrawImage(Chara, Iti, 511 - Chara.Height, HKage, GraphicsUnit.Pixel);

Haikei.Dispose();
Mask.Dispose();
Chara.Dispose();
}
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
IllustClass.Paint(Haikei, Hito, X, e.Graphics);
}
で表示しますので←のところで渡す引数を記述して表示させます。
引用返信 編集キー/
■26089 / inTopicNo.9)  Re[6]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ aetos(旧シャノン) (12回)-(2008/10/01(Wed) 15:34:21)
No26084 (裕猫 さん) に返信
> private void Form1_Paint(object sender, PaintEventArgs e)
> {
> IllustClass.Paint(Haikei, Hito, X, e.Graphics);
> }
> で表示しますので←のところで渡す引数を記述して表示させます。

button2_Click から Form1_Paint を直接呼ぶようなことはしないでくださいね。
button2_Click も Form1_Paint も .NET Framework が呼ぶメソッドであって、自分で呼ぶメソッドではありません。

その上で、button2_Click から IllustClass.Paint を呼ぶにあたって、Graphics はどうやって用意しているのか、というのが問題になるわけです。

結論としては、button2_Click から IllustClass.Paint を直接呼んではなりません。
描画はすべて Form1_Paint で行うという原則に従えば、IllustClass.Paint は Form1_Paint 以外から呼ぶことはできません。

従って、button2_Click の中では、これから終了時の描画を行う準備をして Form1_Paint を呼び(直接呼んではいけませんよ)、Form1_Paint の中で描画処理を行い、それが終わったらフォームを閉じる、という手順になります。
Form1_Paint の中にフォームを閉じる処理を書くのは美しくありません(Form1_Paint は描画処理に徹しましょう)ので、フォームを閉じる処理をどのタイミングで行うかというのがカギになってきますね。
例えばタイマーを使ってもいいでしょう。タイマーをどう使うかは頭の使いどころですよ。
引用返信 編集キー/
■26090 / inTopicNo.10)  Re[6]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ よねKEN (199回)-(2008/10/01(Wed) 15:35:27)
> で表示しますので←のところで渡す引数を記述して表示させます。

肝心の button2_Clickの中で記述される「←ここにCG描画処理入る」の処理が載っていませんが、

> IllustClass.Paint(Haikei, Hito, X, e.Graphics);
の処理の引数Haikei、Hito、XはそのFormのprivateな変数で、
「←ここにCG描画処理入る」ではこの3つの変数に値をセットしているだけ、
という理解でよろしいですか?

もしそういうことであってるようでしたら、Paintイベントが発生しませんので描画されません。
「←ここにCG描画処理入る」の処理の直後に

this.Invalidate()

のように再描画を起こすメソッド呼び出しが必要でしょう。


引用返信 編集キー/
■26092 / inTopicNo.11)  Re[7]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ PATIO (132回)-(2008/10/01(Wed) 15:43:57)
やっぱり、Windows周りの画面の描画がどんな風な流れで行なわれているのかとか、
イベントの流れはどんな風になっているのかとか、
その辺の勉強した方が早道だと思います。
どうしても現象から入ってパターン学習で覚えようとするケースが多いように
思いますけれど、これだと理屈の部分がきちんと理解できていないので結局応用が
聞かないんですよね。
一見、遠回りのように見えてもここの所の理屈が理解できているのといないのとでは
プログラミングの応用の利き方に天と地の差が出ると思いますよ。
C++ならとりあえず、"猫でもわかる"を紹介するところなんですが、
C#ですしねぇ。
どうしたもんだか。

引用返信 編集キー/
■26093 / inTopicNo.12)  Re[7]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ 裕猫 (76回)-(2008/10/01(Wed) 15:49:28)
No26090 (よねKEN さん) に返信
>>で表示しますので←のところで渡す引数を記述して表示させます。
>
> 肝心の button2_Clickの中で記述される「←ここにCG描画処理入る」の処理が載っていませんが、
>
>>IllustClass.Paint(Haikei, Hito, X, e.Graphics);
> の処理の引数Haikei、Hito、XはそのFormのprivateな変数で、
> 「←ここにCG描画処理入る」ではこの3つの変数に値をセットしているだけ、
> という理解でよろしいですか?
↑はいその通りです。

> もしそういうことであってるようでしたら、Paintイベントが発生しませんので描画されません。
> 「←ここにCG描画処理入る」の処理の直後に
>
> this.Invalidate()
>
> のように再描画を起こすメソッド呼び出しが必要でしょう。
>
わかりました。アドバイスありがとうございます。
解決済み
引用返信 編集キー/
■26094 / inTopicNo.13)  Re[4]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ PATIO (133回)-(2008/10/01(Wed) 15:53:23)
ちなみにですが、描画に関しては全てForm1_Paintに集約して
よねKENさんが書かれているように this.Invalidate()を呼び出して
Paintイベントを起こさせるのが正当だと思います。
音声の再生部分だけワーカースレッドと言うのも有りカナとも思いますけれど、
そこまでしないなら処理をちょん切ってTimerでつなげると言うのも有りかと。

button2_ClickではCGの表示のみしてTimerを掛け、
最初のTimerイベントで音声の再生をします。
再生終了後、次のCGを表示してTimerを掛け、
二回目のTimerで終了します。
ただ、思うにいきなり終了って言うのはどうかなと思いますね。
起動直後の状態に戻ってユーザーのオペレーションを待つのが順当だと思いますけれど。

引用返信 編集キー/
■26095 / inTopicNo.14)  Re[4]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ 裕猫 (77回)-(2008/10/01(Wed) 15:56:02)
No26075 (よねKEN さん) に返信
成功しました。ありがとうございました。
解決済み
引用返信 編集キー/
■26098 / inTopicNo.15)  Re[5]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ よねKEN (200回)-(2008/10/01(Wed) 16:39:25)
想像力をフルに働かせて回答しましたが、
当たっていたようで結果オーライなんですが、

No26095 (裕猫 さん) に返信
> ■No26075 (よねKEN さん) に返信
> 成功しました。ありがとうございました。

とりあえず、なぜ
this.Invalidate()
を行えばOKなのか、意味はヘルプを参照して理解しておいてくださいね。

--
余談。

PATIOさん
> ただ、思うにいきなり終了って言うのはどうかなと思いますね。

ただの想像なんですが、button2は終了ボタンなんじゃないですかね。
終了するときに「お疲れ様でした♪(はぁと)」とか言ってくれる
癒し系機能なのではないかと思ってみたり。
↑の内容は冗談ですが、画像表示&音声再生してすぐ終了なら、
見られなくても問題の内容なのではないかなと予想しました。
解決済み
引用返信 編集キー/
■26100 / inTopicNo.16)  Re[6]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ PATIO (135回)-(2008/10/01(Wed) 17:27:36)
No26098 (よねKEN さん) に返信
> PATIOさん
>>ただ、思うにいきなり終了って言うのはどうかなと思いますね。
>
> ただの想像なんですが、button2は終了ボタンなんじゃないですかね。
> 終了するときに「お疲れ様でした♪(はぁと)」とか言ってくれる
> 癒し系機能なのではないかと思ってみたり。
> ↑の内容は冗談ですが、画像表示&音声再生してすぐ終了なら、
> 見られなくても問題の内容なのではないかなと予想しました。

ぐわっ、そういうのは想像してませんでした。
うーむ、それならそんなコードになりますねぇ。

解決済み
引用返信 編集キー/
■26113 / inTopicNo.17)  Re[7]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ 裕猫 (78回)-(2008/10/02(Thu) 08:27:43)
No26100 (PATIO さん) に返信
> ■No26098 (よねKEN さん) に返信
>>PATIOさん
> >>ただ、思うにいきなり終了って言うのはどうかなと思いますね。
>>
>>ただの想像なんですが、button2は終了ボタンなんじゃないですかね。
>>終了するときに「お疲れ様でした♪(はぁと)」とか言ってくれる
>>癒し系機能なのではないかと思ってみたり。
>>↑の内容は冗談ですが、画像表示&音声再生してすぐ終了なら、
>>見られなくても問題の内容なのではないかなと予想しました。
>
> ぐわっ、そういうのは想像してませんでした。
> うーむ、それならそんなコードになりますねぇ。
>
よねKEN さん鋭い観察力です。ご想像どうりボタン2は終了ボタンでメイドキャラがお疲れさまでしたと挨拶後、にっこりと手を振るCGが表示されて終了します。(^ ^)>
引用返信 編集キー/
■26114 / inTopicNo.18)  Re[5]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ 裕猫 (79回)-(2008/10/02(Thu) 08:28:50)
あっ 解決ボタンはずしちゃった。 つけなおし つけなおし
解決済み
引用返信 編集キー/
■26115 / inTopicNo.19)  Re[6]: 一つのイベントの中で2種類のCGを表示する方法
□投稿者/ 裕猫 (80回)-(2008/10/02(Thu) 09:06:16)
よねKEN さん に追加返信
>とりあえず、なぜ
>this.Invalidate()
これがCGの再描画をするものという認識はあったんですが、以前CG描画ルーチン作成時に、画面が認識できないほどのちらつきを起こす原因になりまして、以来使用することを敬遠していました。その描画ルーチンが今回使用していたものでしたので、this.Invalidate()は使えないなと意識の外にはずしてあったような次第で、(これのためにダブルバッファリングが使用できなくなっていました。)  しかし今回のアドバイスのおかげでthis.Invalidate()の使い方が悪かったことがわかり、使用できなかったダブルバッファリングも使用できるようになりました。今回の件でコントロール付け直し時の旧コントロールの影が透過画像のように残ったりする現象も解決され、CG系処理は現時点で思いどうりの制御が可能になりました。
質問の仕方もわかりにくいような中でのご指導に感謝いたします。本当にありがとうございました。
解決済み
引用返信 編集キー/
■26126 / inTopicNo.20)  Re[8]: 一つのイベントの中で2種類のCGを表示する方法
 
□投稿者/ Jitta on the way (188回)-(2008/10/02(Thu) 12:02:40)
No26113 (裕猫 さん) に返信
> よねKEN さん鋭い観察力です。ご想像どうりボタン2は終了ボタンでメイドキャラがお疲れさまでしたと挨拶後、にっこりと手を振るCGが表示されて終了します。(^ ^)>


(-.-)ボソボソ「マルチメディア コントロールつかって、.avi を流す」
解決済み
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -