tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: MDIフォームの最大化・最小化ボタンを無効にする方法
投稿日: 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)

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。