Visual Studio nimmt mir die Arbeit weg?

Hallo,

ich arbeite mit Visual Studio und bin gerade dabei, eine Testaufgabe zum malen zu bearbeiten.

Ich habe einen Dialog und dort ein Static Text Feld wo ich drauf malen möchte (In dem Static feld).

Ich habe jetzt aber das Problem,dass mir Visual Studio irgendwie schon die Vorarbeit genommen hat… Irgendwo ist das jetzt schon geschrieben,aber ich wollte das selbst schreiben, damit ich weiß wie das alles funktioniert.

Es geht nämlich „schon“ folgendes:

Ich drücke die Maustaste in dem Static Feld und ich fange an einen Strich zu zeichnen. Jetzt Zeichne ich bis zum linken Rand des Static Felds und gehe mit dem Mauszeiger links aus dem Static Feld raus (male immer noch bzw. drücke die Maustaste) und komme von unten oder oben im static Feld wieder rein (die ganze zeit immer die Maustaste gedrückt), dann malt er aber immer noch! Also er malt außerhalb des Staticfensters weiter, aber normalerweise ist solch eine Funktionalität ja nicht gegeben. Genau wie, wenn ich etwas gemalt habe, schiebe ich ein anderes Fenster über mein Maldialog und zieh es wieder weg: Das gemalte bleibt.

Das heißt, er rekronstruiert das gemalte,aber das soll er doch „noch“ garnicht!? Ich soll hier nämlich mit Funktionen wie SetCapture oder ReleaseCapture arbeiten,aber das erübrigt sicht ja,wenn es schon vorher funktioniert.

Ich habe für mein Static extra eine Klasse gebaut,diese von CStatic abgeleitet. Ich habe die Funktionen für Mausdrücken,Mausdrücken loslassen und OnMouseMove überschrieben. Aber warum macht er das denn trotzdem noch? Weiß jemand was ich noch überschreiben müsste,damit diese Funktionalität nicht mehr gegeben ist und ich es selbst programieren kann? Sonst macht meine Testaufgabe wenig Sinn :confused: Wäre für jede Anregung dankbar!

Hallo Keozor

Ich habe jetzt aber das Problem,dass mir Visual Studio
irgendwie schon die Vorarbeit genommen hat… Irgendwo ist das
jetzt schon geschrieben,

Ja, im Quelltext der Lib. Das ist der Sinn von Libs: alles schon fertig da, braucht man nur zu verwenden. Manchmal ist es gut, den Code mal anzusehen (ev. mit dem Debugger), damit man weiss, was da gespielt wird, und wie die das gemacht haben.

aber ich wollte das selbst schreiben,
damit ich weiß wie das alles funktioniert.

Das ist die Altenative: Du lernst das WIN-GDI und schreibst Dir eine eigene Canvas-Klasse. Das macht schon Mühe und ist ein Aufwand, Du steigst dann aber wirklich durch, und ausser Dir bestimmt da Keiner was.

rein (die ganze zeit immer die Maustaste gedrückt), dann malt
er aber immer noch! Also er malt außerhalb des Staticfensters
weiter,

Da fehlt ein Clipping, d.h. man kann den Bereich, in dem gemalt wird auf ein Rechteck oder ein Polygon beschränken. Da muss es eine Funktion geben, mit der man das setzen kann (den Bereich übergeben).

Ich soll hier nämlich mit Funktionen wie
SetCapture oder ReleaseCapture arbeiten,

Du sollst das, bist Du da ganz sicher?

aber das erübrigt
sicht ja,wenn es schon vorher funktioniert.

Wenn es ohnehin funktioniert, braucht man sich nicht darum kümmern. Er aktualisiert das Bild, weil das in der Lib so drin steht.

… Aber warum macht er das denn trotzdem noch?

Das steht im Code der Lib drin.

Weiß jemand was ich noch überschreiben müsste,damit diese
Funktionalität nicht mehr gegeben ist und ich es selbst
programieren kann?

Kann ich Dir nicht sagen, da ich die Lib selbt nicht verwende, aber s.o… Was Dir fehlt ist IMHO die Basisklasse mit der Liste von Funktionen. Da suchst Du Dir die raus, die vermutlich „Schuld“ hat, dann kannst Du die überschreiben.

Wäre für jede Anregung dankbar!

Bitte gerne!

lG
Martin B

Ok,danke für deine Antwort! Ich werde mal schauen was sich da machen lässt :smile:

Nochmal eine Frage
Hallo,ich hab nochmal ne Frage.

Ich hab das Fenster jetzt so wie ich es haben wollte, malen kann ich auch usw.

Nun habe ich aber einen kleinen „Schönheitsfehler“.

Wenn man nämlich ein Fenster über meinen Dialog schiebt und dann wieder wegzieht, dann „ruckelt“ das andere Fenster sich weg,weil ich jeden Milimeter meinen Zeichenbereich neu zeichne (rekonstruiere) so gesehen. Man „spürt“ sprichwörtlich meine for-Schleife.

Wie könnte ich das umgehen?

Evtl. den Dialog bzw. den Zeichenbereich woanders neuzeichnen und dann in meinen Dialog laden oder sowas?

Wäre für jeden Tipp Dankbar!

Gruß

Hallo Keozor

Ich hab das Fenster jetzt so wie ich es haben wollte, malen
kann ich auch usw.

Na also.

Nun habe ich aber einen kleinen „Schönheitsfehler“.

Das kriegen wir auch noch hin, :wink:

Wenn man nämlich ein Fenster über meinen Dialog schiebt und
dann wieder wegzieht, dann „ruckelt“ das andere Fenster sich
weg,weil ich jeden Milimeter meinen Zeichenbereich neu zeichne
(rekonstruiere) so gesehen. Man „spürt“ sprichwörtlich meine
for-Schleife.

Hast Du vielleicht eine Schleife, die jedes einzelne Pixel setzt? Wenn ja, ist das wohl der Grund, das kann man allenfalls im Briefmarkenformat machen, bei grösseren Bereichen wird’s brenzlig.

Wie könnte ich das umgehen?

Evtl. den Dialog bzw. den Zeichenbereich woanders neuzeichnen
und dann in meinen Dialog laden oder sowas?

Genau: eine Klasse finden, die eine Speicher-Bitmap anlegt, die wird dann durch die Ereignisse (Maus, etc.) laufend bemalt. Wenn das Fenster dann zu aktualisieren ist, wird das bloss kopiert von dieser (mit BitBlt() o.Ä.), das geht erheblich flotter und vermeidet auch das Flackern (engl. „flickering“) bei Animationen.

Wäre für jeden Tipp Dankbar!

Bitte gern.

lG
Martin B