Geschwindigkeitsprobleme
-
Hallo Leute!
Hab da ein kleines Problem mit der Geschwindigkeit der MFC.
Meine Applikation hat ein Bitmap im Hintergrund. Dieses lade ich vorher aus einer Ressource in einen SpeicherDC und bringe es mit StretchBlt auf die gewünschte Größe. In der OnPaint-Methode meines Hauptfensters wird also nur noch ein BitBlt ausgeführt.
Im Fenster habe ich nun mehrere Steuerelemente...Editierfelder, Comboboxen, Statische Elemente usw. Da mir die windowsspezifischen Reiterkarten nicht gefallen, habe ich mir selber welche zusammengebastelt. Alle Steuerelemente werden beim Programmstart in den Speicher geladen. In einer globalen Variable wird nun das Layout gespeichert, in welchem ich mich befinde. In Abhängigkeit davon zeige ich die gewünschten Steuerelemente an bzw. blende sie aus (mit ShowWindow()). Da es sehr viele Steuerlemente sind (~200), dauert die Abfrage, ob ein Steuerelement angezeigt werden soll oder nicht, sehr lange. Außerdem dauert die anschließende Hintergrundaktualisierung (BitBlt) ebenfalls zu lange. Man sieht ein störendes Flackern beim Layoutumschalten.
Hat jemande eine Idee, wie man dies besser lösen könnte?
Danke+Gruß
-
du schreibst nicht wie du abfrägst ob ein Edit angezeigt werden soll oder nicht, du sagst nur wie du es ein- ausblendest. Wenn du mal zeigst wie du abfrägst ob oder ob nicht kann man da vielleicht ein wenig raus kitzeln.
-
Sobald das layout gewechselt wird, ruf ich die selbstdefinierte Methode Controls(int layout) auf.
Dort stehen nacheinander Blöcke für jedes Steuerelement:
Ich schreib mal Pseudocode, hab den genauen Code grad nicht da.
Bsp. für ein Steuerelement, welches im Layout 1 und 3 angezeigt werden soll:Wenn Layout==1 oder Layout==3
dann Wenn Steuerelemt==Unsichtbar dann Steuerelement=Sichtbar
else Wenn Steuerelement==Sichtbar dann Steuerelement==UnsichtbarSo wird das Steuerelement nur manipuliert, wenn es wirklich sein muss... Jedoch sind es bei ~200 Steuerelementen ziemlich viele Abfragen. Wenn bei einem Layoutwechsel (Anzeige von ca. 30 Steuerel.) alle 30 unsichtbar gesetzt werden, sieht man kurz weiße "löcher" im Hintergrund an den Stellen der Steuerelemente, bevor der Hintergrund wieder aktualisiert wird. Sieht nicht so schön aus.
Theoretisch müßte die Methode ShowWindow() nach ihrem Aufruf automatisch OnPaint() des Hauptfensters aufrufen, denn ich mach es nicht seperat, doch der Fensterhintergrund wird aktualisiert... Also dürfte es auch nix bringen, wenn ich in Controls() nach jedem Steuerelemente-Block InvalidateRect(TRUE) aufrufe und das Fenster neu zeichne...
Idee?
Danke+Gruß
-
Machst du das in einem Thread?
Das Fenster zeichnet sich nur wenn du ihm auch Zeit gibst die Nachrichten zu lesen.
-
Nein. Ich benutz da keinen Thread. Wahrscheinlich wird durch ShowWindow() die Nahchricht zum Neuzeichnen gesetzt und dann später neugezeichnet.
-
kannst es jetzt ja mal so versuchen:
const UINT ArrayIDs[] = { IDC_EDT_POT_TST_IO,...}; const UINT ArrayIDLen = sizeof(ArrayIDs)/sizeof(ArrayIDs[0]); // suht das Editfeld im Array Array IDs[] const UINT * found = std::find(ArrayIDs, ArrayIDs+ArrayIDLen,pWnd->GetDlgCtrlID()); CString Feldinhalt; pWnd->GetWindowText(Feldinhalt); // Wenn Editfeld im Array if (found != ArrayIDs+ArrayIDLen && Feldinhalt== IO_TESTRESULT) { ... }
Vielleicht ist es dann ein wenig schneller!