最大化状態の子フォームからフォーカスが失ったとき、最大化を維持するには?

解決


めがねこ  2005-08-05 17:43:21  No: 123955

環境:Windows XP  VB6.0(SP6)

最大化した子フォームが、フォーカスを失ったときに、
元のサイズに戻ってしまいます。
最大化ではなく、通常にウィンドウサイズを変更した場合は、
そのサイズを維持するのですが、どういう訳か、
最大化にした場合、元のサイズに戻ってしまうのです。

いろいろ苦心しながら、次のように取り組みましたが、
うまくいきません。

1,子フォームAが最大化になっているときにはTRUEを示すフラグを作る。
    新しく子フォームBが開いた時点で、フラグがTRUEのときに、
    子フォームAを最大化にする。
        ↓
結果:子フォームAを最大化にした時点で
      フォーカスが子フォームAに移ってしまい、
      子フォームBが後ろに隠れてしまう。

2,子フォームAが最大化になっているときにはTRUEを示すフラグを作る。
    Form_LostFocusの部分に、フラグがTRUEのときに、
    子フォームAを最大化にするというコードを書く。
        ↓
結果:変化なし。
    (フォーカスを失った時点でウィンドウサイズが元に戻る)
      ステップ実行で確認してみたところ、
      子フォームAのForm_LostFocusが読まれていませんでした。
      Form_LostFocusは子フォームからフォーカスが失うときに
      読まれるコードかと思っていたのですが、違うのでしょうか・・・。

私の頭ではこれ以上は思いつきませんでした。
わかる方、どうか教えて下さい。お願いします。


通ってみた  2005-08-05 19:12:14  No: 123956

>>子フォームAが最大化になっているときにはTRUEを示すフラグを作る。
WindowStateを参照じゃだめ?

Form_LostFocusでやるとして、

If Me.WindoState <> 2 Then
    Me.WindowState = 2
End If

でできないかな?(試してないからわからないけど)


めがねこ  2005-08-05 19:24:43  No: 123957

>通ってみたさん
書き込みありがとうございます。

>WindowStateを参照じゃだめ?
WindowStateを参照しなかったのは、
ユーザーの誰もがウィンドウを最大化にしているとは限らないからです。

>If Me.WindoState <> 2 Then
>    Me.WindowState = 2
>End If
このコードですと、最初から最大化にしていなかった場合にも
突然最大化してしまうことになってしまうからです。

最大化していたウィンドウだけ、その最大化を維持させたいのです・・・。


030  2005-08-05 20:38:14  No: 123958

>最大化した子フォームが、フォーカスを失ったときに、
>元のサイズに戻ってしまいます
言っている意味が良く分からないので再現可能なコードの提示が
あると何か分かるかも。


めがねこ  2005-08-05 20:58:13  No: 123959

>030さん
書き方が説明不足で失礼致しました。

「最大化した子フォームが、アクティブでなくなったときに、
  元のサイズに戻ってしまいます」
という意味です。

新規で別の子フォームを開いたり、
別の子フォームにフォーカスを移すと、
元のサイズに戻ってしまうのです。

>再現可能なコード
とりあえず、上記の1,2の内容をコードにしたものを載せます。

1,
Private Sub Command1_Click()
    dim sizeFlg as boolean

    If Me.WindowState = vbMaximized Then
        sizeFlg = True
    Else
        sizeFlg = False
    End If
    form2.show

    If clientSizeFlg = True Then
         Me.WindowState = vbMaximized 
    End If
End Sub

2,
dim sizeFlg as boolean
Private Sub Form_Resize()
    If Me.WindowState = vbMaximized Then
        sizeFlg = True
    Else
        sizeFlg = False
    End If
End Sub

Form_LostFocus()
    If clientSizeFlg = True Then
         Me.WindowState = vbMaximized 
    End If
End Sub


めがねこ  2005-08-05 20:59:53  No: 123960

すいません・・・コードが少し間違っていたので、
書き直します。
何度も書き込んですいません。

1,
Private Sub Command1_Click()
    dim sizeFlg as boolean

    If Me.WindowState = vbMaximized Then
        sizeFlg = True
    Else
        sizeFlg = False
    End If
    form2.show

    If sizeFlg = True Then
         Me.WindowState = vbMaximized 
    End If
End Sub

2,
dim sizeFlg as boolean
Private Sub Form_Resize()
    If Me.WindowState = vbMaximized Then
        sizeFlg = True
    Else
        sizeFlg = False
    End If
End Sub

Form_LostFocus()
    If sizeFlg = True Then
         Me.WindowState = vbMaximized 
    End If
End Sub


030  2005-08-05 21:18:17  No: 123961

>「最大化した子フォームが、アクティブでなくなったときに、
>  元のサイズに戻ってしまいます」
>という意味です。

>新規で別の子フォームを開いたり、
>別の子フォームにフォーカスを移すと、
>元のサイズに戻ってしまうのです。

子Formのイベントプロシージャに何も書いていないと
この現象自体が再現しないわけですが。


030  2005-08-05 21:35:48  No: 123962

下記手順で試したんだけど、そちらの意図にあってるんでしょうか?

1)新しいプロジェクトで標準EXEを選択
2)Form2,MDIForm1を追加
3)Project1のプロパティでスタートアップをMDIForm1に設定
4)Form1,Form2のMDIChildプロパティをTrueに設定
5)Form1,Form2にボタンを配置しそれぞれ下記を記述

'Form1のボタン
Private Sub Command1_Click()
  Form1.SetFocus
End Sub

'Form2のボタン
Private Sub Command1_Click()
  Form1.SetFocus
End Sub

6)MDIForm1のMDIForm_Loadイベントプロシージャに下記を記述

Private Sub MDIForm_Load()

  Form1.Show
  Form2.Show

End Sub

7)実行
8)Form1をアクティブにして最大化
9)Form1上のボタンをクリック(Form2が手前に表示される。最大化のまま)
10)Form2上のボタンをクリック(Form1が手前に表示される。最大化のまま)

以上


030  2005-08-05 21:36:45  No: 123963

訂正

'Form1のボタン
>Private Sub Command1_Click()
>  Form1.SetFocus
>End Sub

'Form1のボタン
Private Sub Command1_Click()
  Form2.SetFocus
End Sub


めがねこ  2005-08-05 22:27:25  No: 123964

>030さん
いろいろ試していただいてありがとうございました。

初心に振り返って
030さんのように、シンプルなプログラムでもう一度行っていたところ、
解決できました。

原因は、最大化した子フォームから、
固定ダイアログを表示したため、
最大化状態でなくなってしまったことでした。

こんなことで書き込んでしまい、大変申し訳ありませんでした。
このようなことで、必死になっていた自分が恥ずかしく思います。

通ってみたさん、030さん、
一緒に考えていただき、本当に感謝しています。
ありがとうございました。


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

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






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