{"id":678,"date":"2010-12-04T17:46:50","date_gmt":"2010-12-04T16:46:50","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=678"},"modified":"2010-11-20T17:28:46","modified_gmt":"2010-11-20T16:28:46","slug":"warum-es-manchmal-nicht-genuegt-die-basisklasse-aufzurufen-und-die-miesen-konsequenzen","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2010\/12\/04\/warum-es-manchmal-nicht-genuegt-die-basisklasse-aufzurufen-und-die-miesen-konsequenzen\/","title":{"rendered":"Warum es manchmal nicht gen\u00fcgt die Basisklasse aufzurufen und die miesen Konsequenzen&#8230;"},"content":{"rendered":"<p>Wenn man eine Windowsnachricht bearbeitet dann ruft man in den meisten F\u00e4llen die Funktion der Elternklasse auf. Was aber, wenn man die Nachricht nicht nur entgegennehmen will, sondern sie &#8222;ver\u00e4ndert&#8220; an die Basisfunktion weitergeben will. Was dann?<br \/>\nKein Problem denkt man. Man \u00e4ndert die Parameter eben und gibt diese neuen Werte an die Basisklasse weiter.<\/p>\n<p>Nehmen wir mal als Beispiel ein Eingabe Control, das sich m\u00f6glichst intelligent verhalten soll. D.h. in diesem Fall, wenn ein Datum eingegeben wird, dann sollte auch bei der Eingabe auf numerischen Ziffernbock, das Komma in einen Punkt gewandelt werden, oder bei englischem Datumsformat in einen Slash&#8230;<\/p>\n<p>Na OK. Man \u00fcberschreibt als <em>CMyWnd::OnChar<\/em>. Man pr\u00fcft ob ein bestimmtes Zeichen ankommt und wenn es mir passt, dann \u00e4ndere ich den Parameter und gebe diesen dann an die Basis Funktion weiter.<\/p>\n<p>:Eeek: aber was ist das? Der Code hat keine Wirkung? Egal was wir an die Basisfunktion \u00fcbergeben, es \u00e4ndert sich nichts. Warum?<\/p>\n<p>Die Antwort liegt in dem f\u00fcr mich etwas eigent\u00fcmlichen Design der <em>MFC<\/em>. Alle <em>CWnd <\/em>Nachrichten Routinen rufen letzten Endes immer genau ein und die selbe Funktion auf: <em>CWnd::Default(); <\/em>Aber was macht <em>CWnd::Default<\/em>? Es nimmt die <em><strong>urspr\u00fcnglichen <\/strong><\/em>Parameter, die Windows mal gesendet hat und \u00fcbergibt die an die Window-Proc des Fensters. D.h. alle tollen Manipulationen an der <em>WM_CHAR <\/em>Nachricht sind weg in dem Moment in dem <em>CWnd::OnChar<\/em> aufgerufen wird.<\/p>\n<p>Was also tun, wenn man nun aber wirklich die <em>WM_CHAR <\/em>Nachricht manipulieren will?<br \/>\nEigentlich nicht schwer. Man macht das Gleiche, dass eben auch <em>CWnd::Default <\/em>macht. Man ruft <em>DefWindowProc <\/em>mit den passenden <em>wParam <\/em>und <em>lParam <\/em>Werten auf.<\/p>\n<p>Aber jetzt wird es dumm \u2757 Damit umgehen wir alle anderen geerbten Funktionalit\u00e4ten des Controls. Ich habe keine Ahnung was die Entwickler der <em>MFC <\/em>in der Anfangszeit dazu getrieben hat immer <em>CWnd::Default <\/em>aufzurufen? War es Ihnen zu kompliziert wieder aus den Parametern <em>wParam <\/em>und <em>lParam <\/em>zusammen zu bauen?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man eine Windowsnachricht bearbeitet dann ruft man in den meisten F\u00e4llen die Funktion der Elternklasse auf. Was aber, wenn man die Nachricht nicht nur entgegennehmen will, sondern sie &#8222;ver\u00e4ndert&#8220; an die Basisfunktion weitergeben will. Was dann? Kein Problem denkt man. Man \u00e4ndert die Parameter eben und gibt diese neuen Werte an die Basisklasse weiter. &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2010\/12\/04\/warum-es-manchmal-nicht-genuegt-die-basisklasse-aufzurufen-und-die-miesen-konsequenzen\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eWarum es manchmal nicht gen\u00fcgt die Basisklasse aufzurufen und die miesen Konsequenzen&#8230;\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,2],"tags":[370,352,59,61],"class_list":["post-678","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","category-windows-api","tag-c","tag-mfc","tag-win32","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\/678","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=678"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/678\/revisions"}],"predecessor-version":[{"id":695,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/678\/revisions\/695"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=678"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=678"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}