Nicht Modaler Dialog flickert immer wieder.Hilfe..
-
Hallo zusammen,
bin ein Neueinsteiger in MFC und habe folgendes Problem: Ich möchte eine SDI Anwenung erstellen. Dabei soll beim Programmstart direkt ein nicht modaler Dialog erzeugt werden. Dieser Dialog CReg1 ist vom Typ CPropertySheet und hat drei Register.
Falls ich nun folgenden Code in die Initinstance einfüge, passiert nichts.
CReg1 Eigenschaftsseite1( "Eigenschaftsfenster" );
Eigenschaftsseite1.Create(this, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0);
Eigenschaftsseite1.ShowWindow(SW_SHOW);Füge ich die gleichen Zeilen in die Funktion
CTestView::OnDraw(CDC* pDC)
ein, so flickert das Dialogfenster! Passiert das weil das Tochterfenster immer neu gezeichnet wird?
Vielen Dank für eure Hilfe..
-
1. Wenn Du Deinen Dialog so anlegst, liegt er auf dem Stack. Die Folge ist, dass er sofort nach beenden der Funktion (InitInstance) sofort zerstört wird.
2. Gleiches passiert natürlich in OnDraw. Jedesmal wird der Dialog erzeugt und zerstört und dadurch wird ein neuer Paint-Zyklus ausgelöst. Dadurch das flackern.
-
Martin Richter schrieb:
1. Wenn Du Deinen Dialog so anlegst, liegt er auf dem Stack. Die Folge ist, dass er sofort nach beenden der Funktion (InitInstance) sofort zerstört wird.
2. Gleiches passiert natürlich in OnDraw. Jedesmal wird der Dialog erzeugt und zerstört und dadurch wird ein neuer Paint-Zyklus ausgelöst. Dadurch das flackern.Hallo Martin,
danke für deine Hilfe. D.h. ich muss den Dialog global anlegen? Wo kann ich das machen?
-
Lerne den Unterscheid zwischen Heap und Stack. C/C++ Grundwissen

-
Ok:) Der Unterschied ist mir schon einigermaßen klar. Der Dialog wird zerstört weil er auf dem Stack liegt, das habe ich schon verstanden. Nur stell ich mir die Frage wo ich "Eigenschaftsseite1" mit new anlege? ich meine in welcher Funktion. InitInstance und Draw gehen ja nicht..
Sorry, man merkt dass ich keine Ahnung von MFC habe
-
Mit ebenfalls wenig Ahnung von der MFC vermute ich mal (was Martin dir bereits sagte):
Wenn du den Dialog so in InitInstance anlegstCReg1 Eigenschaftsseite1( "Eigenschaftsfenster" );
Eigenschaftsseite1.Create(this, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0);
Eigenschaftsseite1.ShowWindow(SW_SHOW);passiert das gleiche wie in OnDraw. Der Dialog wird erzeugt, angezeigt und beim Ende von InitInstance zerstört. Das geht wahrscheinlich so schnell, dass du nichts siehst.
CReg1 muss ausserhalb der Methode "leben".
Möglichkeit: Als member deiner von CWinApp abgeleiteten Klasse oder "frei", also z.b. in der .cpp Datei.CReg1 reg1; // oder CReg1 als private/protected member in MyCWinapp.hpp // MyCWinapp.cpp BOOL MyCWinapp::InitInstance() { ... reg1.Create(this, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0); reg1.ShowWindow(SW_SHOW); }
-
kayserili80 schrieb:
Nur stell ich mir die Frage wo ich "Eigenschaftsseite1" mit new anlege? ich meine in welcher Funktion. InitInstance und Draw gehen ja nicht..
Sorry, man merkt dass ich keine Ahnung von MFC habe
Wieso sollte InitInstance nicht gehen?
OnDraw wäre sicherlich unsinnig, wenn Du möchtest ja nicht bei jedem WM_PAINT Zyklus einen neuen Dialog erzeugen, oder?
Du erzeugst das Objekt, da wo Du es brauchst...Ansonsten würde ich Dir einfach anraten mal ein Tutorial wie Scrible durchzuarbeiten.
-
Vielen Dank für eure Hilfe! Das mit Initinstance() klappt!
Scribble habe ich gerade gegoogelt und gefunden.werde mal heute abend mich dran setzen.Vielleicht könnt ihr mir paar Tips geben ob ich wenigstens die richtige Projektart gewählt habe.
Ich will ein Programm, welches dynamisch nichtlineare Gleichungssysteme löst.
Die Eingangsgrössen für die Berechnung sollen über Registerkarten eingelesen werden(deshalb das CPropertySheet). Diese sollen eingelesen werden und anschliessend soll auf dem Hauptfenster die Rechnung starten und der Verlauf einiger berechneter Größen verfolgt werden.Ist hier SDI die richtige Anwendung? MDI brauche ich nicht da die Eingangsgrössen ja sehr gut über die Registerkarten eingelesen werden. Ich brauch auch nur ein Fenster um die Ergebnisse zu zeigen. Wo ich mir Probleme sehe, ist die zeitliche Berechnung auf dem Hauptfenster.
Also praktisch eine Schleife wie
for(time = 0; time < 10000; time++)
{
// hier einige Berechnungen durchführen
// und auf dem Hauptfenster zeigen
}Mich interessiert noch nicht,wie das geht.Sondern nur die Frage ob sowas in einer SDI Anwendung möglich ist.
Danke..
-
Warum nicht. Hängt einfach davon ab, wann Du mal einen UpdateAllView oder InvalidateRect ausführst für das View.
Dein Problem wird eher in der datenverwaltungund Koppelung von Dokment/View und Dialog liegen.