お世話になっております。
私が実現したいことは、作成する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
回答2件
あなたの回答
tips
プレビュー