{"id":501,"date":"2009-12-03T20:57:55","date_gmt":"2009-12-03T19:57:55","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=501"},"modified":"2009-12-03T20:13:21","modified_gmt":"2009-12-03T19:13:21","slug":"afxmessagebox-versus-cwndmessagebox","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2009\/12\/03\/afxmessagebox-versus-cwndmessagebox\/","title":{"rendered":"AfxMessageBox versus CWnd::MessageBox"},"content":{"rendered":"<p>Jeder MFC Entwickler kennt <em>AfxMessageBox<\/em>. In der Klasse CWnd finden wir auch die Memberfunktion <em>CWnd::MessageBox<\/em>.<br \/>\nMancher Entwickler wird sich nun fragen: Wann nehme ich denn nun was?<\/p>\n<p><strong>Kurze Antwort: Meide <em>CWnd::MessageBox <\/em>und nutze immer <em>AfxMessageBox <\/em>\u2757<\/strong><\/p>\n<p><strong>Lange Antwort:<br \/>\n<\/strong>CWnd::MessageBox ist einfach nur ein direkter Wrapper f\u00fcr Windows API Funktion <em>MessageBox<\/em>.<br \/>\nDer Grund warum man <em>AfxMessageBox <\/em>verwenden sollte liegt darin was <em>AfxMessageBox <\/em>einfach noch mehr leistet:<\/p>\n<ol>\n<li><em>AfxMessageBox <\/em>benutzt die virtuelle Funktion <em>CWinApp::DoMessageBox<\/em>. Damit kann man zentral eine andere Behandlung f\u00fcr Fehlermeldungen einbauen.<\/li>\n<li><em>AfxMessageBox <\/em>sorgt daf\u00fcr, dass OLE Controls benachrichtigt werden, dass Ihre nicht modalen Dialoge nun deaktiviert werden m\u00fcssen. Es w\u00e4re ja ziemlich heftig, wenn man solche Dialoge trotz aktiver MessageBox noch benutzen k\u00f6nnte. (siehe <em>CWinApp::DoEnableModeless <\/em>und Implementierung von <em>CWnd::GetSafeOwner<\/em>)<\/li>\n<li><em>CWnd::MessageBox <\/em>benutzt das aktuelle Fensterhandle aus dem es aufgerufen wird als Parent-Handle f\u00fcr die API Funktion MessageBox. Die wenigsten Entwickler kennen, lesen oder beachten den netten Zusatz in der <em>MessageBox <\/em><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms645505(VS.85).aspx\">Doku<\/a>:<br \/>\n<em><strong>If you create a message box while a dialog box is present, use the handle of the dialog box as the hWnd parameter. The hWnd parameter should not identify a child window, such as a control in a dialog box.<\/strong><br \/>\n<\/em>Es ist also gerade zul\u00e4ssig <em>CWnd::MessageBox <\/em>aufzurufen, denn oft genug haben wir es mit Child-Windows zu tun.<br \/>\nNetterweise beachtet <em>AfxMessageBox <\/em>genau das. Es ermittelt das aktuelle aktive Top-Level Fenster und setzt es intern f\u00fcr den Aufruf von MessageBox.<br \/>\nDas wird auch ganz besonders wichtig, wenn man evtl. mehrere UI Threads hat. <em>AfxMessageBox<\/em> verwendet automatisch den richtigen. <em>CWnd::MessageBox <\/em>verwendet den aktuellen Thread aber evtl. als Fenster das Fenster-Handle aus einem anderen Threads.<\/li>\n<li><em>CWnd:MessageBox <\/em>hat keine Implementierung f\u00fcr die <em>F1<\/em>-Taste und die Hilfeimplementierung der MFC.<\/li>\n<li>Ich muss mich nicht um den Titel der <em>MessageBox <\/em>k\u00fcmmern, denn <em>AfxMessageBox <\/em>benutzt den hinterlegten Applikationsnamen (<em>CWinApp::m_pszAppName<\/em>) der in der MFC hinterlegt und definiert wurde.<\/li>\n<li>Netterweise setzt AfxMessageBox passende Icons wenn nur die Reaktionsform definiert wird, also kein Icon. (<em>MB_OK<\/em> und <em>MB_OKCANCEL<\/em> benutzt <em>MB_ICONEXCLAMATION<\/em>, <em>MB_YESNO <\/em>und <em>MB_YESNOCANCEL <\/em>benutzt <em>MB_ICONQUESTION<\/em>).<\/li>\n<\/ol>\n<p>HTH<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jeder MFC Entwickler kennt AfxMessageBox. In der Klasse CWnd finden wir auch die Memberfunktion CWnd::MessageBox. Mancher Entwickler wird sich nun fragen: Wann nehme ich denn nun was? Kurze Antwort: Meide CWnd::MessageBox und nutze immer AfxMessageBox \u2757 Lange Antwort: CWnd::MessageBox ist einfach nur ein direkter Wrapper f\u00fcr Windows API Funktion MessageBox. Der Grund warum man AfxMessageBox &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2009\/12\/03\/afxmessagebox-versus-cwndmessagebox\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eAfxMessageBox versus CWnd::MessageBox\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,153,36,44,171,61],"class_list":["post-501","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","category-windows-api","tag-c","tag-mfc","tag-vs-2003","tag-vs-2005","tag-vs-2008","tag-vs-2010","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\/501","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=501"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/501\/revisions"}],"predecessor-version":[{"id":554,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/501\/revisions\/554"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=501"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}