PDA

View Full Version : چاپ یک فورم با تمام شی های داخل ان؟



rezarko
دوشنبه 29 اسفند 1390, 15:27 عصر
سلام.من یه برنامه ساختم که میخوام وقتی روی دکمه "پرینت" کلیک میکنن تنظیمات پرینتر (انتخاب پرینتر) رو نشون بده و فورم2 رو چاپ کنه.

abdullah20
دوشنبه 29 اسفند 1390, 17:34 عصر
http://www.c-sharpcorner.com/UploadFile/srajlaxmi/printing-windows-form-in-C-Sharp-net/

rezarko
دوشنبه 29 اسفند 1390, 21:43 عصر
نمیشه خودتون کدشو بزارین اخه من تازه با سی شارپ اشنا شدم و از این ادرسی که داده بودید چیزی نفهمیدم

abdullah20
سه شنبه 01 فروردین 1391, 10:13 صبح
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private PrintDocument printDocument1 = new PrintDocument();
public Form1()
{
printDocument1.PrintPage += new PrintPageEventHandler(printDocument2_PrintPage);
InitializeComponent();
}

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 button1_Click(object sender, EventArgs e)
{
CaptureScreen();
printDocument1.Print();
}

private void printDocument2_PrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.DrawImage(memoryImage, 0, 0);
}
}
}

rezarko
سه شنبه 01 فروردین 1391, 15:44 عصر
اگه بخوام فقط داخل فرم پرینت بشه باید چیکار کنم ؟ اخه این کد حاشیه هایدور فورم رو (علامت خروج و...) هم پرینت میکنه

abdullah20
سه شنبه 01 فروردین 1391, 18:21 عصر
خوب موقع پرینت خاصیت controlBax فرم را false کن

rezarko
سه شنبه 01 فروردین 1391, 22:37 عصر
84495


میخوام اگه بشه حاشیه های دور فورم هم حذف بشه

gsearch
سه شنبه 01 فروردین 1391, 23:04 عصر
دوست عزیز
سایزش رو تنظیم کن.
این خط رو
memoryGraphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, s);
مثلا اینجوری بنویس
memoryGraphics.CopyFromScreen(this.Location.X + 5, this.Location.Y + 10, 0, 0, s);
البته s رو هم باید مقدار مناسب بدی.

rezarko
پنج شنبه 03 فروردین 1391, 02:03 صبح
اگر بخوام یه فورم دیگه رو چاپ کنم چه جوریه ؟ به جای this نوشتم form2 ولی error داد

gsearch
پنج شنبه 03 فروردین 1391, 02:32 صبح
اگه می خوای توی یه فرم، فرم دیگه ای رو چاپ کنی،
باید مکان و اندازه نمونه ایجاد شده از فرم رو داشته باشی.
برای این کار می تونی توی فرم اصلی متغییری برای ارجاع به فرم دوم تعریف کنی و از اسم اون متغییر به جای this استفاده کنی
یا اینکه به شکل زیر به هش ارجاع بدی
Application.OpenForms["Form2"].CreateGraphics();

موفق باشی.

rezarko
پنج شنبه 03 فروردین 1391, 02:45 صبح
ممنون
میشه یه مثال بزنید؟:خجالت:

gsearch
پنج شنبه 03 فروردین 1391, 03:17 صبح
توی همون مثال قبلی که دوستمون زد شما تابع CaptureScreen رو اینجوری بنویس:
private void CaptureScreen(Form formObj)
{
Graphics myGraphics = formObj.CreateGraphics();
Size s = formObj.Size;
memoryImage = new Bitmap(s.Width, s.Height, myGraphics);
Graphics memoryGraphics = Graphics.FromImage(memoryImage);
memoryGraphics.CopyFromScreen(formObj.Location.X, formObj.Location.Y, 0, 0, s);
}
بعد می تونی به این صورت صدا بزنیش
private void printForm()
{
Form2 f2 = new Form2();
f2.Show();
CaptureScreen(f2);
printDocument1.Print();
}
البته شما می تونی فرم دوم رو هرجایی قبلا ایجاد کرده باشی فقط باید به شیئ ایجاد شده دسترسی داشته باشی.(مثلا به صورت یک فیلد خصوصی تو فرم اصلی تعریف کنی)
بعد شیئ رو به تابع پاس میدی تا بر اساس مختصات اون تصویر رو برای پرینت ایجاد کنه.

راه دوم: می تونی از طریق کلاس Application به فرم های باز شده دسترسی داشته باشی. دیگه نیازی به متغییری که به فرم مورد نظر اشاره کنه، نداری.
به این صورت:
یه جایی یک شیئ از Form2 ساختی
new Form2().Show();
حالا می یای اون فرم رو چاپ می کنی
private void printForm()
{
CaptureScreen(Application.OpenForms["Form2"]);
printDocument1.Print();
}

rezarko
پنج شنبه 03 فروردین 1391, 03:45 صبح
ممنون دوست عزیز

rezarko
پنج شنبه 03 فروردین 1391, 17:10 عصر
متاسفانه باز هم نمیشه .

gsearch
پنج شنبه 03 فروردین 1391, 19:53 عصر
برای پرینت یک فرم، باید روی صفحه قابل رویت باشه و چیزی روش قرار نگرفته باشه.
چون شما در این روش دارین print screen انجام میدید.
برای چاپ اطلاعات، کمتر از پرینت فرم استفاده می شه.

برای چاپ داده ها می تونی از ابزارهای گزارشگیری استفاده کنی.
در کل دلیل چاپ فرم رو توضیح بدین، بهتر می شه کمکتون کرد.

rezarko
پنج شنبه 03 فروردین 1391, 20:33 عصر
تره فکر کنم اگه از panel استفاده کنم و panel رو پرینت کنم بهتره چون من توی Vb.net هم همین کارو میکردم اما با سی شارپ نمیتونم panel رو چاپ کنم ممنون میشم راهنمایی کنید