{"id":94,"date":"2007-07-19T20:52:23","date_gmt":"2007-07-19T18:52:23","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/07\/19\/command-routing-der-mfc-bei-kontext-menues-mit-trackpopupmenu\/"},"modified":"2008-06-28T18:39:46","modified_gmt":"2008-06-28T16:39:46","slug":"command-routing-der-mfc-bei-kontext-menues-mit-trackpopupmenu","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/07\/19\/command-routing-der-mfc-bei-kontext-menues-mit-trackpopupmenu\/","title":{"rendered":"Command Routing der MFC bei Kontext Men\u00fcs mit TrackPopupMenu"},"content":{"rendered":"<p>Kontext Men\u00fcs \u00a0geh\u00f6ren zum <em>State of\u00a0 the Art.<\/em><\/p>\n<p>Es ist auch nicht weiter schwer ein Men\u00fc zu laden \u00fcnd per <em>TrackPopupMenu<\/em> auf den Bildschirm zu zaubern.\u00a0Entsprechender Code sieht dann meistens so aus:<\/p>\n<pre lang=\"cpp\" line=\"1\">void CMyView::OnContextMenu(CWnd* pWnd, CPoint pt)\r\n{\r\n    \/\/ Get the menu\r\n    CMenu popups;\r\n   \u00a0if (!popups.LoadMenu(_T(\"AGV-IDR_MACRO_EDITOR_CONTEXT\")))\r\n        AfxThrowResourceException();\r\n   \u00a0CMenu* pSubMenu= popups.GetSubMenu(0);\r\n   \u00a0ASSERT(pSubMenu);\r\n   \u00a0if (!pSubMenu)\r\n      \u00a0\u00a0AfxThrowResourceException();\r\n   \u00a0pSubMenu-&gt;TrackPopupMenu(0,pt.x,pt.y,this);\r\n}<\/pre>\n<p>Oft sind in dem Men\u00fc einfache IDs von Commands verwendet worden, die irgendwo im View, Dokument, Frame oder der Applikation implementiert sind. Der Programmierer wundert sich nun warum seine Men\u00fcpunkte nicht ausgegraut werden. Alle Men\u00fcpunkte f\u00fcr alle IDs sind aktiv. Und man wundert sich noch mehr. Manche Commands (au\u00dferhalb des Views) werden nicht ausgef\u00fchrt.<\/p>\n<p>Was l\u00e4uft hier falsch?<\/p>\n<p>\u2757 Die Antwort liegt einzig und alleine im Aufruf von <em>TrackPopupMenu<\/em>! Der letzte Parameter gibt an, an wen die entsprechenden Nachrichten (<em>WM_COMMAND<\/em>, <em>WM_INITPOPUPMENU <\/em>und andere) gesendet werden. Naheliegender Weise gibt der Entwickler hier das Fenster an, in dem er das Popup Men\u00fc anzeigen will. Hier liegt der Hase im Pfeffer.<br \/>\nEin normales Fenster und ein View hat keine Verwendung (Handler) f\u00fcr WM_INITPOPUPMENU. Solch ein Handler w\u00e4re aber f\u00fcr das Command Routing der MFC notwendig um die Menu-Items ein- und auszuschalten.<\/p>\n<p>Das <em>CMainFrame <\/em>hat solch einen Handler, und kann damit umgehen. Also einfach das <em>CMainFrame <\/em>als Zeiger \u00fcbergeben und &#8230; es funktioniert wie erwartet. Warum auch nicht. Die IDs aus dem normalen Men\u00fc werden ja auch \u00fcber genau den selben Weg des Command Routings behandelt.<br \/>\nDie entscheidende Codezeile sieht dann so aus:<\/p>\n<pre lang=\"cpp\" line=\"1\">pSubMenu-&gt;TrackPopupMenu(0,pt.x,pt.y,AfxGetMainWnd());\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Kontext Men\u00fcs \u00a0geh\u00f6ren zum State of\u00a0 the Art. Es ist auch nicht weiter schwer ein Men\u00fc zu laden \u00fcnd per TrackPopupMenu auf den Bildschirm zu zaubern.\u00a0Entsprechender Code sieht dann meistens so aus: void CMyView::OnContextMenu(CWnd* pWnd, CPoint pt) { \/\/ Get the menu CMenu popups; \u00a0if (!popups.LoadMenu(_T(&#8222;AGV-IDR_MACRO_EDITOR_CONTEXT&#8220;))) AfxThrowResourceException(); \u00a0CMenu* pSubMenu= popups.GetSubMenu(0); \u00a0ASSERT(pSubMenu); \u00a0if (!pSubMenu) \u00a0\u00a0AfxThrowResourceException(); \u00a0pSubMenu-&gt;TrackPopupMenu(0,pt.x,pt.y,this); &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/07\/19\/command-routing-der-mfc-bei-kontext-menues-mit-trackpopupmenu\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eCommand Routing der MFC bei Kontext Men\u00fcs mit TrackPopupMenu\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,4,3],"tags":[370,73,352],"class_list":["post-94","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","tag-c","tag-command-routing","tag-mfc"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/94","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=94"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/94\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=94"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=94"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}