tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルポップアップメニューにアイコンを付けたい
記事No16490
投稿日: 2019/07/03(Wed) 16:54
投稿者はらもこ
いつもお世話になっております。
フォームでの右クリックでPopupMenuメソッドでポップアップメニューを表示しているのですが、
これにアイコンを表示したいと思っています。
フォームのメニューにはサブクラス化で表示できたのですが、ポップアップメニューで表示
しているメニューはフォームのメニューエディタで非表示にしているため、おそらくPopupMenu
時点でVBがメニューをCreateMenuしていると思われ、そのせいでメニューのハンドルが不明なため
不可能なのかな、と半ば諦めかけています。これはそもそも可能なのでしょうか?

[ツリー表示へ]
タイトルRe: ポップアップメニューにアイコンを付けたい
記事No16491
投稿日: 2019/07/04(Thu) 20:35
投稿者魔界の仮面弁士
> フォームのメニューにはサブクラス化で表示できたのですが、

というと、たとえばこのあたりですかね。
前者はサブクラス化していませんけれども。

[VBStation]-[サンプル]-[VB6 - その他]-[26.メニューにアイコンを表示]
http://www.vbstation.net/sample/0214.htm

[Stadt Homepage]-[オーナードローメニュー(Office97スタイルメニュー)]
http://bit.ly/2NGS8Wu  ※閉鎖済みのサイトなので、Internet Archive のキャッシュページです



> ポップアップメニューで表示しているメニューはフォームのメニューエディタで非表示にしているため、
親メニューが非表示の場合、GetSubMenu が 0 を返すと思います。
また、一度非表示にして再表示した場合、GetSubMenu から返されるメニューハンドルも変わりますね。



> これはそもそも可能なのでしょうか?
ポップアップメニューを別フォームに設けるという方法があります。


(1) ポップアップメニュー専用の Form を用意します。
 今回は「PopupMenuForm」という名前のフォームにしています。
 このフォームは常に非表示で運用することになります。
 ポップアップさせる最上位メニューは、デザイン時に Visible = True としておいてください。
 ※このメニューにアイコンを付与する処理については、現状のコードをそのままお使いください。


(2) PopupMenuForm に MenuClick イベントを作成し、各サブメニューのクリック時に RaiseEvent させます。

'--- PopupMenuForm.frm
Option Explicit
Public Event MenuClick(m As Menu)
Private Sub mnuSubItem1_Click()
    RaiseEvent MenuClick(mnuSubItem1)
End Sub
Private Sub mnuSubItem2_Click()
    RaiseEvent MenuClick(mnuSubItem1)
End Sub



(3) 呼び出し元画面で、PopupMenuForm を WithEvents 宣言付でロードし、
 自作した MenuClick イベントに対して、対応する処理を記述します。

'--- Form1.frm
Option Explicit
Private WithEvents PopupContainer As PopupMenuForm
Private Sub Form_Load()
    Set PopupContainer = New PopupMenuForm
    Load PopupMenuForm
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Unload PopupMenuForm
    Set PopupContainer = Nothing
End Sub

'★メニューが押された時の処理
Private Sub PopupContainer_MenuClick(m As Menu)
    m.Checked = Not m.Checked
    MsgBox m.Caption & "が押されました。"
End Sub

'PopupMenu メソッドでは、自フォームのメニューではなく、
'非表示にしている PopupMenuForm のメニューを渡すようにする
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = vbRightButton Then
        Me.PopupMenu PopupContainer.mnuPop, , X, Y
    End If
End Sub



なお上記では、呼び出し元画面でイベント処理を行っていますが、
情報の連携等に問題がなければ、呼び出し側で WithEvents するのではなく、
PopupMenuForm 側に直接、各メニューの Click イベントを実装しても構いません。

[ツリー表示へ]
タイトルRe^2: ポップアップメニューにアイコンを付けたい
記事No16492
投稿日: 2019/07/05(Fri) 17:58
投稿者はらもこ
返信どうも有難うございますm(__)m
教えていただいた方法で試すのに、今までかかってしまいました(;^_^A
サンプルのリンク1では、仰るとおりポップアップメニューではGetSubMenu()が0を返してくるので、
アイコンを設定できず、リンク2では親メニューが非表示にすると、やはりポップアップメニューの
アイコンは消えてしまいます。やはり親メニューが非表示の場合には、PopupMenuが呼び出されるたびに
VBがCreateMenuをしているっぽいです。

が、

>ポップアップメニューを別フォームに設けるという方法があります。

この方法でうまくいきました!!
こんなこと思いつきもしませんでした(;^_^A 凄い...
有難うございましたm(__)m

話はそれるのですが...、僕はVBもVCもC#も仕事でやってみて、未だにVBというのはいいものだ
と思っています。簡単に列挙しただけでも

・実行中に中断しても、C#のようにメッセージループみたいなところに飛ばされず、その場で止まる
・中断中の描画命令が即座に画面に反映される(C#、VCだと実行しないと反映されない)
・条件付きのブレークポイントがある(変数の中身が変更されたとき中断等)
・イミディエイトウィンドウで何でもできる
・プロシージャ中でstaticで変数を切れる(VCもできる。C#は不可)

とか...。
こうやって今でも掲示板を運営してくれて本当に有難いです。

[ツリー表示へ]