Wydruk picturebox

0

Witam

Mam problem z wydrukiem zawartości pictureBox. "Narysowałem" na nim kilka linijek tekstu, ma on robić jako nalepka adresowa. I teraz wysyłam na drukarkę:

         private void button2_Click(object sender, EventArgs e)
        {
            PrintDocument printDocument1 = new PrintDocument();
            printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage);
            printDocument1.Print();
        }

        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            e.Graphics.DrawImage(pictureBox1.Image, 5, 5);
        }

Problem jest w linii

e.Graphics.DrawImage(pictureBox1.Image, 5, 5);

Kompilator krzyczy że wartość nie może być zerowa.

Może ktoś rzucić okiem na powyższe ?

0

Kompilator? Czy w trakcie działania programu i wywołania tej metody dostajesz błąd? I jaki jest konkretny komunikat błędu.

0

Tak, w trakcie kiedy wywołuję drukowanie.

System.ArgumentNullException was unhandled
HResult=-2147467261
Message=Wartość nie może być zerowa.
Nazwa parametru: image
ParamName=image
Source=System.Drawing
StackTrace:
w System.Drawing.Graphics.DrawImage(Image image, Int32 x, Int32 y)
w WindowsFormsApplication4.Form1.printDocument1_PrintPage(Object sender, PrintPageEventArgs e) w c:\users\marcin\documents\visual studio 2015\Projects\WindowsFormsApplication4\WindowsFormsApplication4\Form1.cs:wiersz 41
w System.Drawing.Printing.PrintDocument.OnPrintPage(PrintPageEventArgs e)
w System.Drawing.Printing.PrintController.PrintLoop(PrintDocument document)
w System.Drawing.Printing.PrintController.Print(PrintDocument document)
w System.Drawing.Printing.PrintDocument.Print()
w WindowsFormsApplication4.Form1.button2_Click(Object sender, EventArgs e) w c:\users\marcin\documents\visual studio 2015\Projects\WindowsFormsApplication4\WindowsFormsApplication4\Form1.cs:wiersz 36
w System.Windows.Forms.Control.OnClick(EventArgs e)
w System.Windows.Forms.Button.OnClick(EventArgs e)
w System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
w System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
w System.Windows.Forms.Control.WndProc(Message& m)
w System.Windows.Forms.ButtonBase.WndProc(Message& m)
w System.Windows.Forms.Button.WndProc(Message& m)
w System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
w System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
w System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
w System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
w System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
w WindowsFormsApplication4.Program.Main() w c:\users\marcin\documents\visual studio 2015\Projects\WindowsFormsApplication4\WindowsFormsApplication4\Program.cs:wiersz 18
w System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
w System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
w Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
w System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
w System.Threading.ThreadHelper.ThreadStart()
InnerException:

0

Najprawdopodobniej Image jest nullem i nie przypisałeś nic do niego. Możliwe, że domyślnie po utworzeniu PictureBox właściwość ta nie jest to żadna instancja tylko po prostu null.

Pokaż jak rysujesz coś na tym Image i gdzie go przypisujesz.

0

String rysuję kliknięciem buttona, pod którym jest:

        private void button1_Click(object sender, EventArgs e)
        {
            SolidBrush color = new SolidBrush(Color.Black);
            Graphics g = pictureBox1.CreateGraphics();
            Font czcionka_std = new Font("ARIAL", 12);
            Font czcionka_kod = new Font("ARIAL", 24);
            g.DrawString("Imię", czcionka_std, color, new PointF(10, 10));
            g.DrawString("Nazwisko", czcionka_kod, color, new PointF(10, 40));
        } 

I tu sądziłem że wszystko co będzie narysowane na picturebox będzie się odwzorowywało w image.

0

Niestety nie, bo to, że tworzysz instancję Graphics odnośnie PictureBox to tylko znaczy to, że rysujesz po nim, a Image przechowuje jakby faktycznie to co wyświetla PB. Tu jest cały artykuł, tak się złożyło, że mojego autorstwa o rysowaniu: http://4programmers.net/C_Sharp/Rysowanie_po_Windows_Forms
Wystarczy jak użyjesz do rysowania tego Image po uprzednim jego stworzeniu instancji.

0

Ok, poradziłem sobie z wydrukiem zawartości pictureBox. Ale nie zadowala mnie jakość, wygląda jakby było skalowaniu. A chciałbym tu umieścić kod kreskowy, a przy takiej jakości kod będzie nieczytelny.

Ma ktoś pomysł jak poradzić sobie z tym problemem ?

0

Ok, rysowanie tekstu bezpośrednio na drukarce wydaje się być najlepszym rozwiązaniem. Kompletne zero zniekształceń i pikseli jak w przypadku drukowania bitmapy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1