こんにちは。
パネルをスクロールした時に描画の続きの部分が描画されるようにしたいのですが、現状では続きの部分が描画されず、途切れてしまいます
Panelの上にPictureBoxを置いてスクロールバーを表示させることには成功しましたが、やはりスクロールした時に途切れ、再描画がされません。
下記がコードです
C#
1 private void KeyBoard_Paint(object sender, PaintEventArgs e) 2 { 3 int octave_draw_size_y = PianoRoll.white_key_board_height_list.Sum(); 4 int measure_off_no, measure_count = 1; 5 int new_measure_count = 1; 6 int offset, measure_x_draw; 7 measure_x_draw = measure_count * PianoRoll.MEASURE_WIDTH; 8 measure_off_no = 0; 9 offset = measure_off_no * PianoRoll.MEASURE_WIDTH; 10 new_measure_count += measure_count; 11 // 白鍵と黒鍵の描画 12 SolidBrush white_keyboard_color = new SolidBrush(Color.FromArgb(255, 255, 255)); 13 Pen black_line_color = new Pen(Color.FromArgb(0, 0, 0), 1); 14 black_line_color.Alignment = System.Drawing.Drawing2D.PenAlignment.Inset; 15 SolidBrush black_keyboard_color = new SolidBrush(Color.FromArgb(10, 10, 10)); 16 // 白鍵の描画 17 int white_start_y = 0; 18 for (int i = 0; i < PianoRoll.octave_num; i++) 19 { 20 foreach (int height in PianoRoll.white_key_board_height_list) 21 { 22 e.Graphics.FillRectangle(white_keyboard_color, 0, white_start_y, PianoRoll.WHITE_KEYBOARD_WIDTH, height); 23 e.Graphics.DrawRectangle(black_line_color, 0, white_start_y, PianoRoll.WHITE_KEYBOARD_WIDTH, height); 24 white_start_y += height; 25 } 26 } 27 // 黒鍵の描画 28 for (int i = 0; i < PianoRoll.octave_num; i++) 29 { 30 foreach (int black_key_board_start_y in PianoRoll.black_key_board_start_y_list) 31 { 32 e.Graphics.FillRectangle(black_keyboard_color, 0, black_key_board_start_y + (octave_draw_size_y * i), PianoRoll.BLACK_KEYBOARD_WIDTH, PianoRoll.BLACK_KEYBOARD_HEIGHT); 33 } 34 35 } 36 }
PictureBox ではいけないんですか?
panelに直接描画したいのです
それはどういう利点がありますか?
歌声合成ソフトの開発をしているのですが、それにあたり音符などの更新を容易にするためです
それに Panel を使う利点の話です。
panelの上にpictureboxを置いてpanelのAutoScrollをtrueにしましたが期待した動作を得られなかったのでpanelの上に直接描画してhscrollとvscrollを個別に配置しています
特に利点が無いのであれば、スクロールされるたびに Invalidate を行うのではなく、パネルの上に PictureBox を置き、PictureBox を適当な大きさに変更してスクロールはその下のパネルに任せるのが一番楽ではないかと思います。
私であれば PictureBox の代わりに CustomControl を使いますが、当面どちらでも問題ないかと。
「期待した動作」が何かにもよりますが、どのみちそこを伏せていたのでは適切な回答はつきにくいので、「やってみたこと」としてその方法を書き、また期待する動作と実際の動作を書くのがいいのではないでしょうか。
パネルをスクロールした時に描画の続きの部分が描画されるようにしたいのです
ですが、現状では続きの部分が描画されず、途切れてしまいます
その方法で続きが途切れるのは多分画像に描いていないからです。なんとなくやりたいことはわかりました。
Panelの上にPictureBoxを置いてスクロールバーを表示させることには成功しましたが、やはり描画がされません。
下記がコードです
private void NoteEdit_Scroll(object sender, ScrollEventArgs e)
{
pictureBox1.Update();
}
提示ソースは左側のキーボード部分の描画だと思いますが、これが右側のスクロールさせたい部分とどう関係があるのですか?
下記がコードですって言われても。私や YAmaGNZ さんのコードは動きましたか? 動いたならそれを応用すればいいのではないですか? もともとのコードがほぼ隠されている状態で、意図を丁寧に確認して十分なコードを出したつもりですが。