CFormView mit Bildlaufleiste zeichnen und drucken
-
Hallo,
ich zeichne in einer CFormView mit TextOut, LineTo usw. Die Form ist aber so groß, das man scrollen muss. Da hab ich nun das Problem, das die gezeichneten Wörter und Linien nicht oder nur bescheiden beim scrollen neu gezeichnet werden. Außerdem ist die Positionierung der Zeichen schwierig, da immer die obere linke ecke als 0-Punkt genommen wird, selbst wenn runtergescrollt wurde. GetClientRect liefert nur den sichtbaren Bereich zurück und GetClientOffset ist hierfür nicht verfügbar. Zur Zeit zeichne ich bei OnPaint().
Währe da ein Timer angebracht um ständig neu zu zeichnen oder wie kann ich es einrichten, das die Zeichnung nach dem hoch oder runtersrollen neu gezeichnet wird?
Wie kann man die Ausgaben eindeutig Positionieren?Bei Codeproject.com gibt es ein Beispiel zum Drucken der Formview:
http://www.codeproject.com/KB/printing/printformview.aspx
Da kann man aber nur den sichtbaren Bereich drucken. Wenn etwas verdeckt ist wird es nicht gedruckt.
Wie kann man den ganzen Bereich ausdrucken?Danke
Micha
-
1. Du solltest nicht in ein CFormView direkt zeichnen. Du solltest Dir en eigenes Child Window aufbauen und in dieses Zeichnen.
2. Schau Dir mal die Member von CScrollView an und PrepareDC! VIelleicht wird Dir dann klar wie CScrollView mit gerollten Ansichten und den Koordinaten umgeht. Als Tutorial kann ich hier immer wieder nur Scribble empfehlen...
-
Hallo Martin,
danke für deine Tipps.
Ich hab bei codeproject wieder mal ein passendes Beispiel zu CScrollView gefunden: http://www.codeproject.com/KB/docview/cscrollview.aspx
Aber wo schreibt man denn da die TextOut's rein? wenn ichs in OnPaint mache habe ich das gleiche Problem wie in FormView. Mit dem bestimmten Member bei ScrollView meinst du wohl FillOutsideRect?! Wenn obiges Problem geklärt ist werde ich mich damit mal beschäftigen. Zu PrepareDC hab ich nichts gefunden und mit der 'normalen' Prepare kann ich (noch) nichts anfangen.
Scibble ist das Code-Beispiel bei VS? Das Beispiel ist so schlecht nicht, nur beim verkleinern der Ansicht erscheinen keine Scrollbalken, der Projekttyp ist mir auch nicht vertraut.
Also leichte Frage: Wo schreibe ich das Textout am besten rein?Micha
-
Bitte versuch das Scribble Tutorial zu versehen. Dann erübrigt sich Dein Fragen!
-
Ich denke ich hab die Probleme jetzt gelöst. ein Projekt mit ScrollView zu erstellen hat gleich einige andere Probleme mit erschlagen. Danke für den Tipp. Mal noch ne Frage zur Druckvorschau bzw. den Ausdruck:
Sie wird automatisch erstellt und die Pixel der Texte werden scheinbar auch auf die aktuelle Druckereinstellung umgerechnet. Nun hab ich bisher die TextOut mit Konstanten x und y versehen. Der Zwischenraum zwischen den untereinanderstehenden Textouts - ich nenn ihn mal dy - wird hier aber nicht umgerechnet und bei einer hohen Druckerauflösung liegen die Textouts dann fast übereinander.
Ich hab in einem Beispielprojekt mal die Berechnung des dy mit einer Funktion gesehen, welche die Größe der Schrift wiedergab und dann direkt unter dem ersten Textout das nächste dranngehangen hat. GetFontSize war es aber nicht.
Weißt du wie diese Funktion heißt? Damit müsste ich doch das Druck(Vorschau)Problem lösen können, oder?Micha
-
Hast Du verstanden was Device Points sind und was Logical Points sind?
Weißt Du was DPtoLP und LPtoDP tun?Wenn nicht, hast Du jetzt neuen Lesestoff!

-
Du hast sicherlich mitbekommen, das ich ein Anfänger bin. Wenn die Funktion sowas machen würde, wie MyDC->LPtoDP(MyMonitorView) könnt ich das ja noch hinbekommen aber man muss noch soviel drumrum machen von dem man auch nur ganz rudimentär was versteht. Klar, ich könnte mich jetzt für ein Informatikstudium einschreiben, doch die Zeit hab ich nicht. Ich lerne am besten durch Beispiele. Das Problem, was ich habe, haben ja hunderte andere Programmierer vor mir schon gehabt und ich versteh nicht, warum man nicht eine Funktion schreibt, damit das Anpassen an den Ausdruck zum Einzeiler wird.
Ich habe das Problem erstmal so gemildert, das ich von dem View ein Bild mache und das an den DC(?) gebe. Codeproject war da mal wieder sehr hilfreich (http://www.codeproject.com/KB/printing/printformview.aspx) Die Druckvorschau wird nur noch nicht auf A4 angepaßt, doch ist der Ausdruck gleich bei jeder Auflösung.
Es hat sich jetzt aber gezeigt, das der View (das Zeichnen dessen) beim Rollen doch wieder Probleme macht: Ich Zeichne bei OnDraw() und beim Scrollen verschwindet das Bild, wird unregelmäßig neu gezeichnet (z.T. auch abhängig von Scrollgeschwindigkeit)usw. Die Platzierung erfolgt wieder vom Client-Fenster aus, nicht vom ScrollView. Kann man sowas wie GetClientOffset in eine CSrollView Klasse reinbauen?
Wo kann man einstellen, das erst bei loslassen der Scrollbar neu gezeichnet wird?Micha