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

タイトル Re: ポップアップメニューにアイコンを付けたい
投稿日: 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 イベントを実装しても構いません。

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

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