.wIDを設定する理由は?

解決


megum  URL  2007-04-24 00:22:42  No: 98608

VB5で、閉じるボタンをグレー表示(使用不可能)にするプログラムについて教えてください。
MENUITEMINFOやSetMenuItemInfoを使用し、閉じるボタンをグレー表示にするプログラムを書きました。
閉じるボタンをグレー表示させるプログラムをWeb等で調べていると、以下の2通りの書き方ありました。
1.MENUITEMINFOの.wIDを設定する方法
2..wIDは設定しない方法
1の方法では何故.wIDを設定しているのかどうしても分からず、質問させていただきました。

自分の書いたコードはWebにアップ致しました。
ホームページアドレスがそれです。
どうぞよろしくお願い致します。


魔界の仮面弁士  2007-04-24 19:48:07  No: 98609

> 自分の書いたコードはWebにアップ致しました。
これは、正常に動作しているコードなのでしょうか?

現在手元に VB5/VB6 環境が無いので試していませんが、
ざっと見た限りでも、行継続文字が不正だったり、
変数のスペルミス(たとえば、Action が Act になっている等)が
多々あるので、Option Explicit の有無にかかわらず、
まともに動作しない気がするのですが…。

> 1の方法では何故.wIDを設定しているのかどうしても分からず、質問させていただきました。
Microsoft の KB184686 のコードに似てはいますが、それとも違うコードのようですね。

このままではコードの意図が読み取りにくいので、完全版のソースに
書き換えてから、再投稿してみてください。


megum  URL  2007-04-24 21:51:54  No: 98610

魔界の仮面弁士様

大変失礼致しました。
先ほどコードを書き換え、再度アップ致しました。
申し訳ありませんでした。

仰るとおり、MicrosoftのKB184686コードと似ています。
正確に申し上げれば、1つ目のコードは私が書いたものではないのですが、
Microsoftのコードを参考にして書かれたものではないかと考えております。

改めてよろしくお願い致します。


魔界の仮面弁士  2007-04-24 22:37:40  No: 98611

BOOL 型(32bit整数型)が、VB5 の Boolean型(16bit整数型)に
マッピングされていたり、ビット演算部に怪しい所があったりと
他にも見直すべき点がありそうですが、それはとりあえず置いといて。

> 1つ目のコードは私が書いたものではないのですが
であれば、書かれた本人に聞いた方が良いかも。

で。メニューID 自体は、アプリケーション定義の値ですが、
システムメニューに関しては、固定値になっています。

どのメニューがクリックされたのか、といった判断には、この ID 値が
利用されているはずですから、ID を差し替えてしまえば、メニューを
淡色表示に変更せずとも、そのメニュー項目は動作しなくなるでしょう。
(それでも、Alt + F4 の終了はできてしまいますが)

ただ、見た目上の問題から、メニュー項目を使用不可の淡色表示にしたり、
あるいはメニューそのものを削除してしまうといった処理が同時に
行われることが多いはずです。そしてその場合、メニュー自体が
呼べなくなるので、ID を差し替えずとも済むということなのでしょう。

# もしかしたら、ID と無効化の両方を行わなければいけない理由が
# あるのかも知れませんが、私はそれを知りません。


megum  2007-04-25 00:24:02  No: 98612

魔界の仮面弁士様

素早いご回答ありがとうございます。

> 書かれた本人に
聞ければ一番良いと思うのですが、諸事情によりそうすることができず…
何とか自分で調べようとしましたが、何日も調べてもどうしても分からず、
どうしようもなくなって、こちらの掲示板を頼らせていただいた次第です。

> どのメニューがクリックされたのか、といった判断には、この ID 値が
> 利用されているはずですから、ID を差し替えてしまえば、メニューを
> 淡色表示に変更せずとも、そのメニュー項目は動作しなくなるでしょう。
この文を1、

> ただ、見た目上の問題から、メニュー項目を使用不可の淡色表示にしたり、
> あるいはメニューそのものを削除してしまうといった処理が同時に
> 行われることが多いはずです。そしてその場合、メニュー自体が
> 呼べなくなるので、ID を差し替えずとも済むということなのでしょう。
この文を2としますと、

2を行っているのが 2つ目のコード。
1と2を行っているのが 1つ目のコード。(かつ、1を行っている部分が SetId )
ということでしょうか。
なるほど、二通りの書き方がある理由が分かりました。
どうもありがとうございました。

ただ、一点疑問に残る点がありまして…

> ID を差し替えてしまえば、メニューを淡色表示に変更せずとも、そのメニュー項目は動作しなくなるでしょう。
この文の意味としましては、
  ID を差し替えると、淡色表示にはならないがそのメニュー項目は動作しない
という理解でよろしいでしょうか?

引数をFalseにして Enabled_Proc を呼んだとき(閉じるボタンを使用不可の淡色表示にするとき)、
SetId の Ret = SetMenuItemInfo(hMenu, MenuID, False, MenuType) を処理すると、
閉じるボタンの表示が使用不可の淡色表示に変わります。
もし上記の理解で合っているとなると、この事実と矛盾します。
ID を差し替えると、無条件で使用不可の淡色表示となるのでしょうか?

重ねての質問で申し訳ありませんが、ご回答くださると幸いです。


魔界の仮面弁士  2007-04-25 02:05:36  No: 98613

> ID を差し替えると、無条件で使用不可の淡色表示となるのでしょうか?
いえ、単に本来の動作をさせなくなるというだけであり、
淡色表示の件とは別処理です。

ちょっと語弊のある説明かも知れませんが……たとえばメニューID を
VB のコントロール名に置き換えて考えてみてください。

あるメソッド内、たとえばタイマーコントロールのイベントにて
  Private Sub Timer1_Timer()
    Selct Case ActiveControl.Name
    Case "Text1"
      :
    Case "Combo1"
      :
    End Select
  End Sub
のような処理が書いてあったとします。

この場合、Text1.Enabled = False で使用不可にすると、Text1 は
ActiveControl にならないので、上記処理は行われなくなりますよね。

そしてここで、もしも外的要因によって、Text1.Name が "TextBox01" へ
動的に変更されるような事があれば、Enabled = False にせずとも、
上記で Text1 に対する処理が実行される事はない、ということです。
(もちろん、実際に Name を変更することはできないのですが)


megum  2007-04-25 05:43:52  No: 98614

魔界の仮面弁士様

丁寧なご説明ありがとうございます。

> Text1.Enabled = False で使用不可にすると、Text1 は
> ActiveControl にならないので、上記処理は行われなくなりますよね。
これが、ID の差し替えをせずに閉じるボタンを使用不可の淡色表示にする方法に対応するわけですね。
Enabled プロパティが False になったために処理が行われなくなる、
つまり、閉じるボタンが淡色表示になったため、閉じるボタンを押しても何も処理が行われない。

> もしも外的要因によって、Text1.Name が "TextBox01" へ
> 動的に変更されるような事があれば、Enabled = False にせずとも、
> 上記で Text1 に対する処理が実行される事はない、ということです。
そして、これが ID の差し替え(淡色表示にする処理は含まない)に対応すると。
ID を変えることで、閉じるボタンに関する処理が実行されること自体なくなる、
そのため、閉じるボタンを淡色表示にして処理の発生を抑える必要もないということですね。
ではなぜ、ID の差し替えを行っているのに淡色表示の処理もわざわざ行っているかといえば、それは単に見た目上の問題だけである、と。

言葉足らずかもしれませんが、概ねこのような理解で合っているでしょうか。


魔界の仮面弁士  2007-04-25 05:52:03  No: 98615

> これが、ID の差し替えをせずに閉じるボタンを使用不可の淡色表示にする方法に対応するわけですね。
ですます。

そして、ID差し替えと使用不可設定の両方を行った状態が、提示された
 http://test.kigishi.yu-nagi.com/test.htm の 1つ目のコード
に相当するというわけで。

> つまり、閉じるボタンが淡色表示になったため、閉じるボタンを押しても何も処理が行われない。
というよりは、閉じるボタンがそもそも押せない(あるいはフォーカスを得られない)状況になりますね。

> そして、これが ID の差し替え(淡色表示にする処理は含まない)に対応すると。
ですます。

> 概ねこのような理解で合っているでしょうか。
ですね。少なくとも、私はそのようなイメージで理解しました。
本当にそういう意図であるのかは、コードを書いた本人にしか分かりませんけど。


megum  2007-04-25 08:59:35  No: 98616

魔界の仮面弁士様

どうもありがとうございます。

ID の差し替えと淡色表示が別物となると、分からない点が一点あります。
以前の発言でも述べましたが、 ID を差し替えた時点で閉じるボタンの表示が使用不可の淡色表示となる点です。

以前の発言より転載し補足させていただきますと、
引数をFalseにして Enabled_Proc を呼んだとき(閉じるボタンを使用不可の淡色表示にするとき)、
Enabled_Proc → Ret = SetId(SwapID) → SetId と処理が進んできて、
SetId の Ret = SetMenuItemInfo(hMenu, MenuID, False, MenuType) を処理します。
このSetMenuItemInfoを行ったときに、閉じるボタンの表示が使用不可の淡色表示に変わります。
ID を差し替えただけであるにもかかわらず、淡色表示に変わる。これはなぜなのでしょうか?

新しく差し替える ID のメニューの状態をあらかじめ淡色表示に設定していれば、この動きも納得できます。
しかしID を差し替える前に淡色表示の設定は行われていないため、
ID を差し替えただけで淡色表示になってしまうことがどうしても謎なのです。


魔界の仮面弁士  2007-04-25 12:07:15  No: 98617

> ID を差し替えた時点で閉じるボタンの表示が使用不可の淡色表示
閉じるボタンは淡色表示になったとしても、hMenu が指し示すコントロールメニュー上の
[閉じる]項目の方は、使用不可になっていませんよね。


megum  2007-04-25 18:36:36  No: 98618

魔界の仮面弁士様

どうもありがとうございます。

> hMenu が指し示すコントロールメニュー上の[閉じる]項目
差し替える前の元の ID が示す項目ですね。(ここではSC_CLOSEの値)
おっしゃるとおり、使用不可になっていないと思います。

画面上の閉じるボタンが淡色表示になっているかどうかは本質ではなく、
コントロールメニュー上の[閉じる]項目が、画面上の閉じるボタンと一致しているか(両者の ID が同じかどうか)が本質ということでしょうか。
画面上の閉じるボタンがどのような表示になっていようとも関係ない。問題は ID がどうなっているかである、と。


megum  2007-04-28 13:39:32  No: 98619

とりあえず、上記の理解で良いようなので解決とさせていただきます。
丁寧に教えてくださり、本当に助かりました。
どうもありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加