Mój program: Zawiera formularz z kilkoma polami tekstowymi i jednym przyciskiem. "Drukarka domyślna" jest ustawiona na moim komputerze jako Adobe PDF.Drukowanie formularza/UserControl w języku C#
Mój cel: Chcesz zrobić zrzut ekranu formularza/kontrolki użytkownika, gdy użytkownik kliknie przycisk "Drukuj". Zrzut ekranu jest następnie zapisywany na pulpicie w formacie .pdf.
Mój problem: Mam następujące dwa problemy z kodem:
- wielkość Screenshot: Rozmiar ekranu jest zbyt duża i nie pasuje do rozmiaru strony (domyślne rozmiar strony) po wydrukowaniu/konwersji do .pdf. Proszę zapoznać się z dwoma obrazkami poniżej. Chcę, aby cały zrzut ekranu pasował do strony.
- 2 Pyta dwa razy, gdzie dokonać konwersji i zapisać: Po kliknięciu przycisku "Formularz wydruku", programy pytają mnie DWÓCH miejsca, gdzie wydrukować/przekonwertować i zapisać plik. Chcę, aby program zapytał mnie tylko raz, gdzie wydrukować i zapisać plik.
Problem 1: Zrzut ekranu przechwycony przez program nie pasuje do strony po wydrukowaniu.
Chcę obraz ekranu, aby dopasować tak na jednej stronie .pdf:
Kod:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button1.Text = "Print Form";
button1.Click += new EventHandler(button1_Click);
printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage);
this.Controls.Add(button1);
}
private void button1_Click(object sender, EventArgs e)
{
CaptureScreen();
printDocument1.Print();
}
Bitmap memoryImage;
private void CaptureScreen()
{
Graphics myGraphics = this.CreateGraphics();
Size s = this.Size;
memoryImage = new Bitmap(s.Width, s.Height, myGraphics);
Graphics memoryGraphics = Graphics.FromImage(memoryImage);
memoryGraphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, s);
}
private void printDocument1_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
e.Graphics.DrawImage(memoryImage, 0, 0);
}
}
Dzięki za pomoc z góry. Jestem początkującym, uczącym się języka C#, a twoja pomoc będzie bardzo doceniana. :)
Spójrz na ten Q/A dla próbki skalowania obrazu C#: http://stackoverflow.com/questions/249587 –
Dla drugiego numeru (podwójne okno dialogowe), to tylko zgadnij, ale spróbuj usunąć ten wiersz 'printDocument1 .PrintPage + = ... 'od twojego konstruktora. Zgaduję, że to już dzieje się wewnątrz 'InitializeComponent()', co oznacza, że jawnie obsługiwać zdarzenie dwa razy. Otwórz plik Form1.Designer.cs, aby sprawdzić, czy istnieją inne rzeczy, które duplikujesz. (Z wyjątkiem wywołania Init wszystko inne w konstruktorze może być zbędne). –
@PaulSasik: Nie. W przypadku problemu 2 usunięcie tego wiersza daje mi biały plik PDF i nie można go zapisać. ._. – Smith