[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/03/03(Sat) 13:11
投稿者名:まり
Eメール:
URL :
タイトル:
スクリーンサイズに合わせた可変サイズ画面の表示
お世話になります。 教えてください。

環境
windows XP
VB6

複数の異なる動作マシンのスクリーンサイズに合わせてウインドウサイズを可変表示し、
そのフォーム内のオブジェクトのサイズ、表示位置なども全て連動して、
可変表示させたいのですが、どのようにすれば良いのでしょうか?

投稿時間:2007/03/03(Sat) 14:05
投稿者名:ガッ
Eメール:
URL :
タイトル:
Re: スクリーンサイズに合わせた可変サイズ画面の表示
> お世話になります。 教えてください。
>
> 環境
> windows XP
> VB6
>
> 複数の異なる動作マシンのスクリーンサイズに合わせてウインドウサイズを可変表示し、
> そのフォーム内のオブジェクトのサイズ、表示位置なども全て連動して、
> 可変表示させたいのですが、どのようにすれば良いのでしょうか?

一般的な方法は分かりませんがやりたいことが明示できているので、
その通りに作ればいいのではないでしょうか?
(もう少し問題を具体的にするといいかもしれません)

投稿時間:2007/03/03(Sat) 16:02
投稿者名:まり
Eメール:
URL :
タイトル:
Re^2: スクリーンサイズに合わせた可変サイズ画面の表示
> > お世話になります。 教えてください。
> >
> > 環境
> > windows XP
> > VB6
> >
> > 複数の異なる動作マシンのスクリーンサイズに合わせてウインドウサイズを可変表示し、
> > そのフォーム内のオブジェクトのサイズ、表示位置なども全て連動して、
> > 可変表示させたいのですが、どのようにすれば良いのでしょうか?
>
> 一般的な方法は分かりませんがやりたいことが明示できているので、
> その通りに作ればいいのではないでしょうか?
> (もう少し問題を具体的にするといいかもしれません)

ご返信ありがとうございます。
具体的には、フォーム内に貼られているボタン、ラベル、SPREAD フォントサイズなど、様々な
コントロールのプロパティなどを座標、サイズなどを操作するしか方法がないのでしょうか?
ということです。
どれくらい大変なのかも含めてご教授していただけないでしょうか?
よろしくお願い致します。

投稿時間:2007/03/03(Sat) 16:51
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re^3: スクリーンサイズに合わせた可変サイズ画面の表示
> 具体的には、フォーム内に貼られているボタン、ラベル、SPREAD フォントサイズなど、様々な
> コントロールのプロパティなどを座標、サイズなどを操作するしか方法がないのでしょうか?

そうでしょうね。

費用が捻出できる場合:そういう専門のOCXがあります。
VB.netに移行できる場合:便利なコンテナが在るみたいです(全部は知っていない)
自力でやる場合:座標とサイズはすべて画面の%で考える。(定義と操作)
 各コントロールを操作する(Moveステートメント)サブルーチンを作っておけば比較的簡単だと思います。

投稿時間:2007/03/03(Sat) 16:55
投稿者名:ガッ
Eメール:
URL :
タイトル:
Re^3: スクリーンサイズに合わせた可変サイズ画面の表示
> ご返信ありがとうございます。
> 具体的には、フォーム内に貼られているボタン、ラベル、SPREAD フォントサイズなど、様々な
> コントロールのプロパティなどを座標、サイズなどを操作するしか方法がないのでしょうか?
> ということです。
> どれくらい大変なのかも含めてご教授していただけないでしょうか?
> よろしくお願い致します。
様々なコントロールの様々なメンバを操作しなければならないので、結果としてその実装が適当だと思います。
もしかしたらネットにサンプルや便利なコントロールが落ちている(売っている)"かも"しれませんが、
すみませんが私には見当がつきません。



追伸といっては何ですが、
操作するコントロールと操作するコントロールのメンバがある程度定まっているならば
VB6には幸いオブジェクトの多様な解釈ができるようになっていますので、
意外と簡単に何とかなるかもしれません。

1.新しいプロジェクトを作り、Class1とForm1を用意します。
2.Class1には以下のコードを書き入れます
'-------Class1
Option Explicit
Public csControl    As Control
Public csLeft       As Double
Public csTop        As Double
Public csWidth      As Double
Public csHeight     As Double
Public csFontSize   As Double

3.Form1には適当にツールボックスからコントロールを2、3個貼り付けておきます。
4.最後にForm1に以下のコードを書き入れます。
'-------Form1
Option Explicit

Private Clipped         As Boolean
Private ctls            As Collection
Private clpScaleWidth   As Double
Private clpScaleHeight  As Double

Private Sub Form_Load()
    Call ClipControl
End Sub

Private Function ClipControl()
    'コントロールの現在の状態をクリップする
    Dim ctl             As Control
    Dim ctlst           As Class1
    
    On Error Resume Next
    
    Set ctls = New Collection
    clpScaleWidth = Me.ScaleWidth
    clpScaleHeight = Me.ScaleHeight
    For Each ctl In Me.Controls
        Set ctlst = New Class1
        With ctlst
            Set .csControl = ctl
            .csLeft = ctl.Left
            .csTop = ctl.Top
            .csWidth = ctl.Width
            .csHeight = ctl.Height
            .csFontSize = ctl.FontSize
        End With
        Call ctls.Add(ctlst)
    Next
    Clipped = True
End Function

Private Sub Form_Resize()
    'クリップしたコントロールをリサイズする
    Dim ctlst           As Class1
    Dim ratScaleWidth   As Double
    Dim ratScaleHeight  As Double
    
    If Clipped Then
        On Error Resume Next
        '水平、垂直方向の拡大率を決定する
        ratScaleWidth = Me.ScaleWidth / clpScaleWidth
        ratScaleHeight = Me.ScaleHeight / clpScaleHeight
        'それぞれのコントロールを拡大する
        For Each ctlst In ctls
            With ctlst
                .csControl.Top = .csTop * ratScaleHeight
                .csControl.Left = .csLeft * ratScaleWidth
                .csControl.Width = .csWidth * ratScaleWidth
                .csControl.Height = .csHeight * ratScaleHeight
                .csControl.FontSize = .csFontSize * ratScaleWidth  'フォントサイズの拡大幅は適当です
            End With
        Next
    End If
End Sub

5.実行してフォームをリサイズしてください。
  気持ち悪いほど拡大縮小されるはずです。

投稿時間:2007/03/03(Sat) 18:52
投稿者名:まり
Eメール:
URL :
タイトル:
Re^4: スクリーンサイズに合わせた可変サイズ画面の表示
> > ご返信ありがとうございます。
> > 具体的には、フォーム内に貼られているボタン、ラベル、SPREAD フォントサイズなど、様々な
> > コントロールのプロパティなどを座標、サイズなどを操作するしか方法がないのでしょうか?
> > ということです。
> > どれくらい大変なのかも含めてご教授していただけないでしょうか?
> > よろしくお願い致します。
> 様々なコントロールの様々なメンバを操作しなければならないので、結果としてその実装が適当だと思います。
> もしかしたらネットにサンプルや便利なコントロールが落ちている(売っている)"かも"しれませんが、
> すみませんが私には見当がつきません。
>
>
>
> 追伸といっては何ですが、
> 操作するコントロールと操作するコントロールのメンバがある程度定まっているならば
> VB6には幸いオブジェクトの多様な解釈ができるようになっていますので、
> 意外と簡単に何とかなるかもしれません。
>
> 1.新しいプロジェクトを作り、Class1とForm1を用意します。
> 2.Class1には以下のコードを書き入れます
> '-------Class1
> Option Explicit
> Public csControl    As Control
> Public csLeft       As Double
> Public csTop        As Double
> Public csWidth      As Double
> Public csHeight     As Double
> Public csFontSize   As Double
>
> 3.Form1には適当にツールボックスからコントロールを2、3個貼り付けておきます。
> 4.最後にForm1に以下のコードを書き入れます。
> '-------Form1
> Option Explicit
>
> Private Clipped         As Boolean
> Private ctls            As Collection
> Private clpScaleWidth   As Double
> Private clpScaleHeight  As Double
>
> Private Sub Form_Load()
>     Call ClipControl
> End Sub
>
> Private Function ClipControl()
>     'コントロールの現在の状態をクリップする
>     Dim ctl             As Control
>     Dim ctlst           As Class1
>    
>     On Error Resume Next
>    
>     Set ctls = New Collection
>     clpScaleWidth = Me.ScaleWidth
>     clpScaleHeight = Me.ScaleHeight
>     For Each ctl In Me.Controls
>         Set ctlst = New Class1
>         With ctlst
>             Set .csControl = ctl
>             .csLeft = ctl.Left
>             .csTop = ctl.Top
>             .csWidth = ctl.Width
>             .csHeight = ctl.Height
>             .csFontSize = ctl.FontSize
>         End With
>         Call ctls.Add(ctlst)
>     Next
>     Clipped = True
> End Function
>
> Private Sub Form_Resize()
>     'クリップしたコントロールをリサイズする
>     Dim ctlst           As Class1
>     Dim ratScaleWidth   As Double
>     Dim ratScaleHeight  As Double
>    
>     If Clipped Then
>         On Error Resume Next
>         '水平、垂直方向の拡大率を決定する
>         ratScaleWidth = Me.ScaleWidth / clpScaleWidth
>         ratScaleHeight = Me.ScaleHeight / clpScaleHeight
>         'それぞれのコントロールを拡大する
>         For Each ctlst In ctls
>             With ctlst
>                 .csControl.Top = .csTop * ratScaleHeight
>                 .csControl.Left = .csLeft * ratScaleWidth
>                 .csControl.Width = .csWidth * ratScaleWidth
>                 .csControl.Height = .csHeight * ratScaleHeight
>                 .csControl.FontSize = .csFontSize * ratScaleWidth  'フォントサイズの拡大幅は適当です
>             End With
>         Next
>     End If
> End Sub
>
> 5.実行してフォームをリサイズしてください。
>   気持ち悪いほど拡大縮小されるはずです。

ありがとうございます。
上記の通りにやってみました。
ほんとに、気持ち悪いほど拡大縮小されてびっくりです。
色んなコントロールを貼ってやってみてます。
ほんとに感謝いたします。

投稿時間:2007/03/04(Sun) 15:03
投稿者名:FR
Eメール:
URL :
タイトル:
ユーザーコントロールがある場合には?
私も上記の通りコードを記述して最大化を試みました。確かにフォームは見事に最大化さ
れましたが、SSTabの上にユーザーコントロールを5つ配置した箇所は最大化できず、また
2から5番目のユーザーコントロールは表示すら出来なくなりました。
これらを最大化するにはどうしたら良いのでしょうか?
私にも教えてください。よろしくお願いします。
WinXP VB6sp6

投稿時間:2007/03/05(Mon) 09:43
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re: ユーザーコントロールがある場合には?
> れましたが、SSTabの上にユーザーコントロールを5つ配置した箇所は最大化できず、また

試していませんが。

    For Each ctl In Me.Controls
で得られるのはForm直下のコントロールだけでありコントロール内のコントロールについては
ガッ さんのコードを拡張(再帰的)する必要があるのかな。

それを確かめるにはFor文でブレークして、問題のユーザーコントロールが登録されているかどうかを見ればOK。

投稿時間:2007/03/05(Mon) 11:39
投稿者名:FR
Eメール:
URL :
タイトル:
Re^2: ユーザーコントロールがある場合には?
>     For Each ctl In Me.Controls
> で得られるのはForm直下のコントロールだけでありコントロール内のコントロールについては
> ガッ さんのコードを拡張(再帰的)する必要があるのかな。
>
> それを確かめるにはFor文でブレークして、問題のユーザーコントロールが登録されているかどうかを見ればOK。

ダンボさん、回答ありがとうございます。
ご指摘通りにやってみたんですが、ユーザーコントロールは登録されていないようです・・・。
気が付いたことはメインFormのSSTabは最大化にはなっていますが、ユーザーコントロール
は1枚目は最大化ではないのが表示され、2枚目以降はSSTab上に表示されないんですよね。
具体的にどう対処したらよいのかわかりません。
どうかよろしくお願いします。

投稿時間:2007/03/05(Mon) 14:24
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re^3: ユーザーコントロールがある場合には?
Me.Controlですべてのコントロールは含まれていました。ダンボの予想はハズレです。
ガッ さんのコードでは、コントロール内のコントロール座標計算が誤りになりますので下記のように改良しました。
(本当はこれだけでは不十分で、階層の上の方から再配置しないと)

'-------Class1
Option Explicit
Public csControl    As Control
Public csParent     As Control
Public csLeft       As Double
Public csTop        As Double
Public csWidth      As Double
Public csHeight     As Double
Public csFontSize   As Double

'-------Form1
Option Explicit
Private Clipped         As Boolean
Private ctls            As Collection
Private clpScaleWidth   As Double
Private clpScaleHeight  As Double

Private Sub Form_Load()
    Call ClipControl
End Sub

Private Function ClipControl()
    'コントロールの現在の状態をクリップする
    Dim ctl             As Control
    Dim ctlst           As Class1
    
    On Error Resume Next
    
    Set ctls = New Collection
    clpScaleWidth = Me.ScaleWidth
    clpScaleHeight = Me.ScaleHeight
    For Each ctl In Me.Controls
        Set ctlst = New Class1
        With ctlst
            Set .csControl = ctl
            Set .csParent = ctl.Parent
            .csLeft = ctl.Left
            .csTop = ctl.Top
            .csWidth = ctl.Width
            .csHeight = ctl.Height
            .csFontSize = ctl.FontSize
        End With
        Call ctls.Add(ctlst)
    Next
    Clipped = True
End Function

Private Sub Form_Resize()
    'クリップしたコントロールをリサイズする
    Dim ctlst           As Class1
    Dim ratScaleWidth   As Double
    Dim ratScaleHeight  As Double
    If Clipped Then
        On Error Resume Next
        '水平、垂直方向の拡大率を決定する
        ratScaleWidth = Me.ScaleWidth / clpScaleWidth
        ratScaleHeight = Me.ScaleHeight / clpScaleHeight
        'それぞれのコントロールを拡大する
        For Each ctlst In ctls
            With ctlst
                .csControl.Top = .csTop * ratScaleHeight + .csParent.Top
                .csControl.Left = .csLeft * ratScaleWidth + .csParent.Left
                .csControl.Width = .csWidth * ratScaleWidth
                .csControl.Height = .csHeight * ratScaleHeight
                .csControl.FontSize = .csFontSize * ratScaleWidth  'フォントサイズの拡大幅は適当です
            End With
        Next
    End If
End Sub

投稿時間:2007/03/05(Mon) 15:04
投稿者名:FR
Eメール:
URL :
タイトル:
Re^4: ユーザーコントロールがある場合には?
ダンボさん、回答ありがとうございます。
早速上記のコードを記述しました。結果は最大化後のSSTab上にユーザーコントロール
を表示することは可能となりました。が、しかしユーザーコントロールのサイズは変化
しません・・・。またフレーム上のラジオボタンやメインフォーム上のラベルなど一部
がおかしな位置に表示されます。
よろしくお願いします。

投稿時間:2007/03/06(Tue) 09:50
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re^5: ユーザーコントロールがある場合には?
> ガッ さんのコードでは、コントロール内のコントロール座標計算が誤りになります

一晩考えたんですが、コントロール内のコントロール座標はZ=A(X)+k*B(Y)の線形だから、
ガッ さんのように新座標Z'=r*(A(X)+k*B(Y))であっても、ダンボのようにZ'=r*A(X)+k*r*B(Y)
でも構わないはずですよね。ガッ さんすみません。

さて、それではうまく行かない原因は何かな?悪評のある(?)SSTabだけに起きる問題なんでしょうか?
描画順序を「上位のコントロールから描け」というのをちょっと試してみたいです。

投稿時間:2007/03/06(Tue) 10:11
投稿者名:ガッ
Eメール:
URL :
タイトル:
Re^6: ユーザーコントロールがある場合には?
Resizeイベント中に.csTopと.csLeftを調べてみてください。
SSTabが内部のコントロールをどうやって隠蔽しているのか分かるはずです。

# http://www.google.co.jp/search?complete=1&hl=ja&q=sstab+%E5%86%85%E9%83%A8&lr=
# http://support.microsoft.com/kb/187562/ja
# http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200702/07020010.txt
# など

投稿時間:2007/03/06(Tue) 10:18
投稿者名:ダンボ
Eメール:
URL :
タイトル:
-75000左
ちょっと泣きました。
.Visble = Falseでいいのに。

投稿時間:2007/03/06(Tue) 11:32
投稿者名:FR
Eメール:
URL :
タイトル:
Re: -75000左
ガッさん、ダンボさん、回答ありがとうございます。
リンクを閲覧して Form_Resize のコードを記述しなおしました。
最大化を行うと崩れることなく表示が出来ましたが、各コントロ
ール類は最大化されていない状態です。
またガッさんがご指摘のPrivate Function clipControl()内の
.csTopは1020で.csLeftは60でした。
教えてください。よろしくお願いします。

投稿時間:2007/03/06(Tue) 12:38
投稿者名:ガッ
Eメール:
URL :
タイトル:
Re^2: -75000左
私も試行錯誤しながらやっている身なので、教えるほど知識はありません。
またこのスレはまりさんのスレですので、
別途に再度ご質問内容を整理の上新たなスレを作ってください。

投稿時間:2007/03/06(Tue) 13:28
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re^2: -75000左
あっまだ終わってなかったんですね。下記汚いですけど、とりあえずは回避できます。
(SSTabの中にFlameがあって更にその中にあるコントロールは失敗する?)
(75000こそマジックナンバーと呼ぶべきだなぁ)


'-------Class1
Option Explicit
Public csControl    As Control
Public csHideSSTab  As Boolean
Public csLeft       As Double
Public csTop        As Double
Public csWidth      As Double
Public csHeight     As Double
Public csFontSize   As Double

'-------Form1
Option Explicit
Private Clipped         As Boolean
Private ctls            As Collection
Private clpScaleWidth   As Double
Private clpScaleHeight  As Double

Private Function ClipControl()
    'コントロールの現在の状態をクリップする
    Dim ctl             As Control
    Dim ctlst           As Class1
    
    Set ctls = New Collection
    clpScaleWidth = Me.ScaleWidth
    clpScaleHeight = Me.ScaleHeight
    For Each ctl In Me.Controls
        Set ctlst = New Class1
        With ctlst
            Set .csControl = ctl
            If (TypeOf ctl.Container Is SSTab) And (ctl.Left < 0) Then
                .csHideSSTab = True
                .csLeft = ctl.Left + 75000
            Else
                .csHideSSTab = False
                .csLeft = ctl.Left
            End If
            .csTop = ctl.Top
            .csWidth = ctl.Width
            .csHeight = ctl.Height
            On Error Resume Next
            .csFontSize = ctl.FontSize
            On Error GoTo 0
        End With
        Call ctls.Add(ctlst)
    Next
    Clipped = True
End Function

Private Sub Form_Load()
    Call ClipControl
End Sub

Private Sub Form_Resize()
    'クリップしたコントロールをリサイズする
    Dim ctlst           As Class1
    Dim ratScaleWidth   As Double
    Dim ratScaleHeight  As Double
    
    If Clipped Then
        On Error Resume Next
        '水平、垂直方向の拡大率を決定する
        ratScaleWidth = Me.ScaleWidth / clpScaleWidth
        ratScaleHeight = Me.ScaleHeight / clpScaleHeight
        'それぞれのコントロールを拡大する
        For Each ctlst In ctls
            With ctlst
                If .csHideSSTab Then
                    .csControl.Left = .csLeft * ratScaleWidth - 75000
                Else
                    .csControl.Left = .csLeft * ratScaleWidth
                End If
                .csControl.Top = .csTop * ratScaleHeight
                .csControl.Width = .csWidth * ratScaleWidth
                .csControl.Height = .csHeight * ratScaleHeight
                .csControl.FontSize = .csFontSize * ratScaleWidth  'フォントサイズの拡大幅は適当です
            End With
        Next
    End If
End Sub