{"id":519,"date":"2010-01-04T17:43:32","date_gmt":"2010-01-04T16:43:32","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=519"},"modified":"2010-01-04T17:43:32","modified_gmt":"2010-01-04T16:43:32","slug":"cdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2010\/01\/04\/cdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling\/","title":{"rendered":"CDialog::SetDefID und DM_SETDEFID, des Tastaturfreunds Liebling"},"content":{"rendered":"<p>Die Frage um die Eingabe-Taste in Dialogen und wie man diese &#8222;missbraucht&#8220; (sage ich mal provokant) ist eine regelm\u00e4\u00dfige Frage in allen Foren.<\/p>\n<p>Die Intention ist oft klar. Man m\u00f6chte mit der Eingabetaste eine bestimmte Aktion verbinden, die evtl. sehr oft ausgef\u00fchrt werden soll und nicht den Dialog schlie\u00dfen.<br \/>\nDie \u00fcblichen Wege sind schon mehrfach diskutiert worden und auch in meinem Blog finden sich dazu ein <a href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/09\/21\/die-return-taste-in-dialogen-eine-unendliche-geschichte\/\">Artikel<\/a> .<\/p>\n<p>Zu kurz kommt\u00a0bei dieser Diskussion die Funktion <em><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/7sd15kw3(VS.80).aspx\">CDialog::SetDefID<\/a><\/em> bzw. <em><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms645413(VS.85).aspx\">DM_SETDEFID<\/a>\u00a0<\/em>Nachricht.<br \/>\nWas macht diese Funktion\/Nachricht?<br \/>\nSie definieren die Button-ID, die als Default-Aktion in einem Dialog ausgel\u00f6st werden soll und das ist nichts anderes als die Aktion die geschehen, soll wenn die Eingabe-Taste gedr\u00fcckt wird.<br \/>\nViele Entwickler definieren einfach <em>OnOK<\/em> um. Aber das eigentlich tolle ist mit <em>SetDefID<\/em> den Button in Abh\u00e4ngigkeit der Daten umzusetzen und das hat auch einen visuellen Effekt f\u00fcr den Nutzer.<\/p>\n<p>Mal ein Beispiel:<br \/>\nWir haben einen Dialog mit zwei List Views. Links Elemente die zur Auswahl stehen, rechts die Elemente in der Reihenfolge, die der Benutzer ausgew\u00e4hlt hat.<br \/>\nDer Mausschubser wird einfach die Eintr\u00e4ge auf der linken oder rechten Seite doppelklicken und damit ausw\u00e4hlen oder entfernen. Entsprechende Buttons f\u00fcr Hinzuf\u00fcgen und Entfernen wird es auch geben. Man kann also auch links oder rechts markieren und dann den Hinzuf\u00fcgen oder Entfernen Schalter nutzen.<\/p>\n<p>Dem Tastaturnutzer k\u00f6nnen wir helfen indem wir intelligent <em>CDialog::SetDefID \/\u00a0DM_SETDEFID<\/em> verwenden. Die Vorgehensweise ist einfach.<\/p>\n<ul>\n<li>Wir richten uns nur danach in welchem <em>List View <\/em>wir uns befinden, d.h. befinden wir uns im linken <em>List View <\/em>steuern wir den <em>Hinzuf\u00fcgen <\/em>Schalter, und im rechten <em>List View <\/em>steuern wir den <em>Entfernen <\/em>Schalter.<\/li>\n<li>Wird also im linken List View ein Item ausgew\u00e4hlt, setzen wir mit <em>CDialog::SetDefID \/\u00a0DM_SETDEFID <\/em>die ID des <em>Hinzuf\u00fcgen <\/em>Schalters.<\/li>\n<li>In dem Moment wird der <em>Hinzuf\u00fcgen <\/em>Schalter zum <em>Default<\/em>-Button. Der Nutzer kann nun die Eingabe-Taste dr\u00fccken und die Items werden in die rechte Box verschoben.<\/li>\n<li>Links liegt jetzt nun noch der Fokus, aber es sind keine Items mehr markiert. D.h. wir setzen nun den Default Button zur\u00fcck auf <em>IDOK<\/em>.<\/li>\n<li>Jetzt kann der Nutzer erneut ein Item markieren. Der <em>Default<\/em>-Button wird wieder der <em>Hinzuf\u00fcgen\/Entfernen<\/em> Schalter und die Eingabetaste macht was der Nutzer gerne h\u00e4tte.<\/li>\n<li>Ist kein Item mehr markiert schlie\u00dft die Eingabetaste wieder \u00fcber <em>IDOK <\/em>den Dialog.<\/li>\n<\/ul>\n<p>Ohne Maus kann man also mit den Pfeiltasten, der Leertaste (evtl. <em>Strg<\/em>-Taste) und der Eingabetaste diesen Dialog bedienen. Und das sogar intuitiv, denn der entsprechende Default Button wird ja in der UI sch\u00f6n umrandet und hervorgehoben.<br \/>\nDas freut jeden Tastaturfreund. Und man muss gar nichts gro\u00df machen mit der Behandlung Eingabetaste.<\/p>\n<p>Damit das Ganze nicht so abstrakt ist, habe ich\u00a0<a href=\"http:\/\/blog.m-ri.de\/wp-content\/uploads\/2009\/12\/TestSetDefDlgID.zip\">ein kleines Sample<\/a>\u00a0gebaut, dass diese Anwendung zeigt. Es hat keine Implementierung f\u00fcr <em>Drag&amp;Drop <\/em>aber es macht deutlich, wie man dem Tastaturnutzer entgegen kommen kann indem man die Controls geschickt aktiviert.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Frage um die Eingabe-Taste in Dialogen und wie man diese &#8222;missbraucht&#8220; (sage ich mal provokant) ist eine regelm\u00e4\u00dfige Frage in allen Foren. Die Intention ist oft klar. Man m\u00f6chte mit der Eingabetaste eine bestimmte Aktion verbinden, die evtl. sehr oft ausgef\u00fchrt werden soll und nicht den Dialog schlie\u00dfen. Die \u00fcblichen Wege sind schon mehrfach &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2010\/01\/04\/cdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eCDialog::SetDefID und DM_SETDEFID, des Tastaturfreunds Liebling\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,9,2],"tags":[204,210,352,45,97,61],"class_list":["post-519","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","category-sonstiges","category-windows-api","tag-dialoge","tag-eingabetaste","tag-mfc","tag-tastatur","tag-ui","tag-winapi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/519","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=519"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/519\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=519"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=519"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=519"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}