環境: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は子フォームからフォーカスが失うときに
読まれるコードかと思っていたのですが、違うのでしょうか・・・。
私の頭ではこれ以上は思いつきませんでした。
わかる方、どうか教えて下さい。お願いします。
>>子フォームAが最大化になっているときにはTRUEを示すフラグを作る。
WindowStateを参照じゃだめ?
Form_LostFocusでやるとして、
If Me.WindoState <> 2 Then
Me.WindowState = 2
End If
でできないかな?(試してないからわからないけど)
>通ってみたさん
書き込みありがとうございます。
>WindowStateを参照じゃだめ?
WindowStateを参照しなかったのは、
ユーザーの誰もがウィンドウを最大化にしているとは限らないからです。
>If Me.WindoState <> 2 Then
> Me.WindowState = 2
>End If
このコードですと、最初から最大化にしていなかった場合にも
突然最大化してしまうことになってしまうからです。
最大化していたウィンドウだけ、その最大化を維持させたいのです・・・。
>最大化した子フォームが、フォーカスを失ったときに、
>元のサイズに戻ってしまいます
言っている意味が良く分からないので再現可能なコードの提示が
あると何か分かるかも。
>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
すいません・・・コードが少し間違っていたので、
書き直します。
何度も書き込んですいません。
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
>「最大化した子フォームが、アクティブでなくなったときに、
> 元のサイズに戻ってしまいます」
>という意味です。
>新規で別の子フォームを開いたり、
>別の子フォームにフォーカスを移すと、
>元のサイズに戻ってしまうのです。
子Formのイベントプロシージャに何も書いていないと
この現象自体が再現しないわけですが。
下記手順で試したんだけど、そちらの意図にあってるんでしょうか?
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が手前に表示される。最大化のまま)
以上
訂正
'Form1のボタン
>Private Sub Command1_Click()
> Form1.SetFocus
>End Sub
'Form1のボタン
Private Sub Command1_Click()
Form2.SetFocus
End Sub
>030さん
いろいろ試していただいてありがとうございました。
初心に振り返って
030さんのように、シンプルなプログラムでもう一度行っていたところ、
解決できました。
原因は、最大化した子フォームから、
固定ダイアログを表示したため、
最大化状態でなくなってしまったことでした。
こんなことで書き込んでしまい、大変申し訳ありませんでした。
このようなことで、必死になっていた自分が恥ずかしく思います。
通ってみたさん、030さん、
一緒に考えていただき、本当に感謝しています。
ありがとうございました。
ツイート | ![]() |