DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォーム右上の「x」ボタンの非活性

分類:[全般]

フォーム右上の「×」ボタンのみ非活性か削除したいのですが?
どうすればよろしいですか?
最小ボタンは有効にしたいのですが?
■No351に返信(shige2さんの記事)
> フォーム右上の「×」ボタンのみ非活性か削除したいのですが?
> どうすればよろしいですか?
> 最小ボタンは有効にしたいのですが?

.NET Frameworkのクラスライブラリとしてはたぶん用意されていないと思うので、
WindowsAPIのGetSystemMenu関数、RemoveMenu関数を利用する必要があると思います。
■No352に返信(よねKENさんの記事)
> ■No351に返信(shige2さんの記事)
>>フォーム右上の「×」ボタンのみ非活性か削除したいのですが?
>>どうすればよろしいですか?
>>最小ボタンは有効にしたいのですが?
>
> .NET Frameworkのクラスライブラリとしてはたぶん用意されていないと思うので、
> WindowsAPIのGetSystemMenu関数、RemoveMenu関数を利用する必要があると思います。
>
>
すいません。
利用方法を教示していただけないでしょうか?
こんにちは、shige2さん。ピラルクです。

> すいません。
> 利用方法を教示していただけないでしょうか?

十分な情報が提示されているではないですか。
少なくとも、得たリプライをもとにどういう努力をして、
どこで行き詰ったのかを書くべきでは?
でないと、客観的にみて甘えすぎという感が否めません。(--;

で、右上の[X]ボタンだけに関して述べておられますが、左上の
コントロールメニュー(アイコンのアイコンをクリックして出るメニュー)
の[閉じる]は標準のまま残しておきたいのでしょうか?

また、なぜ、このようなことをする必要が出てきたのでしょうか?
よければ、差しさわりのない範囲で教えてください。
■No357に返信(ピラルクさんの記事)
> こんにちは、shige2さん。ピラルクです。
>
>>すいません。
>>利用方法を教示していただけないでしょうか?
>
> 十分な情報が提示されているではないですか。
> 少なくとも、得たリプライをもとにどういう努力をして、
> どこで行き詰ったのかを書くべきでは?
> でないと、客観的にみて甘えすぎという感が否めません。(--;
>
> で、右上の[X]ボタンだけに関して述べておられますが、左上の
> コントロールメニュー(アイコンのアイコンをクリックして出るメニュー)
> の[閉じる]は標準のまま残しておきたいのでしょうか?
>
> また、なぜ、このようなことをする必要が出てきたのでしょうか?
> よければ、差しさわりのない範囲で教えてください。
>

VB.6.0のように記述したのですがうまくいきせん。

Declare Ansi Function GetSystemMenu Lib "user32" _
(ByVal hwnd As Long, ByVal bRevert As Long) As Long

Declare Ansi Function RemoveMenu Lib "user32" _
( ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

コントロールメニュー(アイコンのアイコンをクリックして出るメニュー)
> の[閉じる]削除して結構であります。

途中で×ボタンで閉じられてしますと、何かと不都合な点がありまして・・・

 
> >>フォーム右上の「×」ボタンのみ非活性か削除したいのですが?
> >>どうすればよろしいですか?
> >>最小ボタンは有効にしたいのですが?
>>
>>.NET Frameworkのクラスライブラリとしてはたぶん用意されていないと思うので、
>>WindowsAPIのGetSystemMenu関数、RemoveMenu関数を利用する必要があると思います。
>>
> すいません。
> 利用方法を教示していただけないでしょうか?

利用方法を提示するのはそれほど難しくありませんが、
それではあまり意味がないと思います。
APIは使い方を誤るとアプリが簡単に落ちたり/フリーズしたりします。
場合によってはOSごとフリーズさせたりもしますので、
サンプルのコピペで済ましてしまうような方法を取ると
不具合がでたときや、何らかの改良を加えたいような場合に困りますよ。
正しく理解した上で利用しましょう。

提示した関数名から旧VBのサンプルならたくさん引っかかります。
旧VBとVB.NETでは型の対応が違ってますが、その辺を少し修正すれば動きます。

旧VBのサンプルは、「GetSystemMenu RemoveMenu」をキーにして検索すれば、
たくさん見つかります。また、各関数の仕様については、MSDNライブラリで調べて下さい。

MSDNライブラリを調べるとC言語での関数の宣言が載っています。
引数や戻り値の意味、及び、型がわかります。
また、下記のURLにC言語の型と.NET Frameworkライブラリでの型の対応が
載っていますので、これらを基にAPIの宣言をVB.NET用に書き換えましょう。

「プラットフォーム呼び出しのデータ型」
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/cpguide/html/cpconplatforminvokedatatypes.asp

その上でわからない点がでてきたら、再度ここで質問をされてはいかがですか。
> VB.6.0のように記述したのですがうまくいきせん。

VB6とではAPIの宣言が違います。
helpを見ましょう。
また当サイト(↓)に.NET用のAPIビューアのリンクがあります。
http://dobon.net/vb/dotnet/links/apiviewer.html

> 途中で×ボタンで閉じられてしますと、何かと不都合な点がありまして・・・

...有効な回答になっていません。
質問者の方が、どういう理由でどういうことをしたがっているかを
もう少し詳しく書いてもらえるだけでGiveAndTakeなんですが。。。
("通信中です"のダイアログ?)
■No361に返信(ピラルクさんの記事)
>>VB.6.0のように記述したのですがうまくいきせん。
>
> VB6とではAPIの宣言が違います。
> helpを見ましょう。
> また当サイト(↓)に.NET用のAPIビューアのリンクがあります。
> http://dobon.net/vb/dotnet/links/apiviewer.html
>
>>途中で×ボタンで閉じられてしますと、何かと不都合な点がありまして・・・
>
> ...有効な回答になっていません。
> 質問者の方が、どういう理由でどういうことをしたがっているかを
> もう少し詳しく書いてもらえるだけでGiveAndTakeなんですが。。。
> ("通信中です"のダイアログ?)

今作成中のアプリケーションで、最小ボタンは有効にしたいのですが、
閉じるボタンは無効にしたいのです。画面の遷移先のある途中の画面で
終了させられると、うまくないのですが・・。
■No362に返信(shige2さんの記事)
> ■No361に返信(ピラルクさんの記事)
> >>VB.6.0のように記述したのですがうまくいきせん。
>>
>>VB6とではAPIの宣言が違います。
>>helpを見ましょう。
>>また当サイト(↓)に.NET用のAPIビューアのリンクがあります。
>>http://dobon.net/vb/dotnet/links/apiviewer.html
>>
> >>途中で×ボタンで閉じられてしますと、何かと不都合な点がありまして・・・
>>
>>...有効な回答になっていません。
>>質問者の方が、どういう理由でどういうことをしたがっているかを
>>もう少し詳しく書いてもらえるだけでGiveAndTakeなんですが。。。
>>("通信中です"のダイアログ?)
>
> 今作成中のアプリケーションで、最小ボタンは有効にしたいのですが、
> 閉じるボタンは無効にしたいのです。画面の遷移先のある途中の画面で
> 終了させられると、うまくないのですが・・。
>


Public Const MF_BYCOMMAND = &H0&
Public Const SC_CLOSE = &HF060
Public Const MF_BYPOSITION = &H400&

Public Declare Function GetSystemMenu Lib "user32" _
(ByVal hwnd As Long, _
ByVal bRevert As Long) As Long
'メニューから選択肢を削除
Public Declare Function DeleteMenu Lib "user32" _
(ByVal hMenu As Long, _
ByVal uPosition As Long, _
ByVal uFlags As Long) As Long

Public Function Sample()

Dim hwnd As Long
Dim result As Long
hwnd = GetSystemMenu(Me.Handle.ToInt64, 0)
result = DeleteMenu(hwnd, 7, SC_CLOSE) '閉じるを削除

End Function

このように記述しましたがうまくいきません。
宣言が間違っているのでしょうか?
それとも引数が間違っているのでしょうか?
VB.NETでの使用方法がいまいちわからないのですが?
> 宣言が間違っているのでしょうか?
> それとも引数が間違っているのでしょうか?

両方です。

DeleteMenu のパラメータの順がおかしいような。
(MF_BYCOMMANDはなぜ使われていない?)

VB6 Long=4Byte=32bit=Int32 Integer=2Byte=16bit=Int16

.NET Long=8Byte=64bit=Int64 Integer=4Byte=32bit=Int32

です。

DeleteMenu に変えたのはいいとして、
その情報に、DrawMenuBarについては書かれていませんでしたか?
APIを使うときはこういう付随情報を見落とさないことが肝要です。
■No367に返信(ピラルクさんの記事)
>>宣言が間違っているのでしょうか?
>>それとも引数が間違っているのでしょうか?
>
> 両方です。
>
> DeleteMenu のパラメータの順がおかしいような。
> (MF_BYCOMMANDはなぜ使われていない?)
>
> VB6 Long=4Byte=32bit=Int32 Integer=2Byte=16bit=Int16
>
> .NET Long=8Byte=64bit=Int64 Integer=4Byte=32bit=Int32
>
> です。
>
> DeleteMenu に変えたのはいいとして、
> その情報に、DrawMenuBarについては書かれていませんでしたか?
> APIを使うときはこういう付随情報を見落とさないことが肝要です。
>

ご教示のほどありがとうございました。
うまくいきました。
大変ご迷惑をかえました。
解決済み!
> VB6 Long=4Byte=32bit=Int32 Integer=2Byte=16bit=Int16
>
> .NET Long=8Byte=64bit=Int64 Integer=4Byte=32bit=Int32
>
> です。

これに加えて、HANDLEを返すもの(引数の名前の先頭がhで始まるものなど)は、
IntPtrを使うとより適切ですね。(好みの問題程度にしか違いませんが・・・)
引数hWnd、hMenu、GetSystemMenuの戻り値がこれに該当します。
IntPtrで宣言しておくと、
GetSystemMenu関数の第一引数にMe.Handleをそのまま渡せます。



> DeleteMenu に変えたのはいいとして、
> その情報に、DrawMenuBarについては書かれていませんでしたか?
> APIを使うときはこういう付随情報を見落とさないことが肝要です。
>

DOBON.NET | プログラミング道 | プログラミング掲示板