teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

修正

2020/12/12 04:59

投稿

退会済みユーザー
answer CHANGED
@@ -1,10 +1,8 @@
1
- DrawItemイベントはあくまでListBoxの項目を描画するイベントなので、そこで PlaySoundChange を呼んでいるのに問題があると思われます。ボタクリック時呼ぶようにすればよいのはないでしょうか
1
+ DrawItemイベントはあくまでListBoxの項目を描画するイベントなので、そこで PlaySoundChange を呼んでいるのに問題があると思われます。そもそも、描画用のイベトでそれ関係ない処理をするべきではありません。ListBoxの選択連動る処理をするとすれば、SelectedIndexChanged イベントすね
2
- あと、VisualStudioを使用しない理由は良く判りませんが、基本的に使用すべきです。デバッグ効率やフォームデザインからコードに連携するまでの効率が全然違います。
3
2
 
4
3
  > 自分が分かったのは、再生ボタンをクリックすると最終的にe.Indexの部分が最大の数になるということだけでした。回避方法として2回連続でe.Indexが同じ値だったときだけPlaySoundChange()を呼び出すという方法も思いつきましたが、もっと簡単に実装できる方法がないか知りたいです。
5
4
 
6
5
  何故そのような挙動になるかというと、DrawItemイベントで実行された DrawItemEventArgs で再生曲のインデックスを指定しているからです。ListBox項目の再描画は上から順に行われるので、一番最後の項目が PlaySoundChange に指定されたインデックスになるでしょう。
7
- 簡単に実装したいのであれば、普通に PlayClick のタイミングで ListBoxのSelectedIndex を元に再生処理をすればいいだけです。
8
6
 
9
7
  ```C#
10
8
  void DrawPlaylist(object sender, DrawItemEventArgs e){
@@ -18,4 +16,5 @@
18
16
  //ここの e.Index は描画対象のListBoxの項目のインデックス
19
17
  //(選択している項目ではない)
20
18
  PlaySoundChange(e.Index, text); }
21
- ```
19
+ ```
20
+ あと、VisualStudioを使用しない理由は良く判りませんが、基本的に使用すべきです。デバッグ効率やフォームデザインからコードに連携するまでの効率が全然違います。

5

修正

2020/12/12 04:59

投稿

退会済みユーザー
answer CHANGED
@@ -4,7 +4,7 @@
4
4
  > 自分が分かったのは、再生ボタンをクリックすると最終的にe.Indexの部分が最大の数になるということだけでした。回避方法として2回連続でe.Indexが同じ値だったときだけPlaySoundChange()を呼び出すという方法も思いつきましたが、もっと簡単に実装できる方法がないか知りたいです。
5
5
 
6
6
  何故そのような挙動になるかというと、DrawItemイベントで実行された DrawItemEventArgs で再生曲のインデックスを指定しているからです。ListBox項目の再描画は上から順に行われるので、一番最後の項目が PlaySoundChange に指定されたインデックスになるでしょう。
7
- 簡単に実装したいのであれば、普通に PlayClick のタイミングで再生処理をすればいいだけです。
7
+ 簡単に実装したいのであれば、普通に PlayClick のタイミングで ListBoxのSelectedIndex を元に再生処理をすればいいだけです。
8
8
 
9
9
  ```C#
10
10
  void DrawPlaylist(object sender, DrawItemEventArgs e){

4

追記

2020/12/12 04:54

投稿

退会済みユーザー
answer CHANGED
@@ -1,2 +1,21 @@
1
1
  DrawItemイベントはあくまでListBoxの項目を描画するイベントなので、そこで PlaySoundChange を呼んでいるのに問題があると思われます。ボタンクリック時に呼ぶようにすればよいのではないでしょうか。
2
- あと、VisualStudioを使用しない理由は良く判りませんが、基本的に使用すべきです。デバッグ効率やフォームデザインからコードに連携するまでの効率が全然違います。
2
+ あと、VisualStudioを使用しない理由は良く判りませんが、基本的に使用すべきです。デバッグ効率やフォームデザインからコードに連携するまでの効率が全然違います。
3
+
4
+ > 自分が分かったのは、再生ボタンをクリックすると最終的にe.Indexの部分が最大の数になるということだけでした。回避方法として2回連続でe.Indexが同じ値だったときだけPlaySoundChange()を呼び出すという方法も思いつきましたが、もっと簡単に実装できる方法がないか知りたいです。
5
+
6
+ 何故そのような挙動になるかというと、DrawItemイベントで実行された DrawItemEventArgs で再生曲のインデックスを指定しているからです。ListBox項目の再描画は上から順に行われるので、一番最後の項目が PlaySoundChange に指定されたインデックスになるでしょう。
7
+ 簡単に実装したいのであれば、普通に PlayClick のタイミングで再生処理をすればいいだけです。
8
+
9
+ ```C#
10
+ void DrawPlaylist(object sender, DrawItemEventArgs e){
11
+
12
+ e.DrawBackground();
13
+ string text = (sender as ListBox).Items[e.Index].ToString();
14
+ Brush fb = new SolidBrush(e.ForeColor);
15
+ e.Graphics.DrawString(text, e.Font, fb, e.Bounds);
16
+ e.DrawFocusRectangle();
17
+
18
+ //ここの e.Index は描画対象のListBoxの項目のインデックス
19
+ //(選択している項目ではない)
20
+ PlaySoundChange(e.Index, text); }
21
+ ```

3

修正

2020/12/12 04:53

投稿

退会済みユーザー
answer CHANGED
@@ -1,2 +1,2 @@
1
1
  DrawItemイベントはあくまでListBoxの項目を描画するイベントなので、そこで PlaySoundChange を呼んでいるのに問題があると思われます。ボタンクリック時に呼ぶようにすればよいのではないでしょうか。
2
- あと、VisualStudioを使用しない理由は良く判りませんが、基本的に使用すべきです。デバッグ効率やフォームデザインからコード連携するまでの効率が全然違います。
2
+ あと、VisualStudioを使用しない理由は良く判りませんが、基本的に使用すべきです。デバッグ効率やフォームデザインからコード連携するまでの効率が全然違います。

2

修正

2020/12/12 04:20

投稿

退会済みユーザー
answer CHANGED
@@ -1,2 +1,2 @@
1
- DrawItemイベントはあくまでListBoxの項目を描画するイベントなので、そこで PlaySoundChange を呼んでいるのに問題があると思われます。
1
+ DrawItemイベントはあくまでListBoxの項目を描画するイベントなので、そこで PlaySoundChange を呼んでいるのに問題があると思われます。ボタンクリック時に呼ぶようにすればよいのではないでしょうか。
2
- ボタンクリック時呼ぶようにればよいのではなでしょうか
2
+ あと、VisualStudioを使用しない理由は良く判りませんが、基本的使用べきです。デバッグ効率やフォームデザインからコード連携するまの効率が全然違ます

1

修正

2020/12/12 04:20

投稿

退会済みユーザー
answer CHANGED
@@ -1,2 +1,2 @@
1
- DrawItemイベントはあくまでListBoxの項目を描画するイベントなので、
1
+ DrawItemイベントはあくまでListBoxの項目を描画するイベントなので、そこで PlaySoundChange を呼んでいるのに問題があると思われます。
2
- そこで PlaySoundChange をんでいるの問題があると思われます。
2
+ ボタンクリック時にぶようにすればよいのではないでしょうか