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

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

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

Re[8]: TableLayoutにぴったり収まるサイズの取得方法


(過去ログ 160 を表示中)

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

■92871 / inTopicNo.1)  TableLayoutにぴったり収まるサイズの取得方法
  
□投稿者/ ロボ (1回)-(2019/11/04(Mon) 20:33:56)

分類:[.NET 全般] 

いま、2行、1列のTableLayoutをフォーム上に配置しており、
これの2行目のセル内にぴったり収まるように
PictureBoxを配置したいと考えています。

PictureBoxのアスペクト比は決まっており、
もし、セルの幅か高さがフィットするように配置したいと考えています。
つまり、PictureBoxの方がセルよりも幅が狭い場合には、
両脇にスペースができ、
高さが小さい場合には、上下にスペースを作るようなかたちにしたいと考えています。



        Dim TL_Height As Integer = TableLayoutPanel1.GetRowHeights(1)

        Dim TL_Width As Integer = TableLayoutPanel1.GetColumnWidths(0)


のようにして配置したいセルの高さを幅を取得できます。

そして、


        Dim SetSize As Size

        If TL_Height / TL_Width > ImageAspect Then

            SetSize.Width = TL_Width
            SetSize.Height = CInt(SetSize.Width * ImageAspect)

        Else

            SetSize.Height = TL_Height
            SetSize.Width = CInt(SetSize.Height / ImageAspect)

        End If


        PictureBox1.Size = SetSize

のようにしてサイズを設定します。

例えば、以下のパラメータの時、

TL_Height = 527
TL_Width = 900

ImageAspect = 1.001

設定するサイズは以下のように求まります。

SetSize.Width = 526
SetSize.Height = 527

しかし、

PictureBox1.Size = SetSize

で設定した後の実際のPictureBox1のサイズを取得すると以下のようになります。

PictureBox1.Size.Width = 526
PictureBox1.Size.Height = 521

なぜか、TableLayoutのセルの高さよりも6ピクセル小さな値が使われています。

TableLayoutには罫線があるため
それの分少なくなったのではないかと思うのですが、
それでも2ピクセルくらいしか変わらないと思います。

どのようにして、521ピクセルの値が求まるのでしょうか?

セルのClientSizeのようなものの求め方があればお教えください。

引用返信 編集キー/
■92873 / inTopicNo.2)  Re[1]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ Azulean (1098回)-(2019/11/04(Mon) 21:06:15)
2019/11/04(Mon) 21:07:00 編集(投稿者)

No92871 (ロボ さん) に返信
> PictureBoxのアスペクト比は決まっており、
> もし、セルの幅か高さがフィットするように配置したいと考えています。

この背景が知りたいですね。

PictureBox の Image プロパティに設定している画像をアスペクト比を維持して拡縮したいのであれば、PictureBoxSizeMode で Zoom を指定しつつ、PictureBox の Dock プロパティを Fill にしたら良さそうであるため。
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.pictureboxsizemode?view=netframework-4.8


> なぜか、TableLayoutのセルの高さよりも6ピクセル小さな値が使われています。

Margin プロパティじゃないでしょうか?
すべてのコントロールはデフォルトで Margin プロパティに (3, 3, 3, 3) となるので、上下左右に 3pixel ずつ、合計で 6pixel のマージンができるはずなので。
試しに PictureBox1 の Margin プロパティの値をすべて 0 にしてみてください。
引用返信 編集キー/
■92876 / inTopicNo.3)  Re[2]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ ロボ (2回)-(2019/11/04(Mon) 21:34:43)

Marginが原因でしたか。
どうもありがとうございました。



> この背景が知りたいですね。

実際には、PicutureBoxは一つではなく
複数個をTableLayoutで拡大縮小したいためです。


解決済み
引用返信 編集キー/
■92877 / inTopicNo.4)  Re[3]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ Azulean (1100回)-(2019/11/04(Mon) 21:38:23)
No92876 (ロボ さん) に返信
> 実際には、PicutureBoxは一つではなく
> 複数個をTableLayoutで拡大縮小したいためです。

1 つのセルに複数個置くということ…?

「1 つのセルに 1 個ずつ置くだけ」かつ、「Image プロパティと SizeMode プロパティで拡縮する」なら、先にも書いた案は使えます。
ただ、自力で描画するなど、ちょっと事情があるとダメですけれども…。

お返事いただいた「背景・理由」がちょっともやっとしただけなので、私が書いたことに引っかかりがなければ、読み飛ばしていただいて構いません。
解決済み
引用返信 編集キー/
■92878 / inTopicNo.5)  Re[4]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ ロボ (3回)-(2019/11/04(Mon) 23:03:29)
「1 つのセルに 1 個ずつ置くだけ」
です。

例えば、PictureBoxが10個あったとして、
後から、サイズを変えたい場合、
TableLayoutを使わないと、
10個それぞれのサイズや位置を調整する必要があり、
非常に面倒なのです。

解決済み
引用返信 編集キー/
■92879 / inTopicNo.6)  Re[5]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ Azulean (1101回)-(2019/11/05(Tue) 06:22:21)
コミュニケーションのずれを正すようで申し訳ないですが…。

No92878 (ロボ さん) に返信
> TableLayoutを使わないと、
> 10個それぞれのサイズや位置を調整する必要があり、
> 非常に面倒なのです。

それは TableLayoutPanel を使う背景だと理解しています。
私が No92873 で気にした背景は「PictureBox のサイズでアスペクト比を守る背景(理由)は何だろうか?」でした。
引用した部分にポイントが複数あったのに対して、言葉が足りてなかったのかもしれません。


No92873 の繰り返しになってしまいますが、PictureBox が Image プロパティに設定してある画像を表示するだけであれば、
PictureBox の SizeMode プロパティに任せることで、サイズの制御にアスペクト比を気にする必要はないためです。
「自力描画しているケース」や「背景色を気にしている」ケースであれば理解できます。
解決済み
引用返信 編集キー/
■92881 / inTopicNo.7)  Re[6]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ ロボ (4回)-(2019/11/05(Tue) 10:28:29)
そうですね。

回答になっていませんでした。

もう少し具体的に書くと
PictureBoxの中でラインや四角を描画するプログラムを作成しており、
PictureBoxの中で
イメージのある領域のみで座標を取得したり、
イメージのある領域のみに一時的にマウスカーソルの動きを制限
したりする必要があるためです。

いま気付きましたが、
Zoomモードにした時に、イメージのある領域のみの
クライエント座標を取得するようなことは可能ですか?
もしこれができるのなら、そちらでも代用できるのですが。

引用返信 編集キー/
■92886 / inTopicNo.8)  Re[7]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ kiku (140回)-(2019/11/05(Tue) 16:50:10)
2019/11/05(Tue) 17:03:33 編集(投稿者)

No92881 (ロボ さん) に返信
> いま気付きましたが、
> Zoomモードにした時に、イメージのある領域のみの
> クライエント座標を取得するようなことは可能ですか?
> もしこれができるのなら、そちらでも代用できるのですが。

試していませんが、PictureBoxには
privateなImageRectangleFromSizeModeメソッドがあるようで、
これを直接呼べば取得できそうな予感。
privateなので呼ぶべきではないですが。。。。
https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/PictureBox.cs,5c2ab37313f547c2,references

今回の場合、質問者さんと同じように
自分で描画する方法をとると思います。
引用返信 編集キー/
■92893 / inTopicNo.9)  Re[7]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ Azulean (1102回)-(2019/11/05(Tue) 21:35:22)
No92881 (ロボ さん) に返信
> もう少し具体的に書くと
> PictureBoxの中でラインや四角を描画するプログラムを作成しており、
> PictureBoxの中で
> イメージのある領域のみで座標を取得したり、
> イメージのある領域のみに一時的にマウスカーソルの動きを制限
> したりする必要があるためです。

なるほど、そういうことであれば「Size プロパティを自前で調整する」か、「描画やマウスカーソルに関する処理を Size プロパティから計算した領域で処理するか」のいずれかですね。
すでに PictureBox に関する処理ができあがっているなら前者、つまり Size プロパティを自前で調整するということで納得です。

お手数をおかけしました。
引用返信 編集キー/
■92894 / inTopicNo.10)  Re[8]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ ロボ (5回)-(2019/11/05(Tue) 23:09:29)
どうもありがとうございます。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -