{"id":528,"date":"2010-01-14T20:10:32","date_gmt":"2010-01-14T19:10:32","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=528"},"modified":"2010-01-16T11:47:12","modified_gmt":"2010-01-16T10:47:12","slug":"bug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2010\/01\/14\/bug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control\/","title":{"rendered":"Bug in der Windows UI: SetRedraw ver\u00e4ndert WS_VISIBLE Stil in einem RTF Control"},"content":{"rendered":"<p>Ich habe eine relativ komplexe UI, die auch dynamisch Controls erzeugt. In diese Controls werden auch zum Teil Massen an Daten hineingeschoben. Damit alle Controls zeitgleich erst die Daten pr\u00e4sentieren verwende ich eine einfache Methode, die aus alten Windows Tagen stammt: <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/btaacw58(VS.80).aspx\">CWnd::SetRedraw<\/a><em>\/<\/em><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms912675.aspx\">WM_SETREDRAW<\/a>. Man verwendet diese Nachricht zum Beispiel um das Flackern von Listboxen und Comboboxen zu verhindern, wenn man viele Daten einf\u00fcgt.<br \/>\nDiese Nachricht wird von allen Fenstern unterst\u00fctzt oder sollte unterst\u00fctzt werden \ud83d\ude09<\/p>\n<p>Meine Software macht nun folgendes:<\/p>\n<ul>\n<li>Zuerst hat meine Ladeprozedur f\u00fcr die Daten, zuerst alle Controls erzeugt, oder \u00fcberfl\u00fcssige vernichtet und positioniert, oder evtl. nur ausgeblendet (<em>ShowWindow(SW_HIDE)<\/em>. D.h. nach dem ersten Laden der Daten \u00e4ndert sich am Layout evtl. nichts mehr.<\/li>\n<li>Anschlie\u00dfend wurde an alle Controls <em>CWnd::SetRedraw\/WM_SETREDRAW<\/em> mit <em>FALSE <\/em>gesendet.<\/li>\n<li>Dann die Daten geladen.<\/li>\n<li>Nach dem Laden wird einfach wieder\u00a0<em>CWnd::SetRedraw\/WM_SETREDRAW <\/em>mit <em>TRUE<\/em> gesendet und ein Invalidate durchgef\u00fchrt.<\/li>\n<\/ul>\n<p>Das funktioniert f\u00fcr alle Controls, mit einer Ausnahme: Das <em>RTF <\/em>Control. Wenn man <em>WM_SETREDRAW TRUE <\/em>an ein <em>RTF <\/em>Control sendet, das nicht sichtbar ist, dann wird dieses sichtbar. Der Stil <em>WS_VISIBLE <\/em>wird also ver\u00e4ndert. \ud83d\ude2e<\/p>\n<p>Um das Problem zu isolieren habe ich <a href=\"http:\/\/blog.m-ri.de\/wp-content\/uploads\/2009\/12\/TestRTFSetRedraw.zip\">hier ein kleines Testprogramm<\/a> geschrieben. Der kritische Code sieht so aus. Das gesamte Projekt kann man hier auch herunterladen: Demoprojekt.<\/p>\n<pre lang=\"cpp\">void CTestRTFSetRedrawDlg::OnBnClickedBtDoit()\r\n{\r\n\u00a0bool bWasVisible = (m_wndEdRTF.GetStyle() &amp; WS_VISIBLE)!=0;\r\n\u00a0m_wndEdRTF.SetRedraw(FALSE);\r\n\u00a0m_wndEdRTF.SetWindowText(_T(\"Line 1\\r\\nLine 2\\r\\nLine 3\\r\\nLine 4\"));\r\n\u00a0m_wndEdRTF.SetSel(0,0);\r\n\u00a0m_wndEdRTF.SetRedraw(TRUE);\r\n\u00a0m_wndEdRTF.Invalidate();\r\n\u00a0bool bIsVisible = (m_wndEdRTF.GetStyle() &amp; WS_VISIBLE)!=0;\r\n\r\n \/\/ Check if the visible state changed\r\n  if (bIsVisible!=bWasVisible)\r\n  AfxMessageBox(_T(\"The visible state of the RTF control changed!\"));\r\n}<\/pre>\n<p lang=\"cpp\"><strong>Nachtrag 16.01.2010 (Danke Sven f\u00fcr Deinen produktiven Kommentar):<br \/>\n<\/strong>Auch andere Controls wie <em>Button<\/em>-, <em>Static<\/em>&#8211; und <em>Edit<\/em>-Controls ver\u00e4ndern den Visible Status wenn <em>WM_SETREDRAW <\/em>angewendet wird. Einzig <em>Listbox<\/em>&#8211; und <em>Combobox<\/em>-Controls behalten den Visiblestatus korrekt bei \u2757<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich habe eine relativ komplexe UI, die auch dynamisch Controls erzeugt. In diese Controls werden auch zum Teil Massen an Daten hineingeschoben. Damit alle Controls zeitgleich erst die Daten pr\u00e4sentieren verwende ich eine einfache Methode, die aus alten Windows Tagen stammt: CWnd::SetRedraw\/WM_SETREDRAW. Man verwendet diese Nachricht zum Beispiel um das Flackern von Listboxen und Comboboxen &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2010\/01\/14\/bug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eBug in der Windows UI: SetRedraw ver\u00e4ndert WS_VISIBLE Stil in einem RTF Control\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,12,91,2],"tags":[99,100,59,61],"class_list":["post-528","post","type-post","status-publish","format-standard","hentry","category-mfc","category-programmieren","category-software","category-windows-software","category-windows-api","tag-bug","tag-gui","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\/528","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=528"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/528\/revisions"}],"predecessor-version":[{"id":582,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/528\/revisions\/582"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=528"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=528"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=528"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}