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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.92871 の関連記事表示

<< 0 >>
■92871  TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ ロボ -(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のようなものの求め方があればお教えください。
親記事 /過去ログ160より / 関連記事表示
削除チェック/

■92873  Re[1]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ Azulean -(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 にしてみてください。
記事No.92871 のレス /過去ログ160より / 関連記事表示
削除チェック/

■92876  Re[2]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ ロボ -(2019/11/04(Mon) 21:34:43)

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



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

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

記事No.92871 のレス / END /過去ログ160より / 関連記事表示
削除チェック/

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

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

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

    お返事いただいた「背景・理由」がちょっともやっとしただけなので、私が書いたことに引っかかりがなければ、読み飛ばしていただいて構いません。
記事No.92871 のレス / END /過去ログ160より / 関連記事表示
削除チェック/

■92878  Re[4]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ ロボ -(2019/11/04(Mon) 23:03:29)
    「1 つのセルに 1 個ずつ置くだけ」
    です。

    例えば、PictureBoxが10個あったとして、
    後から、サイズを変えたい場合、
    TableLayoutを使わないと、
    10個それぞれのサイズや位置を調整する必要があり、
    非常に面倒なのです。
記事No.92871 のレス / END /過去ログ160より / 関連記事表示
削除チェック/

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

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

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


    No92873 の繰り返しになってしまいますが、PictureBox が Image プロパティに設定してある画像を表示するだけであれば、
    PictureBox の SizeMode プロパティに任せることで、サイズの制御にアスペクト比を気にする必要はないためです。
    「自力描画しているケース」や「背景色を気にしている」ケースであれば理解できます。
記事No.92871 のレス / END /過去ログ160より / 関連記事表示
削除チェック/

■92881  Re[6]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ ロボ -(2019/11/05(Tue) 10:28:29)
    そうですね。

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

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

    いま気付きましたが、
    Zoomモードにした時に、イメージのある領域のみの
    クライエント座標を取得するようなことは可能ですか?
    もしこれができるのなら、そちらでも代用できるのですが。
記事No.92871 のレス /過去ログ160より / 関連記事表示
削除チェック/

■92886  Re[7]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ kiku -(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

    今回の場合、質問者さんと同じように
    自分で描画する方法をとると思います。
記事No.92871 のレス /過去ログ160より / 関連記事表示
削除チェック/

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

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

    お手数をおかけしました。
記事No.92871 のレス /過去ログ160より / 関連記事表示
削除チェック/

■92894  Re[8]: TableLayoutにぴったり収まるサイズの取得方法
□投稿者/ ロボ -(2019/11/05(Tue) 23:09:29)
    どうもありがとうございます。
記事No.92871 のレス / END /過去ログ160より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -