タイトル | : Re: MDIフォームの最大化・最小化ボタンを無効にする方法 |
記事No | : 16263 |
投稿日 | : 2016/12/05(Mon) 10:19 |
投稿者 | : 魔界の仮面弁士 |
> DrawMenuBar (Me.hWnd) 'メニューバーを再描画する VB.NET とは異なり、VB6 では戻り値をとらないメソッド呼び出しには 括弧を付けない言語仕様になっています。ゆえに上記は本来、 Result = DrawMenuBar(Me.hWnd) Call DrawMenuBar(Me.hWnd) DrawMenuBar Me.hWnd のいずれかで記述した方がベターです。
今回のように引数が 1 個であれば括弧付きで書けますが、それは Result = DrawMenuBar( (Me.hWnd) ) のように、式としての括弧となりますので、意味が変わってきます。
> hWnd = GetSystemMenu(Me.hWnd, 0&) GetSystemMenu の戻り値を hWnd という変数名にするのは避けましょう。 この戻り値は Window Handle ではなく、Menu Handle なのですから。
同様の理由で、現状の API 宣言の引数名も不自然な印象を受けますので、 一度見直しておかれることをお奨めします。
> 「閉じる(×)」ボタンは無効化されたものの、 [閉じる]だけならば、API を使うまでも無いですけれどね。 今回の目的には副わないとは思いますが。
Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer) If UnloadMode = vbFormControlMenu Then Cancel = 1 End If End Sub
> 最大化・最小化ボタンは無効化されませんでした。
(案1) DrawMenuBar する前に、「GetSystemMenu Me.hWnd, 1&」を呼びだし、 ウィンドウメニューをリセットしておく。
Call GetSystemMenu(Me.hWnd, 1&) NewLong = GetWindowLong(Me.hWnd, GWL_STYLE) If 削除する場合 Then NewLong = NewLong And Not WS_MINIMIZEBOX NewLong = NewLong And Not WS_MAXIMIZEBOX ElseIf 復活させる場合 Then NewLong = NewLong Or WS_MINIMIZEBOX NewLong = NewLong Or WS_MAXIMIZEBOX End If NewLong = SetWindowLong(Me.hWnd, GWL_STYLE, NewLong) Call DrawMenuBar(Me.hWnd)
(案2) DeleteMenu の対象として 6番目のアイテム SC_CLOSE (閉じる)ボタンと 5番目のアイテム(セパレータ)だけを処理するのではなく、 3番目のアイテム SC_MAXIMIZE (最小化) と 4番目のアイテム SC_MAXIMIZE (最大化) にも 手を加えるようにする。
If 削除 Then hMenu = GetSystemMenu(Me.hWnd, 0) Result = DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND) Result = DeleteMenu(hMenu, 5&, MF_BYPOSITION) Result = DeleteMenu(hMenu, SC_MAXIMIZE, MF_BYCOMMAND) Result = DeleteMenu(hMenu, SC_MINIMIZE, MF_BYCOMMAND) ElseIf 復活 Then Call GetSystemMenu(Me.hWnd, 1) End If Call DrawMenuBar(Me.hWnd)
|