{"id":799,"date":"2011-05-28T10:44:13","date_gmt":"2011-05-28T08:44:13","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=799"},"modified":"2011-05-27T11:21:47","modified_gmt":"2011-05-27T09:21:47","slug":"getdefaultaccelerator-der-unbekannte-helfer","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2011\/05\/28\/getdefaultaccelerator-der-unbekannte-helfer\/","title":{"rendered":"GetDefaultAccelerator der unbekannte Helfer"},"content":{"rendered":"<p>Ich bin Tastatur-Fan und ich achte in meinen Anwendungen immer darauf, dass ein Benutzer meine Anwendungen\u00a0einfach mit der mit der Tastatur bedienen kann. Accelerator sind in Windows f\u00fcr den Entwickler hier ein einfaches Tool, Funktionen \u00fcber die Tastatur einfach verf\u00fcgbar zu machen.<\/p>\n<p>Tastatur Acceleratoren werden in der <em>MFC<\/em> in <em>CFrameWnd<\/em> geladen und <em>PreTranslateMessage<\/em> angewendet. \u00dcblicherweise passiert das Laden direkt wenn <em>LoadFrame<\/em> ausgef\u00fchrt wird, oder wenn in einer <em>MDI<\/em>-Anwendung das Childframe mit dem entsprechenden Document-Template erzeugt wird.<\/p>\n<p>Allerdings wird es spannend, wenn man den Accelerator wechseln will aufgrund verschiedener Ansichten oder Zust\u00e4nde in der Anwendung. Denn ein <em>CMainFrame<\/em> wei\u00df ja eigentlich nichts von den Dokumententypen oder dessen Zustand. Und ich f\u00e4nde es eigentlich nicht sch\u00f6n entsprechenden Code imFrame zu verankern.<\/p>\n<p>Zum Gl\u00fcck ist das auch nicht n\u00f6tig, denn es gibt schon immer die zwei netten undokumentierten Funktionen <em>CFrameWnd::GetDefaultAccelerator<\/em> und <em>CDocument::GetDefaultAccelerator.<\/em><\/p>\n<p>Sobald eine Tastatureingabe in <em>CFrameWnd::PreTranslateMessage<\/em> ankommt wird <em>CFrameWnd::GetDefaultAccelerator<\/em> aufgerufen. Nur wenn diese Funktion <em>NULL<\/em> zur\u00fcckgibt wird der im Frame gespeicherte <em>m_hAccel<\/em> verwendet. Nun und <em>CFrameWnd::GetDefaultAccelerator<\/em> ruft nun <em>CDocument::GetDefaultAccelerator <\/em>f\u00fcr ds aktuelle Dokument auf.<br \/>\nDamit kann nun das Dokument selbst \u00fcber den Accelerator bestimmen, der verwendet werden soll. Wird NULL zur\u00fcckgegeben wird der Accelerator des Frames verwendet.<\/p>\n<p>In der MFC-Next ist das Verhalten etwas anders, weil dort der Keyboard Handler eingeschaltet ist, aber letzten Endes wird GetDefaultAccelerator auch von dort aufgerufen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich bin Tastatur-Fan und ich achte in meinen Anwendungen immer darauf, dass ein Benutzer meine Anwendungen\u00a0einfach mit der mit der Tastatur bedienen kann. Accelerator sind in Windows f\u00fcr den Entwickler hier ein einfaches Tool, Funktionen \u00fcber die Tastatur einfach verf\u00fcgbar zu machen. Tastatur Acceleratoren werden in der MFC in CFrameWnd geladen und PreTranslateMessage angewendet. \u00dcblicherweise &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2011\/05\/28\/getdefaultaccelerator-der-unbekannte-helfer\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eGetDefaultAccelerator der unbekannte Helfer\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,352,45],"class_list":["post-799","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","tag-c","tag-mfc","tag-tastatur"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/799","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=799"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/799\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=799"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=799"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}