| | タイトル | : 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)
 
 |