MSDN フォーラムでこんな質問がありました。
ユーザーが使うモニターの解像度に応じてウィンドウ(フォーム)のサイズを変えたい・・・
Form size and screen size
モニター解像度に応じてウィンドウのサイズを変えること自体は簡単なのですが・・・
ウィンドウのサイズが変わっても、その中にあるボタン、テキストボックスなどがそのままだとちょっとウレシクない。
枠だけが変わり、中身の大きさや位置は変わらないのですから・・・
なのでサンプルを作りました。
あまり多くはないのですが、
ウィンドウのサイズを変えたらそれに応じて中のボタンや文字の配置・サイズを変えたいことがあります。
ウィンドウの大きさにコントロールが追随する・・・そんな感じです。
主なコードはこんな具合。
(表示の関係で先頭のスペースは全角にしています)
▼▼ == ここから =========================================
' --- 変数宣言
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
▲▲ == ここまで =========================================
ですが、問題が残っています。
高 DPI モニターで、テキストなどの文字を 125%, 150% など(100% 以外)にされていると
思ったとおりにレイアウトされません。
合間をみて試行錯誤していますが、まだ完成に至りません。
コードはこれだけではありません。
試行錯誤中のコードもあります。
なので、Dropbox でプロジェクト全体を共有しました。
ファイル名は FlexForm_VB.zip (約600 KB)。
ダウンロードはここから・・・
https://www.dropbox.com/s/q6e24tdozyywacx/FlexForm_VB.zip?dl=0
言語は VB です。
お時間のある方はダウンロードしてお試しください。
改善点、DPI 対策にお気づきの場合は、ぜひご一報ください。
---------------------------------------------------------
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・
ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・
ユーザーが使うモニターの解像度に応じてウィンドウ(フォーム)のサイズを変えたい・・・
Form size and screen size
モニター解像度に応じてウィンドウのサイズを変えること自体は簡単なのですが・・・
ウィンドウのサイズが変わっても、その中にあるボタン、テキストボックスなどがそのままだとちょっとウレシクない。
枠だけが変わり、中身の大きさや位置は変わらないのですから・・・
なのでサンプルを作りました。
あまり多くはないのですが、
ウィンドウのサイズを変えたらそれに応じて中のボタンや文字の配置・サイズを変えたいことがあります。
ウィンドウの大きさにコントロールが追随する・・・そんな感じです。
主なコードはこんな具合。
(表示の関係で先頭のスペースは全角にしています)
▼▼ == ここから =========================================
' --- 変数宣言
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
▲▲ == ここまで =========================================
ですが、問題が残っています。
高 DPI モニターで、テキストなどの文字を 125%, 150% など(100% 以外)にされていると
思ったとおりにレイアウトされません。
合間をみて試行錯誤していますが、まだ完成に至りません。
コードはこれだけではありません。
試行錯誤中のコードもあります。
なので、Dropbox でプロジェクト全体を共有しました。
ファイル名は FlexForm_VB.zip (約600 KB)。
ダウンロードはここから・・・
https://www.dropbox.com/s/q6e24tdozyywacx/FlexForm_VB.zip?dl=0
言語は VB です。
お時間のある方はダウンロードしてお試しください。
改善点、DPI 対策にお気づきの場合は、ぜひご一報ください。
---------------------------------------------------------
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・
ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・