{"id":690,"date":"2010-11-06T20:32:19","date_gmt":"2010-11-06T19:32:19","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=690"},"modified":"2010-11-08T08:24:20","modified_gmt":"2010-11-08T07:24:20","slug":"erstaunen-cmemdc-ist-bestandteil-der-mfc","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2010\/11\/06\/erstaunen-cmemdc-ist-bestandteil-der-mfc\/","title":{"rendered":"Erstaunen: CMemDC ist Bestandteil der MFC!"},"content":{"rendered":"<p>Wer Double Buffering ben\u00f6tigt und die <em>MFC nutzt, <\/em>der kennt auch <em>CMemDC<\/em>. Vermutlich eine der meist genutzten und kopierten Klassen, die auf <em>CodeProject <\/em>und <em>CodeGuru <\/em>vorgestellt wurden.<br \/>\n<a href=\"http:\/\/www.codeproject.com\/KB\/GDI\/flickerfree.aspx\">http:\/\/www.codeproject.com\/KB\/GDI\/flickerfree.aspx<\/a><br \/>\n<a href=\"http:\/\/www.codeguru.com\/cpp\/misc\/misc\/flickerfreedrawing\/article.php\/c389\/Flicker-free-drawing-using-memory-DC.htm\">http:\/\/www.codeguru.com\/cpp\/misc\/misc\/flickerfreedrawing\/article.php\/c389\/Flicker-free-drawing-using-memory-DC.htm<\/a><\/p>\n<p>Ich habe meine Erweiterung <a href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/12\/14\/der-etwas-bessere-cmemdc\/\">hier im Blog<\/a>\u00a0vorgestellt und die liegt normalerweise in einem separaten Namespace, wie alle meine Tool-Klassen.<\/p>\n<p>Nicht schlecht staunte ich, als ich keinen Compilerfehler bekam obwohl ich <em>CMemDC <\/em>nutzte aber keinen Namespace angab. Siehe da: <em>CMemDC <\/em>hat in einer eigenen Implementierung den Weg in die MFC gefunden. Man findet sie in:<br \/>\n<em>C:\\Program Files\\Microsoft Visual Studio 10.0\\VC\\atlmfc\\include\\afxcontrolbarutil.h<\/em><\/p>\n<p>Im Gro\u00dfen und Ganzen ist es die bekannte Standard-Implementierung, allerdings verf\u00fcgt diese <em>CMemDC <\/em>Version auch Code, der auf <em>Windows Vista <\/em>und <em>Windows 7<\/em>,<em>\u00a0<\/em>die fest im Betriebssystem verankerten Funktionen nutzt: <em>BeginBufferedPaint<\/em>, <em>EndBufferedPaint<\/em><br \/>\nSiehe <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb773178(VS.85).aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/bb773178(VS.85).aspx<\/a><br \/>\nDiese Funktionen werden innerhalb des Themeings von <em>Windows Vista <\/em>und <em>Windows 7 <\/em>verwendet und in dieser Funktionsgruppe ist auch Alphablending direkt verankert. (<em>BufferedPaintSetAlpha<\/em>). Ich vermute sogar, dass diese integrierten Klassen effektiver arbeiten, als die eigenen Klassen (ein Test steht noch aus), denn Windows wei\u00df intern nat\u00fcrlich viel besser was wie zu puffern und zu zeichnen ist, als wir, wenn <em>WM_PAINT <\/em>aufgerufen wird.<\/p>\n<p>Vielleicht ein guter Grund, die eigene CMemDC Klasse auch auf Vista\/Windows 7 Funktionen zu erweitern oder die integrierte Klasse in der MFC zu verwenden.<\/p>\n<p>Tipp: \u00dcbrigens hat die <em>MFC CMemDC <\/em>Klasse einen statischen Member, der es auf einfache Weise erlaubt das Double-Buffering abzuschalten (<em>CMemDC::\u00a0m_bUseMemoryDC<\/em>), dass ist besonders interessant beim Debuggen von grafischen Operationen, deren Ergebnisse man auch gleich sehen will, allerdings wird dieser Member nicht benutzt wenn das interne <em>Windows Double-Buffering <\/em>genutzt werden kann, schade eigentlich.<\/p>\n<p>PS: Aber eigentlich muss man sich auch die Frage stellen, warum die Entwickler genau diesen Klassennamen verwendet haben, denn er provoziert ja auch direkt den Konflikt mit existierendem Code.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer Double Buffering ben\u00f6tigt und die MFC nutzt, der kennt auch CMemDC. Vermutlich eine der meist genutzten und kopierten Klassen, die auf CodeProject und CodeGuru vorgestellt wurden. http:\/\/www.codeproject.com\/KB\/GDI\/flickerfree.aspx http:\/\/www.codeguru.com\/cpp\/misc\/misc\/flickerfreedrawing\/article.php\/c389\/Flicker-free-drawing-using-memory-DC.htm Ich habe meine Erweiterung hier im Blog\u00a0vorgestellt und die liegt normalerweise in einem separaten Namespace, wie alle meine Tool-Klassen. Nicht schlecht staunte ich, als ich keinen &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2010\/11\/06\/erstaunen-cmemdc-ist-bestandteil-der-mfc\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eErstaunen: CMemDC ist Bestandteil der MFC!\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,172,2],"tags":[117,352,244,78,171],"class_list":["post-690","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","category-vs2010","category-windows-api","tag-gdi","tag-mfc","tag-mfc-next","tag-mfcnext","tag-vs-2010"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/690","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=690"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/690\/revisions"}],"predecessor-version":[{"id":692,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/690\/revisions\/692"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=690"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=690"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=690"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}