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

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

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

PictureBoxに目盛りを付ける方法

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

■97795 / inTopicNo.1)  PictureBoxに目盛りを付ける方法
  
□投稿者/ ぬこ (1回)-(2021/07/14(Wed) 12:16:52)

分類:[.NET 全般] 

VB.NET2015を使っております。

https://www.xlsoft.com/jp/products/arction/images/tutorial/2d_heatmap.png

この画像のようにイメージ下端と左端に目盛りを付けたいのですが
どのようにすれば良いでしょうか?

PictureBoxよりも少し小さめの
イメージをPictureBoxに表示した上で、
PictureBox内の左下に自力で目盛りを描画するしかないですか?

かなり面倒そうなので、
Chart機能みたいにして
自動で描画されるような機能を使いたいのですが
そのような機能はございますでしょうか?




引用返信 編集キー/
■97796 / inTopicNo.2)  Re[1]: PictureBoxに目盛りを付ける方法
□投稿者/ ぬこ (2回)-(2021/07/14(Wed) 12:19:44)
あと、できれば外部DLLを使わない方法でお願い致します。

 
引用返信 編集キー/
■97797 / inTopicNo.3)  Re[1]: PictureBoxに目盛りを付ける方法
□投稿者/ 魔界の仮面弁士 (3152回)-(2021/07/14(Wed) 13:27:49)
No97795 (ぬこ さん) に返信
> この画像のようにイメージ下端と左端に目盛りを付けたいのですが
> どのようにすれば良いでしょうか?
目盛りが固定なら .emf なり .png なりを用意されては如何でしょうか。
動的なら、For ループで DrawLine と DrawString を行えば良いかと思います。
https://dobon.net/vb/dotnet/graphics/

> PictureBoxよりも少し小さめの
> イメージをPictureBoxに表示した上で、
> PictureBox内の左下に自力で目盛りを描画するしかないですか?
イメージと目盛りの両方を、一枚の PictureBox に描画するのでは駄目なのでしょうか。
引用返信 編集キー/
■97798 / inTopicNo.4)  Re[2]: PictureBoxに目盛りを付ける方法
□投稿者/ ぬこ (3回)-(2021/07/14(Wed) 14:02:02)
ありがとうございます。

イメージ上でクリックした時に
ラインを描画したりするコードを書いているので、
PictureBoxの内側にイメージと目盛りを別に描画すると
かなりコードを書くのが面倒になるので避けたいと考えています。

Tablelayoutpanelを使って
イメージ用のPictureBoxの下と左に別にPictureBoxを配置して
そこに目盛りを書く方法だと、端の目盛りが隠れてしまう恐れがあります。


引用返信 編集キー/
■97799 / inTopicNo.5)  Re[3]: PictureBoxに目盛りを付ける方法
□投稿者/ 魔界の仮面弁士 (3153回)-(2021/07/14(Wed) 14:28:33)
No97798 (ぬこ さん) に返信
> PictureBoxの内側にイメージと目盛りを別に描画すると
> かなりコードを書くのが面倒になるので避けたいと考えています。

目盛りを、PictureBox の親コントロール(たとえば Form) に描画してはどうでしょう。
引用返信 編集キー/
■97802 / inTopicNo.6)  Re[3]: PictureBoxに目盛りを付ける方法
□投稿者/ shu (1259回)-(2021/07/14(Wed) 15:39:46)
No97798 (ぬこ さん) に返信

pictureboxをpanelの中に入れて
panelに描画を行うのは駄目でしょうか?
引用返信 編集キー/
■97803 / inTopicNo.7)  Re[4]: PictureBoxに目盛りを付ける方法
□投稿者/ ぬこ (5回)-(2021/07/14(Wed) 17:59:32)
ありがとうございます。

TablelayoutpanelやFormにも直接線や文字列を描画できるのですね。

これは良い方法だと思います。


Private Sub TableLayoutPanel12_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles TableLayoutPanel12.Paint

Dim g As Graphics = e.Graphics
g.DrawLine(pPen, 0, 0, TableLayoutPanel12.ClientSize.Width * 2, 200)


End Sub

のようにして、Tablelayoutpanel内にラインを描画できることは確認できました。

いま、2列、2行のTablelayoutpanelがあり、
2列目、1行目にPictureBoxが格納されており、
1列目の右端の座標と
2列目の上端の座標を取得したいのですが
どのようにすれば良いですか?

検索して調べると

http://bbs.wankuma.com/index.cgi?mode=al2&namber=92909&KLOG=161
TableLayoutPanel26.CellPaintでの取得の仕方は見つかったのですが、
TableLayoutPanel26.Paintで取得することはできないでしょうか?


引用返信 編集キー/
■97804 / inTopicNo.8)  Re[5]: PictureBoxに目盛りを付ける方法
□投稿者/ 魔界の仮面弁士 (3154回)-(2021/07/14(Wed) 18:34:27)
No97803 (ぬこ さん) に返信
> TablelayoutpanelやFormにも直接線や文字列を描画できるのですね。
TableLayoutPanel は既定でダブルバッファリングが無効なため、
ちらつきが大きくなりがちです。

既知かも知れませんが、ダブルバッファリングを有効にするコードを貼っておきます。
http://jumbofoot.cocolog-nifty.com/yass_vbnet_tips/2005/10/post_b019.html
https://dobon.net/vb/dotnet/control/doublebuffered.html#section2

> いま、2列、2行のTablelayoutpanelがあり、
2 行 2 列程度なら、TableLayoutPanel を使わずに
素の Panel の上に配置して、PicutreBox を右上に固定するために
PictureBox の Anchor プロパティだけセットする形でも良いかも。


> TableLayoutPanel26.CellPaintでの取得の仕方は見つかったのですが、
> TableLayoutPanel26.Paintで取得することはできないでしょうか?

内部実装を追ってみました。

TableLayoutPanel の OnCellPaint メソッドは
TableLayoutPanel の OnPaintBackground メソッド内から呼ばれているようです。

そして、CellPaint イベントのためのセルの描画座標の測定には
TableLayout.Strip というオブジェクトが使われていますが、
これは非公開オブジェクトであり、外部から直接測定できるようにはなっていません。


> どのようにすれば良いですか?
2 行 2 列という縛りがあるので、今回の場合であれば
PictureBox の Margin を 0 にしておけば、
PictureBox の Left と Bottom から算出できるかと思います。

TableLayoutPanel の CellBorderStyle や Padding を変更している場合は、
その分も考慮して補正してみてください。
引用返信 編集キー/
■97806 / inTopicNo.9)  Re[6]: PictureBoxに目盛りを付ける方法
□投稿者/ ぬこ (7回)-(2021/07/14(Wed) 20:09:29)
2021/07/14(Wed) 20:09:56 編集(投稿者)
詳細なご回答ありがとうございます。

http://jumbofoot.cocolog-nifty.com/yass_vbnet_tips/2005/10/post_b019.html

のコードを試してみましたが、
私の環境ではダブルバッファー有りと無しを比較して違いは見られませんでした。

Win10を使っていて
システムのプロパティのパフォーマンスで
デザインを優先にすると、オンオフに拘わらず書き換える作業が現れませんでした。
パフォーマンスを優先にすると、オンオフに拘わらず書き換える作業が現れました。


一方で、


    Private Sub TableLayoutPanel12_CellPaint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TableLayoutCellPaintEventArgs) Handles TableLayoutPanel12.CellPaint

        Dim g As Graphics = e.Graphics
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality

        '一つおきにセルの背景色を変更する
        If (e.Column Mod 2 = 1) Xor (e.Row Mod 2 = 1) Then
            e.Graphics.FillRectangle(Brushes.LightSkyBlue, e.CellBounds)
        End If

    End Sub


というコードに関してダブルバッファー有りと無しを比較すると
大きな差異が現れました。
明らかにバッファー無しにするとちらつきが出てきます。

ただし、
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
をコメントアウトすると、
やはりダブルバッファー有りと無しに拘わらずちらつきは現れません。


もしかすると、上記の記事はVB2005のものなので
今だと仕様が変更になっているのではないでしょうか?

何となく、古いバージョンだと、
TableLayoutPanel上に配置されたボタンなどのコントロールも
TableLayoutPanelのバッファリングの影響を受けるが、
新しいバージョンだと配置されたコントロールは影響を受けず
TableLayoutPanelのPaintに描画されたものだけが影響を受けるということはないでしょうか?

あるいは、私の環境や設定が何か間違っているのでしょうか?

あと、PictureBoxの位置に関する情報ありがとうございます。



引用返信 編集キー/
■97826 / inTopicNo.10)  Re[7]: PictureBoxに目盛りを付ける方法
□投稿者/ PATIO (7回)-(2021/07/20(Tue) 16:40:46)
No97806 (ぬこ さん) に返信
> 2021/07/14(Wed) 20:09:56 編集(投稿者)
>
> 詳細なご回答ありがとうございます。
>
> http://jumbofoot.cocolog-nifty.com/yass_vbnet_tips/2005/10/post_b019.html
>
> のコードを試してみましたが、
> 私の環境ではダブルバッファー有りと無しを比較して違いは見られませんでした。
>
> Win10を使っていて
> システムのプロパティのパフォーマンスで
> デザインを優先にすると、オンオフに拘わらず書き換える作業が現れませんでした。
> パフォーマンスを優先にすると、オンオフに拘わらず書き換える作業が現れました。

この書き換える作業が現れましたと言うのは「ちらつく」という意味でしょうか?


> 何となく、古いバージョンだと、
> TableLayoutPanel上に配置されたボタンなどのコントロールも
> TableLayoutPanelのバッファリングの影響を受けるが、
> 新しいバージョンだと配置されたコントロールは影響を受けず
> TableLayoutPanelのPaintに描画されたものだけが影響を受けるということはないでしょうか?
>
> あるいは、私の環境や設定が何か間違っているのでしょうか?

元々ちらつきが起きるというのは描画負荷が高い為に描画速度が遅くなって
描画している途中の状態が見えてしまっている状態なので
ハードウエア性能でカバーできている場合はちらつきは出にくくになります。
私も以前に何かのプログラムを作成している時に似たような状況を見たような気がするのですが、
ウインドウ画面はそのすべてをグラフィック描画で表現しているので描画負荷が高い傾向があると思います。
Windowの描画に関しては出来る限り描画負荷を抑える為に
変化があったデータに関連する範囲に対して現在の描画内容を無効化し、
画面に反映する時に変化がない部分は書き換え対象から外すという仕組みで描画の負荷を抑え込んでいます。
ハードウエアの描画性能が今ほどではなかった頃の名残ですが、言われている状況は
下に配置されているTableLayoutPanelの無効化が上に載っているコントロールに伝搬しているか
どうかの違いのように見えます。
描画周りの細かい仕様はフレームワークのバージョンや描画ライブラリの代替わりで調整が入るので
バージョンの違いによるものかもしれません。
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ