質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

965閲覧

フォームを引数としたメソッドを作りたい

hanbee.com

総合スコア52

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/04/12 22:45

編集2021/04/24 07:14

お世話になっております。
私が実現したいことは、作成するWindowsFormsApplicationを使用する端末の解像度を問わず、
フルスクリーンで表示して、かつコントロールも追従したサイズで表示することです。

以下のコードはネット検索して得たものです。
基本的にこれを入れておいて、フォームのLoadイベントで呼び出しをすれば、
目的の動作は達成してくれるのかなと思っています。

' --- 変数宣言 Private originalSize As Size ' -- コントロール・スケーリング用オリジナルサイズ Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) _ Handles MyBase.SizeChanged Me.SuspendLayout() ' --- フォーム上のコントロールのサイズと位置を調整 If Not (Me.WindowState = FormWindowState.Minimized) Then ' --- サイズファクターの決定 Dim sfWidth As Single = (Me.ClientSize.Width / Me.originalSize.Width) Dim sfHeight As Single = (Me.ClientSize.Height / Me.originalSize.Height) Dim sizeFactor As New SizeF(sfWidth, sfHeight) ' --- 各コントロールのスケーリング For Each ctrl As Control In Me.Controls If (TypeOf ctrl Is ListBox) Then DirectCast(ctrl, ListBox).IntegralHeight = False End If If (TypeOf ctrl Is ComboBox) Then DirectCast(ctrl, ComboBox).IntegralHeight = False End If ' --- フォントのスケーリング Dim fntScale As Single = (ctrl.Font.Size * sizeFactor.Height) ctrl.Font _ = New Font(ctrl.Font.FontFamily, fntScale, ctrl.Font.Style, ctrl.Font.Unit) ' --- コントロールのスケーリング ctrl.Scale(sizeFactor) Next ' --- オリジナルサイズに保存 Me.originalSize = Me.ClientSize End If End Sub

ただ、フォームが多いアプリケーションなので、全フォームにこれを入れるのが少し面倒なのです。
これをプロパティにして、各フォームのLoadとかで呼び出したいのですが、
以下のようにコードを作りましたが、「originalSize」というのがないというエラーが出て動いてくれません。
どのようにすればよいのでしょうか。

Module resolution ' --- 変数宣言 Private originalSize As Size ' -- コントロール・スケーリング用オリジナルサイズ Public Sub Form1_SizeChanged(sender As Object, e As EventArgs) sender.SuspendLayout() ' --- フォーム上のコントロールのサイズと位置を調整 If Not (sender.WindowState = FormWindowState.Minimized) Then ' --- サイズファクターの決定 Dim sfWidth As Single = (sender.ClientSize.Width / sender.originalSize.Width) Dim sfHeight As Single = (sender.ClientSize.Height / sender.originalSize.Height) Dim sizeFactor As New SizeF(sfWidth, sfHeight) ' --- 各コントロールのスケーリング For Each ctrl As Control In sender.Controls If (TypeOf ctrl Is ListBox) Then DirectCast(ctrl, ListBox).IntegralHeight = False End If If (TypeOf ctrl Is ComboBox) Then DirectCast(ctrl, ComboBox).IntegralHeight = False End If ' --- フォントのスケーリング Dim fntScale As Single = (ctrl.Font.Size * sizeFactor.Height) ctrl.Font _ = New Font(ctrl.Font.FontFamily, fntScale, ctrl.Font.Style, ctrl.Font.Unit) ' --- コントロールのスケーリング ctrl.Scale(sizeFactor) Next ' --- オリジナルサイズに保存 sender.originalSize = sender.ClientSize End If End Sub End Module

また、そもそもになりますが、
もしかして私がこのような心配をしなくても、今のFrameWork4.7.2では目的の動作を勝手に行ってくれるのでしょうか。
目的の動作というのは、コントロールの大きさがフォームのSizeChangeの割合に応じて追従してくれることです。
以前解像度が違う端末に移したとき、フォームだけ大きさが広がって、コントロールだけ取り残されていたような
印象だったもので。
もしかしてそれはFrameWork4.6.1のものでやったからなのでしょうか。

以上、長文失礼しました。宜しくお願いします。

追記
Dock,Anchorを試してみましたが、どうやらコントロールを列挙して都合のいいように動作してくれません。
やはり、上記のコードを使ったほうが、動作としては良かったです。
これをプロパティにするには、、どのような工夫が必要になるのでしょうか。

追記2
私がしていたコードを書きます

' --- 変数宣言 Private originalSize As Size ' -- コントロール・スケーリング用オリジナルサイズ Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) _ Handles MyBase.SizeChanged Me.SuspendLayout() ' --- フォーム上のコントロールのサイズと位置を調整 If Not (Me.WindowState = FormWindowState.Minimized) Then ' --- サイズファクターの決定 Dim sfWidth As Single = (Me.ClientSize.Width / Me.originalSize.Width) Dim sfHeight As Single = (Me.ClientSize.Height / Me.originalSize.Height) Dim sizeFactor As New SizeF(sfWidth, sfHeight) ' --- 各コントロールのスケーリング For Each ctrl As Control In Me.Controls If (TypeOf ctrl Is ListBox) Then DirectCast(ctrl, ListBox).IntegralHeight = False End If If (TypeOf ctrl Is ComboBox) Then DirectCast(ctrl, ComboBox).IntegralHeight = False End If ' --- フォントのスケーリング Dim fntScale As Single = (ctrl.Font.Size * sizeFactor.Height) ctrl.Font _ = New Font(ctrl.Font.FontFamily, fntScale, ctrl.Font.Style, ctrl.Font.Unit) ' --- コントロールのスケーリング ctrl.Scale(sizeFactor) Next ' --- オリジナルサイズに保存 Me.originalSize = Me.ClientSize End If End Sub   Public moni_height As Integer Public moni_width As Integer Public Sub New() 'ディスプレイの高さ Dim h As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height moni_height = h 'ディスプレイの幅 Dim w As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width moni_width = w End Sub Private Sub form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load '大きさを画面の大きさに指定すると、サイズチェンジイベントがあるので、コントロールも同じ割合で大きくなってくれる。 Me.Top = 1 Me.Left = 1 Me.Height = moni_height Me.Width = moni_width End sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/04/13 03:14

Dock や Anchor を使っていないからでしょう。
hanbee.com

2021/04/13 03:19

回答ありがとうございます。 まさに求めている情報に近い情報かもしれません。 今は時間がないので、詳細な検証はできませんが、 あとで調べたいと思います。
hanbee.com

2021/04/13 03:28

Dock,Anchorというものを初めて知りました。 確かにそれは全く触ったことがありません。 今確認してみたら、すべてのコントロールでNoneとなっていそうです。
hanbee.com

2021/04/13 03:29

それを使えば、私が示したコードを書く必要は全くなくなるということなのですね。
hanbee.com

2021/04/13 23:08

調べてみました。 デザイナからコントロールのAnchorプロパティをTop, Bottom, Left, Rightに設定することで、 フォームの大きさに応じて勝手にリサイズすることを確認できました。 しかし一つ一つ今からコントロールのプロパティを変えるのは大変なので、 以下のようにコードで一括にプロパティを変えたいのですが、 このコードでは、Top, Bottom, Left, Rightの設定にはなってくれず、 最後の行の、Rightになるだけみたいなのですが、 この解決方法をご存じでしたら教えていただきたいです。 For i = 0 To Controls.Count - 1 Controls(i).Anchor = AnchorStyles.Top Controls(i).Anchor = AnchorStyles.Bottom Controls(i).Anchor = AnchorStyles.Left Controls(i).Anchor = AnchorStyles.Right Next i 尚、dockについては、dockstyle.fillにすればいいのかなと同様にしてやってみたら、 フォームの大きさいっぱいいっぱいにまで広がっておかしくなったので使っていません。 dockについてはあまりよくわかっていません。 どうか宜しくお願い致します。
Zuishin

2021/04/13 23:22

一つのコントロールをクリックし、シフトを押しながら他のコントロールをクリックすると複数選択でき、複数のコントロールのプロパティを一度に変えることができます。 コードで行う場合は「|」演算子を使って AnchorStyles.Left | AnchorStyles.Top のようにフラグを合成してください。
hanbee.com

2021/04/13 23:24

有難うございます。できました。 しかし、ピクチャーボックスやラベルはオートリサイズしてくれないのですね。 これについてもリサイズ可能になるプロパティがあるのですね。
Zuishin

2021/04/13 23:51

AutoSize を false にしてください。
hanbee.com

2021/04/14 03:18

有難うございます。以下のコードをやってみましたが、 ラベルはやはり、リサイズしません。 また、フォーム上にあるコンテナーのパネルなども動いてくれません。 申し訳ありませんが、教えていただけないでしょうか。 For i = 0 To Controls.Count - 1 Controls(i).AutoSize = False Controls(i).Anchor = AnchorStyles.Top Or AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right Next i
hanbee.com

2021/04/14 03:19

また「AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right」 とするとエラーになったので、Orを使っています。
退会済みユーザー

退会済みユーザー

2021/04/23 01:19

とりあえず "WinForms 高DPI" でググってみては。
hanbee.com

2021/04/23 09:52

radian様、ご回答ありがとうございます。 高DPIということですが、私は厳密にいうと、ただ、 1920×1080の解像度のデスクトップPCで作ったWindowsFormsApplicationを 1200×1920の解像度のタブレットPCでフルスクリーンになるようにしたいだけなのですが、 (この際1200×1920に限らず、どんな解像度の端末に入れても対応できるようにしたいです。) これは高DPIが絡む話なのでしょうか。
退会済みユーザー

退会済みユーザー

2021/04/23 10:45 編集

解像度だけではなく表示スケールの問題もあります。また、どの端末でもとなると、単純に解像度に合わせるだけだと、縦横比が違う場合、フォントサイズとの兼ね合いで表示テキストが切れたりする可能性がありますが、その辺りは問題ないのでしょうか?
hanbee.com

2021/04/23 11:19

返信ありがとうございます。 難しいテーマなのですね。。。 テキストが切れたりとかは考慮していませんでしたが、そうなりますよね。 いまのところ、私が質問文で挙げたコードが割と良い感じで動いてくれる(テキストが重なったりもしない)ので、描画変更のプロシージャでは目的の大きさに合わせてくれるようにフォームのサイズチェンジを何度も呼び出して対応しようかなと思います。 後でいま考えているコードを投稿します。 なにかレビュー頂ければ嬉しいです。
MasayaIshihara

2021/04/23 17:18

ここ見てませんでした。 ある程度、ターゲットとする端末の解像度に合わせてフォームデザインするほうがよろしいかと思います。 画面比率が変わると、場合によってはコントロールのLocationが丸められてしまうので位置がずれてきます。DPIの問題ですね
hanbee.com

2021/04/24 07:00

そうですね。使用する端末に合わせて作っていなかったので、いまから各フォーム、コントロールのサイズを変えるのも非常に時間がかかるので、こんな質問を投稿しました。 画面比率に各コントロールを対応させることは可能だけど、うまいことなってくれないこともあるんですね。 ご回答ありがとうございます。今から読んで、理解しようと思います。
guest

回答2

0

どのフォームでも実行させたいのであれば、継承フォームを作るという手はあります。
例えば、下記のようなクラスを作成します。
DoScalingの中身は、提示されたサンプルのForm1_SizeChangedと同じロジックなので、正しいかどうかは知りません。SuspendLayoutしてるけどResumeLayoutしてないので追加したのと、キャストを追加した程度です。

vbnet

1Imports System.Windows.Forms 2 3Public Class AutoScalingForm 4 Inherits Form 5 6 Private originalSize As Size ' -- コントロール・スケーリング用オリジナルサイズ 7 8 Protected Overrides Sub OnLoad(e As EventArgs) 9 MyBase.OnLoad(e) 10 11 '最大化前のサイズを記憶 12 originalSize = Me.Size() 13 14 '最大化 15 Me.WindowState = FormWindowState.Maximized 16 End Sub 17 18 Protected Overrides Sub OnSizeChanged(e As EventArgs) 19 MyBase.OnSizeChanged(e) 20 21 'フォームデザイナから実行された場合は何もしない 22 If DesignMode Then 23 Return 24 End If 25 26 DoScaling() 27 End Sub 28 29 Protected Sub DoScaling() 30 Try 31 Me.SuspendLayout() 32 ' --- フォーム上のコントロールのサイズと位置を調整 33 If Not (Me.WindowState = FormWindowState.Minimized) Then 34 ' --- サイズファクターの決定 35 Dim sfWidth As Single = CSng(Me.ClientSize.Width / Me.originalSize.Width) 36 Dim sfHeight As Single = CSng(Me.ClientSize.Height / Me.originalSize.Height) 37 Dim sizeFactor As New SizeF(sfWidth, sfHeight) 38 ' --- 各コントロールのスケーリング 39 For Each ctrl As Control In Me.Controls 40 If (TypeOf ctrl Is ListBox) Then 41 DirectCast(ctrl, ListBox).IntegralHeight = False 42 End If 43 If (TypeOf ctrl Is ComboBox) Then 44 DirectCast(ctrl, ComboBox).IntegralHeight = False 45 End If 46 ' --- フォントのスケーリング 47 Dim fntScale As Single = (ctrl.Font.Size * sizeFactor.Height) 48 ctrl.Font _ 49 = New Font(ctrl.Font.FontFamily, fntScale, ctrl.Font.Style, ctrl.Font.Unit) 50 ' --- コントロールのスケーリング 51 ctrl.Scale(sizeFactor) 52 Next 53 ' --- オリジナルサイズに保存 54 Me.originalSize = Me.ClientSize 55 End If 56 Finally 57 Me.ResumeLayout() 58 End Try 59 End Sub 60 61End Class

そして、アプリケーションのフォームの継承元を
System.Windows.Forms.Form から AutoScalingForm に変更します。

vbnet

1Partial Class Form1 2 Inherits AutoScalingForm

これで、SizeChangedイベント発生時にAutoScalingFormのOnSizeChangedが呼び出されます。

【デザイン時フォーム】
デザイン時

【実行時フォーム(1920x1050を640x350に縮小)】
実行時

投稿2021/04/24 03:29

編集2021/04/24 04:07
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanbee.com

2021/04/25 22:26

ご回答ありがとうございます。 継承については、あまりわかっていないのですが、 また理解していきたいと思います。
hanbee.com

2021/05/08 07:50

この方法を試してみましたが、 新しいクラスAutoScalingFormを作成し、ご提示のコードをコピペさせていただいたところ、 form1でinherits AutoScalingFormとしたときにエラーが出ました 「クラス'Form1'に指定された基本クラス'AutoScalingForm'はその他のPartial型の1つである基本クラス'Form'と異なることはできません。」というエラーです。 これはどういうことなのでしょうか。
退会済みユーザー

退会済みユーザー

2021/05/08 09:05 編集

Form1.Designer.vbにもInherits書いてないですかね。例えば、Form1.vbとForm1.Designer.vbで違うクラスのInherits書いてるとエラーになると思います。どちらか片方に記述してください。
hanbee.com

2021/05/08 09:25

Designer.vbを編集するのですね。 なるほど、レベルの高いことなのですね。。。
hanbee.com

2021/05/08 09:26

inherit formというようになっていたので、それを削除しました。
guest

0

ベストアンサー

OriginalSizeがないなら宣言すればよい モジュール化するならパブリックで

vb.net

1フォーム 2Public Class Form1 3 Public OriginalSize As Size 4 Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load 5 OriginalSize = Me.ClientSize 'クライアントサイズ初期値を代入 6 Me.WindowState = FormWindowState.Maximized'クライアントサイズ最大化 7 'Form2.Show()'動作チェック用 8 End Sub 9 10どっちにしろSizeChangedはハンドルする必要がある。 11 12 Private Sub Form_SizeChanged(sender As Object, e As EventArgs) Handles MyBase.SizeChanged 13 FormScaling(Me) 14 End Sub 15End Class 16 17 18モジュール 19Module resolution 20 Private originalSize_bin As Size ' -- コントロール・スケーリング用オリジナルサイズ 21 Public Sub FormScaling(sender As Object) 22 originalSize_bin = sender.ClientSize 23 sender.SuspendLayout() 24 2526 27 28 sender.originalSize = originalSize_bin 29 End If 30 End Sub 31End Module 32コード

投稿2021/04/23 16:47

編集2021/04/23 23:36
MasayaIshihara

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanbee.com

2021/04/24 07:35

なるほどです。上半分のコードを追加して、formscalingを呼び出せばいいのですね。
hanbee.com

2021/04/26 13:08

もしかしてこれは、form1クラスでoriginalsizeをパブリックで宣言しているので、resolutionモジュールに対してはform1クラスでしか使えないことになりますね。 私はform2, form3 , form4でも同様にして使いたいのですが、それは難しいですかね。
hanbee.com

2021/04/26 23:24

できました。有難うございます。 結果のコードをあとで報告します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問