wie oben beschrieben, lasse ich eine Vorschau mit Bitmap zeichnen. Alles was sich auf dem Panel befindet, soll eben mitgezeichnet werden und ausgedruckt.
Aktuell wird allerdings nichts mit aufgezeichnet bei der Vorschau und beim Druck selbst. Fällt irgendjemanden was auf dabei?
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
namespace Schmid_Prüfprogramm
{
public partial class Prüfprotokoll : Form
{
public Prüfprotokoll()
{
InitializeComponent();
printDocument1.OriginAtMargins = true;
printDialog1.Document = printDocument1;
pageSetupDialog1.EnableMetric = true;
pageSetupDialog1.Document = printDocument1;
printPreviewDialog1.Document = printDocument1;
/*
Schmid_PP schmid_PP = new Schmid_PP();
Schmid_PP.
lbl_DruckMessung1.Text =
*/
}
private void Prüfprotokoll_Load(object sender, EventArgs e)
{
}
private void btnPageSetup_Click(object sender, EventArgs e)
{
pageSetupDialog1.ShowDialog();
}
private void btnPagePreview_Click(object sender, EventArgs e)
{
printPreviewDialog1.Top = this.Top;
printPreviewDialog1.Width = this.Width * 2;
printPreviewDialog1.Height = this.Height * 2;
printPreviewDialog1.ShowDialog();
}
private void btnPrinterDialog_Click(object sender, EventArgs e)
{
if (printDialog1.ShowDialog() == DialogResult.OK)
{
printDocument1.Print();
}
}
private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
Bitmap bitmap = new Bitmap(this.Width, this.Height);
panel1.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height)); //<-- Hier sollte das Panel und die Controls darauf gezeichnet werden
Rectangle target = new Rectangle(0, 0, e.MarginBounds.Width, e.MarginBounds.Height);
double xScale = (double)bitmap.Width / e.MarginBounds.Width;
double yScale = (double)bitmap.Height / e.MarginBounds.Height;
if (xScale < yScale)
target.Width = (int)(xScale * target.Width / yScale);
else
target.Height = (int)(yScale * target.Height / xScale);
e.Graphics.PageUnit = GraphicsUnit.Display;
e.Graphics.DrawImage(bitmap, target);
}
}
}
Noch eine kleine Frage am Rande:
Wenn ich Daten von einer anderen Form auf diese übertragen möchte, wie stell ich das am besten an?
Dachte mir bereits: Daten aus Form1 temporär in C:\tmp ablegen und in Form2_load wieder laden.
Macht man das so oder gibt es einen einfacheren Weg?
Das mit der dritten Klasse würde mir auch sehr gefallen, allerdings habe ich keine Ahnung wie ich das umsetzen soll.
Mein Problem ist auf Form1: SerialPort + Invoke welcher mir ein Label konstant aktuell hält mit einem string. Zudem werden aus dem gesendeten Daten noch zwei weitere Werte weiter verwendet.
Ist es generell möglich, aus der Helper.cs ein Control(label) auf Form1.cs zu überschreiben bzw. zu aktualisieren?
Ist es generell möglich, aus der Helper.cs ein Control(label) auf Form1.cs zu überschreiben bzw. zu aktualisieren?
Niemand hier kennt Deinen Code und weiß was Helper.cs ist. "Ist es möglich"-Fragen können generell immer mit Ja beantwortet werden; alles eine Frage des Aufwands.
Im verlinkten Artikel ist ein Beispiel Code, wie alles geht. Anwenden musst es selbst.
Ich versuchs anderst zu erklären. Ich versuche auf Grundlage von diesem Drei-Schicht-Modell mein Projekt zu bewältigen.
Jetzt habe ich aktuell auf der Präsentationsschicht das meiste von meinem Code, insbesondere diesen hier um ein Label konstant zu füttern:
Wie könnte ich diesen Abschnitt denn auf die Logikschicht übertragen? Dazu benötige ich doch eine neue Klasse? Ich habe im Moment keinerlei Ansatz wie ich das Label auf der Form1 von der Logikschicht aus aktualisieren könnte.
Ich habe versucht mich möglichst genau auszudrücken. Ich bin dabei, die verlinkten Seiten durchzulesen. Allerdings übersehe ich dabei die "für mich wichtigen" Punkte, oder es ist nicht das wonach ich suche.
Wie könnte ich diesen Abschnitt denn auf die Logikschicht übertragen?
Gar nicht, weil die Logik die UI nicht kennen darf. Daher kann man da auch nichts übertragen. Siehe [Artikel] Drei-Schichten-Architektur
Die Logik muss wenn dann Events zur Verfügung stellen, die dann die UI abonnieren darf.
Wenn das nicht gemeint ist, dann bitte eine Frage so stellen, dass wir verstehen, was das Problem ist.
Wir haben den Code nicht vor uns.
Zweitens: der Code kann so nicht funktionieren.
Wenn der Invoke notwendig ist, dann startest die Methode erneut - aber führst trotzdem ein Label-Zugriff durch: das wird knallen.
Alles klar. Bedeutet für mich, dass manche Teile des Codes zwangsläufig in der UI bleiben.
Somit muss ich versuchen, von der Form2(Prüfprotokoll.cs) auf Form1(Schmid_PP.cs) zuzugreifen.
Vielleicht ist der Code nicht zu 100% richtig, aber auf irgendeine Weise funktioniert es
Bevor jetzt alle drauf rumhacken: Ja der Code mag nicht perfekt sein, durcheinander und unordentlich. Trotzallem funktioniert er und ich bin stolz darauf . Zudem bin ich noch nicht fertig damit und weiß, dass ich noch einiges vor mir habe
Bin für Vorschläge immer offen.
Längerfristig sollte man (häufige(re)) Änderungen/Erweiterungen/Wartbarkeit/... des Codes einplanen (deswegen auch die bereits genannte Schichtentrennung: um genau diese Aktionen (an einer (zentralen) Stelle) zu erleichtern). Um mehrere Controls anzusprechen gibt es auch einen Artikel: FAQ - Variablennmen zur Laufzeit...