Windows Forms - drukowanie textBoxa

0

Cześć wszystkim.
Mam kolejny problem z Windows Forms - mam tekst wieloliniowy w textboxie textBox1 i mam, za pomocą dialogu, umożliwić drukowanie tego tekstu, który jest w tym textboxie. Jak to zrobić? Przypuszczam, że ma to być z użyciem PrintDialog, bo taki znalazłem na stronie MSDN (http://msdn.microsoft.com/pl-pl/library/system.windows.forms.printdialog.aspx), jednak nie mogę tam nic konkretnego znaleźć odnośnie wydrukowania właśnie zawartościtextBox1.
Z góry dzięki za zainteresowanie.

0

A to nie przypadkiem C# ? Ja piszę w C++. Ten kod wywala miliard błędów, próbowałem jakoś przerabiać, dodawać kwantyfikatory zakresu... Lipa :/.

0

Tak to jest c#, ale idea pozostaje ta sama. PrintDialog służy do wywołania okna wyboru drukarki. Natomiast za samo drukowanie odpowiedzialna jest klasa PrintDocument. Musisz obsłużyć zdarzenia BeginPrint, PrintPage i EndPrint.
Tutaj masz link z przykładem z msdn:
http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-2

0

Generalnie mam taki kod -> http://pastebin.com/X7vaKNpv
Chodziło mi o to (to z przykładów z MSDN), żeby zawartość textBox1 była zapisywana do zmiennej typu ^String, a następnie wysyłana do drukarki. Po kliknięciu na button6 normalnie otwiera się okienko wyboru drukarki, ale po jej wybraniu wyskakuje MessageBox z napisem "OK", klikam OK i wywala aplikację.

1

Nie widzę żebyś gdziekolwiek przypisywał coś do docToPrint, więc prawdopodobnie jest po prostu null.

0

Racja, dzięki, dodałem dwie linijki:

using namespace System::Drawing::Printing;
 
PrintDocument^ docToPrint = gcnew PrintDocument();

Teraz działa bez błędów/crashów, ale drukarka drukuje pustą stronę.
Czy instrukcje:

String^ text = textBox1->Text;
(.....)
e->Graphics->DrawString(text, printFont, System::Drawing::Brushes::Black, 10, 10 );

nie powinny powodować drukowania właśnie zawartości textBox1?

0

A funkcja document_PrintPage w ogóle wykonuje się? bo z tego kodu co widzę, to nigdzie nie jest wywoływana...
Powinna być podana obiektowi docToPrint jako jego zdarzenie PrintPage.

Za mało starasz się zrozumieć, a za dużo polegasz na metodzie Copy'ego-Paste'a...

0

No nie wiem, tworzę to wszystko po prostu korzystając z przykładów z MSDN, z których połowa nie działa. Gdyby była jakaś literatura czy konkretna strona na te tematy, chętnie bym się tego nauczył. C# jednak nie znam w ogóle i ciężko mi tłumaczyć przykłady na nim oparte na C++. A program muszę zrobić i tyle, więcej nie chcę mieć nic wspólnego z Windows Forms z użyciem C++/CLI.
No trudno, nie wiem co masz na myśli mówiąc " Powinna być podana obiektowi docToPrint jako jego zdarzenie PrintPage."... Fakt, nie jest nigdzie wywoływana, próbowałem napisać takie wywołanie dla obiektu docToPrint jak wspomniałeś: document_PrintPage(docToPrint, ) - nie wiem jednak co podać jako drugi argument.

1
docToPrint->PrintPage += gcnew PrintPageEventHandler(this, &Form1::document_PrintPage);

albo coś tego typu.

0

Azarien, wielkie dzięki ! Dokładnie o to chodziło, teraz ładnie drukuje :).
Tak więc, na koniec, dla potomnych: poniżej przykładowy kod, aby wysłać do drukarki zawartość textBox1 (w tym przypadku po kliknięciu na button6):

// DRUKOWANIEEEEEE
// Declare the PrintDocument object.
System::Drawing::Printing::PrintDocument^ docToPrint;

// This method will set properties on the PrintDialog object and
// then display the dialog.
void button6_Click( System::Object^ /*sender*/, System::EventArgs^ /*e*/ )
{
	
   // Allow the user to choose the page range he or she would
   // like to print.
   printDialog1->AllowSomePages = true;

   // Show the help button.
   printDialog1->ShowHelp = true;

   // Set the Document property to the PrintDocument for 
   // which the PrintPage Event has been handled. To display the
   // dialog, either this property or the PrinterSettings property 
   // must be set 
   PrintDocument^ docToPrint = gcnew PrintDocument();
   printDialog1->Document = docToPrint;
  

   ;
   ;
   

   ;
   ;
   System::Windows::Forms::DialogResult result = printDialog1->ShowDialog();
   System::Windows::Forms::MessageBox::Show( result.ToString() );
   docToPrint->PrintPage += gcnew PrintPageEventHandler(this, &Form1::document_PrintPage);
   ;
   ;

   // If the result is OK then print the document.
   if ( result == System::Windows::Forms::DialogResult::OK )
   {
      docToPrint->Print();
	  
   }

}

// The PrintDialog will print the document
// by handling the document's PrintPage event.
void document_PrintPage( Object^ /*sender*/, System::Drawing::Printing::PrintPageEventArgs^ e )
{
   // Insert code to render the page here.
   // This code will be called when the control is drawn.
   // The following code will render a simple
   // message on the printed document.
   String^ text = textBox1->Text;
   System::Drawing::Font^ printFont = gcnew System::Drawing::Font( "Arial",35,System::Drawing::FontStyle::Regular );

   // Draw the content.
   e->Graphics->DrawString(text, printFont, System::Drawing::Brushes::Black, 10, 10 );
}


// KONIEC DRUKOWANIA
0

Witam,
Drukowania z jednego textboxa jest pełno, ale z dwóch czy więcej już nie koniecznie ( a może po prostu kiepsko szukam). Może znajdzie się Ktoś kto na podstawie tego kodu powie mi jak dodać kolejny textbox do druku żeby drukował się pod tym pierwszym. Z góry dzięki

0

Przyjrzyj się funkcji document_PrintPage. Tam nie ma żadnej magji.

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