2017-01-29 3 views
1

Ich arbeite mit einem Restaurant Rechnung Druck-Software.Eine Quittung mit WinForms-Anwendung formatieren

Ich habe eine Quittung entwickelt. aber sie sehen nicht wirklich wie eine Quittung aus.

Ich habe eine Lösung von CodeProject gefolgt. Hier ist mein Code zum Erstellen einer Quittung:

//Get the Graphics object 
     Graphics g = printTextEvArgs.Graphics; 

     //Create a font Arial with size 16 
     Font font = new Font("Arial", 10); 
     float fontHeight = font.GetHeight(); 
     string underLine = "------------------------------------------"; 

     int startX = 10; 
     int startY = 10; 
     int offset = 40; 

     //Create a solid brush with black color 
     SolidBrush brush = new SolidBrush(Color.Black); 
     if (RecieptType == "ktcprinter") 
     { 
     } 
     else if (RecieptType == "billprinter") 
     { 
      g.DrawString(restaurantInfo.name, new Font("Courier New", 16), new SolidBrush(Color.Black), startX, startY); 
      offset = offset + (int)fontHeight + 20; 

      var wc = new WebClient(); 
      Image imgFromUrl = Image.FromStream(wc.OpenRead(b.restaurant_info.logo)); 
      g.DrawImage(imgFromUrl, 60, 40, 150, 100); 

      offset = offset + (int)fontHeight + 50; 

      g.DrawString("Address: " + restaurantInfo.address, new Font("Courier New", 12), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + (int)fontHeight + 5; 
      g.DrawString("Phone: " + restaurantInfo.phone, new Font("Courier New", 12), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + (int)fontHeight + 5; 
      g.DrawString("Vat Reg. No.: " + restaurantInfo.vat_reg_no, new Font("Courier New", 12), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + (int)fontHeight + 5; 
      g.DrawString("Served By: " + employeeInfo.served_by, new Font("Courier New", 12), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + 13; 
      g.DrawString(underLine, new Font("Courier New", 12), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + 13; 

      foreach (var item in b.items) 
      { 
       string menuTitle = item.menu_title + item.quantity + item.price; 
       g.DrawString(menuTitle, new Font("Courier New", 10), new SolidBrush(Color.Black), startX, startY + offset); 
       offset = offset + (int)fontHeight + 5; 
      } 

      //Get UnderLine 
      offset = offset - 8; 
      g.DrawString(underLine, new Font("Courier New", 12), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + 15; 

      g.DrawString("Sub Total: " + calculation.sub_total, new Font("Courier New", 10), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + (int)fontHeight + 5; 
      g.DrawString("Discount: " + calculation.discount, new Font("Courier New", 10), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + (int)fontHeight + 5;     
      g.DrawString("Vat: " + calculation.vat, new Font("Courier New", 10), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + (int)fontHeight + 5; 
      g.DrawString("Service Charge: " + calculation.service_charge, new Font("Courier New", 10), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + (int)fontHeight + 5; 
      g.DrawString("Delivery Charge: " + calculation.delivery_charge, new Font("Courier New", 10), new SolidBrush(Color.Black), startX, startY + offset); 

      //Get UnderLine 
      offset = offset + 12; 
      g.DrawString(underLine, new Font("Courier New", 12), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + 12; 

      g.DrawString("Total: " + calculation.total.PadRight(30), new Font("Courier New", 10), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + (int)fontHeight + 5; 

      //Get UnderLine 
      offset = offset - 11; 
      g.DrawString(underLine, new Font("Courier New", 12), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + 13; 


      foreach (var item in b.payments) 
      { 
       string paymentMethod = item.method + item.amount; 
       g.DrawString(paymentMethod, new Font("Courier New", 10), new SolidBrush(Color.Black), startX, startY + offset); 
       offset = offset + (int)fontHeight + 5; 
      } 

      g.DrawString("Change: " + calculation.change, new Font("Courier New", 10), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + (int)fontHeight + 5; 
      g.DrawString("Pay Tip: " + calculation.pay_tip, new Font("Courier New", 10), new SolidBrush(Color.Black), startX, startY + offset); 
      offset = offset + (int)fontHeight + 5; 
      offset = offset + 20; 

      //offset = offset + 20; 
      //g.DrawString("Total To Pay".PadRight(30) + string.Format("{0:c}"), variable, font, new SolidBrush(Color.Black), startX, startY + offset); 
     } 

     //Draw "Hello Printer!"; 
     //new Rectangle(margin X, margin Y, Width, Height) 
     //g.DrawString(printString.ToString(), 
     //font, brush, new Rectangle(5, 0, 350, 500)); 
    } 

Was ich habe, ist wie das Bild unten. Ich möchte es wie eine echte Quittung machen.

Die Mengen müssen in einer Spalte und der Preis in einer anderen Spalte sein.

(Man beachte, dass die Lösung, die ich für sie perfekt gefolgt gearbeitet.)

Mein Ausgang zur Zeit:

enter image description here

+0

Um Spalten zu erstellen, müssen Sie einfach die verschiedenen Artikel an festen x-Positionen in derselben Zeile drucken. Oder: Da Sie eine feste Schriftart verwenden, können Sie auch den linken Teil mit Leerzeichen auf eine bestimmte Anzahl von Zeichen auffüllen. - Außerdem: Ich schlage vor, dass Sie sich beim Formatieren Ihrer Frage etwas mehr Mühe geben, wenn Sie nach Formatierung fragen. – TaW

Antwort

0

Wenn Sie mit einer festen Schriftart gehen wollen, wie Courier oder Consolas, Ihr Problem kann einfach gelöst werden Padding der linke Teil jeder Zeile auf eine bestimmte Länge mit Leerzeichen.

Der nächste Schritt besteht darin, den rechten Teil so aufzufüllen, dass die Zahlen rechtsbündig sind.

Dazu Sie am besten schreiben eine kleine Funktion Helfer:

string alignedNumber(decimal number, int length) 
{ 
    return ("$" + number).PadLeft(length, ' '); 
} 

So schreiben Sie:

g.DrawString("Change: ".PadRight(25, ' ') + alignedNumber(price, 8)...); 

..für alle Ihre Ausgabe mit Spalten. (Wählen Sie Ihre eigenen Zahlen!)

Wenn Sie sich für eine proportionale Schriftart entscheiden, müssen Sie separate DrawString Aufrufe für die Position schreiben und den x-Offset für jede Position festlegen. Für die richtige Ausrichtung müssten Sie auch messen die Breite der Zahl Strings haben Graphics.MeasureString. Siehe here for an example

+0

Danke Bruder. Es funktioniert perfekt. Theres noch etwas, was ich wissen wollte. Ich füge PadRight auf suppose menuTitle hinzu. Wenn der Menütitel die Pad-Größe überschreitet, befinden sich diese zusätzlichen Wörter in einer neuen Zeile? –

+0

Nein. Standardmäßig wird alles, was Sie so zeichnen, vom Pad rutschen und verloren gehen. Sie können entweder die Zeichen (für eine feste Schriftart) zählen und die Daten in zwei Zeilen aufteilen oder eine der [DrawString-Überladung] verwenden (https://msdn.microsoft.com/en-us/library/21kdfbzs%28v=vs. 110% 29.aspx), die ein begrenzendes Rechteck nehmen. Verwenden Sie Graphics.MeasureString, um vor dem Zeichnen zu messen, damit Sie die resultierende Höhe kennen !!! - Wenn Sie mit einer Antwort zufrieden sind, beachten Sie bitte [akzeptieren] (http://stackoverflow.com/help/accepted-answer) it ..! – TaW

+0

Entschuldigung Bruder Ich kannte den Prozess der Annahme nicht. Jetzt habe ich die Antwort akzeptiert, da dies mir sehr geholfen hat. BTW, Bruder, wenn es irgendein Tutorial oder etwas für das "spaltet die Daten in zwei Linien" Problem, das mir helfen könnte, bitte schlagen Sie mich vor. Ich werde sehr dankbar sein. und natürlich, Sir, wenn diese Frage nützlich ist, stimmen Sie bitte das ab. und nochmals danke –