{"id":104,"date":"2007-08-24T18:57:41","date_gmt":"2007-08-24T16:57:41","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/08\/24\/setfocus-versus-wm_nextdlgctl\/"},"modified":"2007-08-24T18:57:41","modified_gmt":"2007-08-24T16:57:41","slug":"setfocus-versus-wm_nextdlgctl","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/08\/24\/setfocus-versus-wm_nextdlgctl\/","title":{"rendered":"SetFocus versus WM_NEXTDLGCTL"},"content":{"rendered":"<p>Die meisten Entwickler verwenden <em>SetFocus<\/em> um in einem Dialog gezielt den Eingabefokus zu versetzen. Aber es gibt ein Problem, dem <em>SetFocus <\/em>nicht gerecht wird: der <em>Default Button<\/em>.<br \/>\nDer <em>Default Button<\/em> wird durch <em>WM_SETDEFID <\/em>bzw. <em>CDialog::SetDefID <\/em>gesetzt. <em>SetFocus<\/em> ber\u00fccksicht das interne Konzept des <em>Default Buttons <\/em>nicht.<\/p>\n<p>Wenn man mit der Tab-Taste durch einen Dialog springt und einen Button erwischt, dann wird dieser automatisch zum <em>Default Button.<\/em> Normalerweise ist das der OK-Schalter, er verliert dann den dicken Rahmen. Dr\u00fcckt man die Eingabe-Taste, dann wird nun der neue Schalter ausgel\u00f6st und nicht der OK-Schalter.<br \/>\nLandet der Fokus von einem Button dann bei einem Edit Control, dann wird der OK-Schalter wieder der Default Button und man kann mit der Eingabe-Taste den Dialog beenden.<\/p>\n<p>Wenn nun <em>SetFocus<\/em> verwendet wird durch eine interne Funktion, dann wird dieser Mechanismus des Dialoges\u00a0umgangen. Der <em>Default-Button <\/em>wird evtl. nicht korrekt gesetzt. Es kann sogar soweit kommen, dass es zwei <em>Default-Schalter <\/em>oder gar keinen mehr gibt. <em>SetFocus<\/em> f\u00fchrt immer zu Problemen wenn das neue Control oder das bisherige Control, welches den Fokus hatte, ein Button ist. Nur wenn beide Controls keine Button sind kann <em>SetFocus <\/em>gefahrlos verwendet werden.<\/p>\n<p>Korrekt funktioniert das Ganze nur, wenn statt <em>SetFocus<\/em>, <em>WM_NEXTDLGCTL <\/em>verwendet wird, oder die entsprechenden MFC Funktionen, <em>CDialog::NextDlgCtrl <\/em>bzw. <em>CDialog::GotoDlgCtrl <\/em>verwendet werden.<br \/>\nDie Nachricht <em>WM_NEXTDLGCTL <\/em>wird auch intern durch die <em>DefDialogProc <\/em>behandelt und normalerweise durch <em>IsDialogMessage <\/em>erzeugt.<br \/>\nGefahrlos ist auch die Verwendung von <em>SetFocus <\/em>in <em>WM_INITDIALOG <\/em>bzw. <em>CDialog::OnInitDialog<\/em> Handlern, die dann normalerweise mit <em>FALSE<\/em>, verlassen werden. Nach dieser Funktion sorgt der Dialog Handler, f\u00fcr die korrekte Behandlung der <em>Default Buttons<\/em>.<\/p>\n<p><strong>Fazit: <\/strong>Man sollte also innerhalb von Dialogen ganz auf <em>SetFocus <\/em>verzichten sondern nur <em>WM_NEXTDLGCTL<\/em>\u00a0 bzw.\u00a0 <em>CDialog::NextDlgCtrl <\/em>und <em>CDialog::GotoDlgCtrl<\/em> verwenden. Konsequenterweise sollte man dann auch in <em>OnInitDialog <\/em>Handlern auf <em>SetFocus <\/em>verzichten. \u2757<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die meisten Entwickler verwenden SetFocus um in einem Dialog gezielt den Eingabefokus zu versetzen. Aber es gibt ein Problem, dem SetFocus nicht gerecht wird: der Default Button. Der Default Button wird durch WM_SETDEFID bzw. CDialog::SetDefID gesetzt. SetFocus ber\u00fccksicht das interne Konzept des Default Buttons nicht. Wenn man mit der Tab-Taste durch einen Dialog springt und &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/08\/24\/setfocus-versus-wm_nextdlgctl\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eSetFocus versus WM_NEXTDLGCTL\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":[4,3,2],"tags":[370,352,61],"class_list":["post-104","post","type-post","status-publish","format-standard","hentry","category-mfc","category-programmieren","category-windows-api","tag-c","tag-mfc","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\/104","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=104"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/104\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=104"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}