VB6にてディスプレイの解像度によってフォームの大きさを変える

解決


とみぃだ  2006-04-10 04:33:42  No: 130902

VB6、WindowsNTにて質問です。

ディスプレイ一杯にフォームがあるのですが、開発環境で画面いっぱいにしても開発環境より大きい解像度のディスプレイになると一杯ではなくなります。

仕事での開発なのでソースは記載できませんがヒントらしいものを教えていただけるとうれしいです。


通ってみた  2006-04-10 06:08:35  No: 130903

フォームの大きさだけでいうなら、最大化すればいいのでは・・・?
中にあるコントロールなどの大きさも変えるなら、フォームを最大化してそのフォームの大きさから計算させれば問題ないかと


K.J.K.  2006-04-10 16:57:18  No: 130904

単純に、

Private Sub Form_Load()
    Call Me.Move(0, 0, Screen.Width, Screen.Height)
End Sub

だとまずいのでしょうか?


  2006-04-11 01:27:19  No: 130905

フォームのプロパティにある「WindowState」を「2 - 最大化」にすれば、
解像度関係なくディスプレイいっぱいに表示されると思いますが…


とみぃだ  2006-04-11 08:01:58  No: 130906

説明不足でした。

画面自体は最大化・最小化・閉じるボタンは使えないようにしてあり、
テキストボックスやコンボボックス、ボタンなどもその解像度の比率に合わせ、高さや幅、XY座標も変えたいのです。
やはりScreen.Width, Screen.Height  をうまく使うしかないのでしょうか?


あっきー  2006-04-11 08:33:33  No: 130907

そうですね。
基準となる解像度のフォーム(例えば800x600)を最初に作っておいて
そこから実行時のScreen.Width,Heightから基準フォームとの縦、横
それぞれの倍率を求め
For Each 〜  In Controls
とかでループして各コントロールの大きさ、フォント等に指定倍率を掛けて
やると案外楽に出来るかも。


葉月α  2006-04-11 17:56:46  No: 130908

>やはりScreen.Width, Screen.Height  をうまく使うしかないのでしょうか?
他力本願ならResizerコントロールの購入かなぁ
そうじゃなければScreen・・・から自力で計算しないと解像度ってわかりませんよね


  2006-04-11 18:12:14  No: 130909

> テキストボックスやコンボボックス、ボタンなどもその解像度の比率に合わせ、高さや幅、XY座標も変えたいのです。
横から失礼して…投稿にしては非常に長いですが何かの役に立ててください(_orz

Option Explicit
'class ClipControl
'単純に、親フォームに有る子コントロールの縦横比を等倍するクラスです
'   使い方
'   1  親フォームにこのクラスのインスタンス hoge を作る
'   2  hoge.enClipControls Me などとして、親自身を登録する

Public Event Resize()
Private WithEvents ParentEventForm          As Form
Private ClipControls                        As Collection

Public Sub enClipControls(ByRef ParentForm As Form)
    
    Dim Child                               As Object
    Dim ParentWidth                         As Double
    Dim ParentHeight                        As Double
    
    Set ClipControls = New Collection
    Set ParentEventForm = ParentForm
    
    ParentWidth = ParentForm.ScaleWidth
    ParentHeight = ParentForm.ScaleHeight
    
    For Each Child In ParentForm.Controls
        ClipControls.Add GetSize(Child, ParentWidth, ParentHeight)
    Next
    
End Sub

Public Sub deClipControls()
    
    Set ClipControls = Nothing
    Set ParentEventForm = Nothing
    
End Sub

Private Function GetSize(ByRef Control As Object, ByRef ParentWidth As Double, ByRef ParentHeight As Double) As Variant()
    
    Dim ret(0 To 4)                         As Variant
    
    On Error Resume Next
    Set ret(0) = Control
    ret(1) = Control.Left / ParentWidth
    ret(2) = Control.Top / ParentHeight
    ret(3) = Control.Width / ParentWidth
    ret(4) = Control.Height / ParentHeight
    GetSize = ret
    
End Function

Private Sub ParentEventForm_Resize()
    
    Dim Child                               As Variant
    Dim ParentWidth                         As Double
    Dim ParentHeight                        As Double
    
    If ClipControls.Count > 0 Then
        ParentWidth = ParentEventForm.ScaleWidth
        ParentHeight = ParentEventForm.ScaleHeight
        On Error Resume Next
        For Each Child In ClipControls
            With Child(0)
                .Left = Child(1) * ParentWidth
                .Top = Child(2) * ParentHeight
                .Width = Child(3) * ParentWidth
                .Height = Child(4) * ParentHeight
            End With
        Next
    End If
    
    RaiseEvent Resize
    
End Sub


通ってみた  2006-04-12 01:23:00  No: 130910

環境によって、ということは途中で解像度が変わるわけではないのでしょうから
最初から最大化にしておけばいいのではないでしょうか?
最大化ボタンがあるかどうかではなく、初期状態で最大化にしておくだけです

中身のコントロールに関しては、フォームの大きさから・・・というのは説明済みなので省略


とみぃだ  2006-04-14 08:35:19  No: 130911

返答遅くなりました。

最初から最大化するとして、ボタンやラベルなどを数値で表した際、
解像度によってははみ出てしまうのですが・・・。


とみぃだ  2006-04-14 08:35:54  No: 130912

っ殿

一回試してみます


とみぃだ  2006-04-16 06:01:43  No: 130913

っ  さんのソースで確認しました。
長い時間ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加