WM_PAINT Zeichnung ein und ausblenden ?
-
Hallo zusammen !
Hocken grade über der Klausur vom letzten Semester und versuchen diese zu zerpflücken um sie dann doch endlich irgendwann zu verstehen ...
Es ist alles sehr einfach gehalten und eventuell kann uns der ein oder andere ja dabei helfen...
Wir haben hier eine vorgegebene .exe die einen Sinus und in einem zweiten Diagramm die dazugehörigen Harmonischen malt. Über einen Schieberegler kann der Sinus noch angeschnitten werden.
Nun sollen wir das nahezu exakt nachprogrammieren.
Wir sollen dazu VisualStudio 6, MFC, SDI, FormView und GDI mit CPaintDC nutzen....fangen wir erstmal ganz einfach an...
Die Diagramme sollen nach einem Klick auf einen Toolbarbutton "Fourie Analyse" in einer Groupbox erscheinen aber auch wieder verschwinden falls dieser Button erneut angeklickt wird.
Des weiteren folgt der Phasenanschnitt dem Schieberegler.Also einmal müssen wir ja mit dem Toolbarbutton die Grafik anzeigen / löschen und mit WM_VSCROLL wird die Zeichung selbst upgedatet.
Das mit dem Updaten machen wir später, uns ist momentan erstmal Schleierhaft wie man die Zeichnung unsichtbar machen kann.
(Haben es mal mit dem Task Manager getestet, unser Prof hat die Zeichung warscheinlich wirklich nur unsichtbar gemacht da die CPU Auslastung die gleiche ist wenn wild am Regler gedreht wird... mit Anzeige des Sinus und ohne...)
Grüße
-
das wird mit Sicherheit über ShowWindow gemacht worden sein
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx
dabei entsprechend die Flags SW_SHOW und SW_HIDE benutzen
-
Hallo, ich arbeite scheinbar an der selben Klausur und habe da auch das ein oder andere Problem.
Mir ist gänzlich schleierhaft, wie das mit dem Phasenanschnitt gehen soll. Ich habe soweit alles fertig, also Sinus zeichnen (zu Fourier komme ich noch, ist aber denke ich nur Rechnerei) und er aktualisiert alles kein Problem.
Wär super, wenn da jemand nen Tipp oder noch besser ne Idee hätte, wie man das realisieren könnte. Ich hab schon sowas gelesen von wegen Wartezeit und so, aber mir fehlts an nötiger Fantasie das programmiertechnisch umzusetzen
-
na das geht über eine eigene Klasse die von CStatic abgeleitet ist und mit der Groupbox der Dialoges verbunden ist (Subclassing).
Also neue Klasse erstellen, die von CStatic ableitet, eine Membervariable auf die Goupbox im Dialog anlegen. Dann die Headerdatei der neu erstellten Klasse in der Dialogklasse includen. Bei der Membervariable der Groupbox im Dialog den Klassennamen von CStatic in den Klassennamen der neu erstellten Klasse ändern.In der neu erstellten Klasse WM_Paint überschreiben und darin die kurven oder was auch immer Zeichnen.
Im Dialog über die Membervariable der Groupbox mittels ShowWindow(...) die Groupbox Sichtbar oder Unsichtbar machen.
Vielleicht hat noch jemand nen anderen Vorschlag oder ich hab das Problem total falsch verstanden.
-
Die prinzipielle Vorgehensweise ist:
- Lege Folgende Variablen an:bool ZeichneGraph; double PhasenanschnittBegin;
In dem Button mach Folgendes:
ZeichneGraph = !ZeichneGraph; InvalidateRect(paintArea);
Bei der Reaktion auf den Schieberegler mach Folgendes:
PhasenanschnittBegin = NeuerWert * Pi; // oder so ähnlich InvalidateRect(paintArea);
Das eigentliche Zeichnen machst Du immer in WM_Paint (OnPaint)!
Dort wertest Du nur die obigen beiden Variablen aus (und natürlich was Du sonst noch brauchst...
Damit sollte es fertig sein...
-
Jochen Kalmbach schrieb:
Die prinzipielle Vorgehensweise ist:
- Lege Folgende Variablen an:bool ZeichneGraph; double PhasenanschnittBegin;
In dem Button mach Folgendes:
ZeichneGraph = !ZeichneGraph; InvalidateRect(paintArea);
Bei der Reaktion auf den Schieberegler mach Folgendes:
PhasenanschnittBegin = NeuerWert * Pi; // oder so ähnlich InvalidateRect(paintArea);
Das eigentliche Zeichnen machst Du immer in WM_Paint (OnPaint)!
Dort wertest Du nur die obigen beiden Variablen aus (und natürlich was Du sonst noch brauchst...
Damit sollte es fertig sein...Hi hab das quasi 1 zu 1 übernommen aber der gibt mir nen Fehler aus wegen dem (paintArea) was soll ich tun ich verzweifle , Danke schonmal
-
Das "paintArea" ist das Handle Deiner CStatic... kannst auch paintArea->InvalidateRect() machen...