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

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

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

Re[4]: Panel.Graphicについて


(過去ログ 115 を表示中)

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

■67957 / inTopicNo.1)  Panel.Graphicについて
  
□投稿者/ まさお (1回)-(2013/09/11(Wed) 18:58:52)

分類:[C#] 

こんばんは。質問させて頂きます。
Form上にpanel1を配置し、さらにpanel1の中にpanel2を配置し、panel2.CreateGraphic()で帳票っぽく表示したく、以下のようにコードを書きました。
場所は、FormのShownイベントです。

    private void Form1_Shown(object sender, EventArgs e)
    {
        Font lblFont = new Font("MS UI Gothic", (float)11.25);  // ラベルのフォントスタイル、サイズ
        Graphics graphicForm = this.CreateGraphics();

        // 背景描画
        graphicForm.FillRectangle(new SolidBrush(Color.FromArgb(192, 255, 192)), 0, 0, 1350, 35);
        // タイトル
        graphicForm.DrawString("タイトル1 : あああああ", lblFont, Brushes.Black, 10, 10);

        // 背景描画2行目
        graphicForm.FillRectangle(new SolidBrush(Color.FromArgb(192, 255, 255)), 0, 35, 1350, 25);
        Color bkColor;    // 背景色

        Graphics graphicPanel = this.panel2.CreateGraphics();

        // データ個数でループ
        Int32 kosuu = 1000;
        for (Int32 i = 0; i < kosuu; i++) {
            // 背景色の決定
            if (i % 2 > 0) {
                bkColor = Color.SkyBlue;
            }
            else {
                bkColor = Color.LightYellow;
            }
            this.panel2.Size = new Size(1350, i * 150);
            // 背景描画
            graphicPanel.FillRectangle(new SolidBrush(bkColor), 0, i * 150, 1350, 150);

        }
    }

やりたいことは、
・panel2に描画したいものが描画されないので、描画したい。
panel1に直接描画はできたのですが、スクロールさせる方法が分からず、panel2にしました。
panel1のAutoScroll=true としております。
kosuuにはいくつデータが来るか前もって分からない前提で、最大数も持ちません。サンプルで1000としております。
色を変えた各帯の上にも、データを数十描画します。
始めはラベル等をAddRangeしておりましたが、kosuuが多くなるとあまりに動作が重く、DrawStringなどで実装することとしました。

何分、C#始めて日が浅いもので、色々勘違いしている部分があるかもしれませんが、どうかご教授お願い致します。

引用返信 編集キー/
■67958 / inTopicNo.2)  Re[1]: Panel.Graphicについて
□投稿者/ 魔界の仮面弁士 (336回)-(2013/09/11(Wed) 19:11:26)
No67957 (まさお さん) に返信
> Form上にpanel1を配置し、さらにpanel1の中にpanel2を配置し、
親子関係になっていて、描画しているのや Form と panel2 だけなのですね?


> panel2.CreateGraphic()で帳票っぽく表示したく、以下のようにコードを書きました。
CreateGraphic ではなく
CreateGraphics という点はさておき。

CreateGraphic したなら、使用後に Dispose せねばなりません。
Font や SolidBrush も同様に、使用後に Dispose が必要です。


> ・panel2に描画したいものが描画されないので、描画したい。
CreateGraphics で得た描画キャンパスは一時的なものなので、
コントロールの再描画タイミング(最小化した場合や、他のウィンドウが重なった後など)で
描画結果は容易に失われてしまいます。

永続的な描画を求める場合は、Paint イベントで処理するようにするか、
または Bitmap に描画して、それを背景画像として使うなどで対処しましょう。
引用返信 編集キー/
■67959 / inTopicNo.3)  Re[2]: Panel.Graphicについて
□投稿者/ まさお (2回)-(2013/09/11(Wed) 19:51:03)
No67958 (魔界の仮面弁士 さん) に返信
魔界の仮面弁士様
お返事ありがとうございます。Dispose()の件、気をつけます。ご指摘ありがとうございます。

> 永続的な描画を求める場合は、Paint イベントで処理するようにするか、
> または Bitmap に描画して、それを背景画像として使うなどで対処しましょう。
Bitmapに描画するとしたら、この上記のコードだと最終的には
panel2のWidth=1350,Height=データ数*150 となり、それを張り付けるということでしょうか?
引用返信 編集キー/
■67965 / inTopicNo.4)  Re[3]: Panel.Graphicについて
□投稿者/ Azulean (207回)-(2013/09/11(Wed) 22:43:37)
2013/09/11(Wed) 22:45:18 編集(投稿者)

No67959 (まさお さん) に返信
> Bitmapに描画するとしたら、この上記のコードだと最終的には
> panel2のWidth=1350,Height=データ数*150 となり、それを張り付けるということでしょうか?

データ数が 1000 といった規模になる可能性があるとすると、1000 * 150 = 150,000 となり、現実的ではないですね。
32,768 を超えるので、コントロールの高さを工夫して AutoScroll を使う路線も使えないでしょう。
(現実的ではないという理由は 16 ビット符号付き整数の上限 32,767 を超えることによってうまく動かないものがあること、メモリ的に 1,350 * 150,000 * 3 は連続的に確保できない可能性があることからです)

このため、自分でスクロールバーコントロールを配置し、そのスクロールバーの Value を元にどこのデータから描画しないといけないかを計算し、Paint イベントの中で自力に描く必要が出てきます。
(難易度の高いことをやろうとしていますのでそれなりに、ScrollBar コントロールとか、Paint イベントでどのように描いたらいいかと少しずつ調べ、経験を積んでいくところから始めた方がよいかも)
引用返信 編集キー/
■67981 / inTopicNo.5)  Re[4]: Panel.Graphicについて
□投稿者/ まさお (5回)-(2013/09/12(Thu) 18:08:15)
No67965 (Azulean さん) に返信
Azulean 様
ご返信ありがとうございます。
PanelにVScrollBarを配置し、Panel.Paintイベントにて描画処理し、なんとか望み通りの動作となりました。描画スピードも問題ありません。
アドバイス頂いた通り、VScrollBarの値から、レコードの表示開始インデックスを算出し、1画面に表示できる数分を描画する、としました。
ありがとうございました。
ソースは職場にあるので、ご提示できず、申し訳ありません。

魔界の仮面弁士様もありがとうございました。
また何かありましたら、よろしくご教授お願いします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -