タイトル : 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 イベントを実装しても構いません。 |