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