PDA

View Full Version : پرینت از فرمی که اسکرول داره



h_m0zhdeh
دوشنبه 18 دی 1391, 19:30 عصر
با سلام
من می خوام از یه فرمم که اسکرول داره و تقریبا به اندازه 3 تا صفحه A4 هست یه پرینت بگیرم
ولی هر کدی که می نویسم یا سرچ می کنم فرم رو طوری پرینت می کنه که همه صفحه دیده نمیشه و هر قسمت از صفحه که دیده میشه تو پرینت مشخص میشه:ناراحت:
در حالی که من می خوام این فرمم در سه صفحه پشت سر هم به پرینتر فرستاده بشه
(این سایتو با سایت Codeproject و زیرو رو کردم ولی همه کدها همین مشکل رو داره)

من چیکار کنم؟؟؟؟؟؟؟؟:گریه:

لطفا اگه یه sanple دارید برام بگذارید

the king
دوشنبه 18 دی 1391, 23:12 عصر
با سلام
من می خوام از یه فرمم که اسکرول داره و تقریبا به اندازه 3 تا صفحه A4 هست یه پرینت بگیرم
ولی هر کدی که می نویسم یا سرچ می کنم فرم رو طوری پرینت می کنه که همه صفحه دیده نمیشه و هر قسمت از صفحه که دیده میشه تو پرینت مشخص میشه:ناراحت:
در حالی که من می خوام این فرمم در سه صفحه پشت سر هم به پرینتر فرستاده بشه
(این سایتو با سایت Codeproject و زیرو رو کردم ولی همه کدها همین مشکل رو داره)

من چیکار کنم؟؟؟؟؟؟؟؟:گریه:

لطفا اگه یه sanple دارید برام بگذارید
کاری ندارم که فرم تون چقدر درازه، فقط اول یک کنترل از نوع Panel روی فرم تان اضافه کنید به اسم panel1 و هر چه خرت و پرت داخل فرم تان داشتید
منتقل کنید به داخل این panel1، طوری که اگه این panel1 رو جابجا کنید همه کنترل هایی که داشتید هم باهاش جابجا شوند.

کد زیر هوشمنده، خودش حساب می کنه که چاپ کردن محتویات panel1 با توجه به تنظیمات چاپگر چند صفحه لازم داره.
اینا رو قبل از کد کلاس فرم تون ابتدای فایل اضافه کنید :


using System.Runtime.InteropServices;
using System.Drawing.Printing;


اینا رو داخل کلاس فرم تان همان ابتدایش اضافه کنید :


private const int WM_PRINT = 0x317;
private const int PRF_CHILDREN = 0x10;
private const int PRF_CLIENT = 0x4;
private const int PRF_NONCLIENT = 0x2;
private const int PRF_OWNED = 0x20;

[DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);

private Bitmap bmp;
private int y;

void doc_PrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.PageUnit = GraphicsUnit.Display;
e.Graphics.Clip = new Region(e.MarginBounds);
e.Graphics.PageUnit = GraphicsUnit.Pixel;
float factorSrc = e.Graphics.ClipBounds.Height / e.Graphics.ClipBounds.Width;
int height = (int)Math.Min((float)bmp.Width * factorSrc, bmp.Height - y);
float factor = (float)height / ((float)bmp.Width * factorSrc);
RectangleF src = new RectangleF(0, y, bmp.Width, height);
RectangleF dst = e.Graphics.ClipBounds;
dst.Height *= factor;
e.Graphics.DrawImage(bmp, dst, src, GraphicsUnit.Pixel);
y += height;
e.HasMorePages = (y < bmp.Height);
}


اینا رو هم هر جایی که می خواهید فرم چاپ بشه :


bmp = new Bitmap(panel1.Width, panel1.Height);
y = 0;
using (Graphics g = Graphics.FromImage(bmp))
{
IntPtr hDC = g.GetHdc();
SendMessage(panel1.Handle.ToInt32(), WM_PRINT, hDC.ToInt32(), PRF_CHILDREN | PRF_CLIENT | PRF_NONCLIENT | PRF_OWNED);
g.ReleaseHdc(hDC);
}
PrintDocument doc = new PrintDocument();
doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
doc.Print();

h_m0zhdeh
سه شنبه 19 دی 1391, 08:16 صبح
ممنون از اینکه اینقدر سریع، دقیق و بی ابهام توضیح دادید:قلب:

h_m0zhdeh
سه شنبه 19 دی 1391, 11:33 صبح
چطوری می تونم تو همه صفحه ها که برای پرینت فرستاده میشه یه Header & Footer اعمال کنم؟
(من می خوام تو همه صفحه هایی که به پرینتر می فرستم لوگوی و آدرس و تلفن کاربرم که از یه جدول می خونه باشه)
ولی اینجوری Header تو صفحه اول و Footer هم تو صفحه آخر می یاد:ناراحت:
لطفا منو راهنمایی کنید

the king
چهارشنبه 20 دی 1391, 06:40 صبح
چطوری می تونم تو همه صفحه ها که برای پرینت فرستاده میشه یه Header & Footer اعمال کنم؟
(من می خوام تو همه صفحه هایی که به پرینتر می فرستم لوگوی و آدرس و تلفن کاربرم که از یه جدول می خونه باشه)
ولی اینجوری Header تو صفحه اول و Footer هم تو صفحه آخر می یاد:ناراحت:
لطفا منو راهنمایی کنید

بجز اون کد بخش void doc_PrintPage که موقع چاپ شدن هر کدام از صفحات یکبار اجرا میشه به بقیه بخش های کد کاری نداریم و بدون تغییر می مانند.
ما اول یک کمی از ابعاد تکه ای که چاپ میشه کم می کنیم تا جا برای Header و Footer باز شود و بعد از چاپ تصویر اون تکه بالا و پایین اش
متن اضافه می کنیم :


void doc_PrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.PageUnit = GraphicsUnit.Display;
e.Graphics.Clip = new Region(e.MarginBounds);
e.Graphics.PageUnit = GraphicsUnit.Pixel;
float factorSrc = e.Graphics.ClipBounds.Height / e.Graphics.ClipBounds.Width;
int height = (int)Math.Min((float)bmp.Width * factorSrc * 0.90f, bmp.Height - y) + 1;
float factor = (float)height / ((float)bmp.Width * factorSrc);
RectangleF src = new RectangleF(0, y, bmp.Width, height);
RectangleF dst = e.Graphics.ClipBounds;
dst.Y += dst.Height * 0.05f;
dst.Height *= factor;
e.Graphics.DrawImage(bmp, dst, src, GraphicsUnit.Pixel);
Image yourLogo = this.Icon.ToBitmap();
RectangleF logoRect = new RectangleF(e.Graphics.ClipBounds.X, e.Graphics.ClipBounds.Y
, e.Graphics.ClipBounds.Width * 0.08f, e.Graphics.ClipBounds.Width * 0.08f);
e.Graphics.DrawImage(yourLogo, logoRect);
Font f = new Font("Tahoma", 10, FontStyle.Bold, GraphicsUnit.Point);
StringFormat format = new StringFormat();
format.LineAlignment = StringAlignment.Near;
format.Alignment = StringAlignment.Near;
e.Graphics.DrawString("<Header Left>", f, Brushes.Black, e.Graphics.ClipBounds, format);
format.Alignment = StringAlignment.Center;
e.Graphics.DrawString("<Header Center>", f, Brushes.Black, e.Graphics.ClipBounds, format);
format.Alignment = StringAlignment.Far;
e.Graphics.DrawString("<Header Right>", f, Brushes.Black, e.Graphics.ClipBounds, format);
format.LineAlignment = StringAlignment.Far;
format.Alignment = StringAlignment.Near;
e.Graphics.DrawString("<Footer Left>", f, Brushes.Black, e.Graphics.ClipBounds, format);
format.Alignment = StringAlignment.Center;
e.Graphics.DrawString("<Footer Center>", f, Brushes.Black, e.Graphics.ClipBounds, format);
format.Alignment = StringAlignment.Far;
e.Graphics.DrawString("<Footer Right>", f, Brushes.Black, e.Graphics.ClipBounds, format);
y += height;
e.HasMorePages = (y < bmp.Height);
}

h_m0zhdeh
چهارشنبه 20 دی 1391, 19:45 عصر
مرسی the king از کدی که دادید فقط با عرض شرمندگی من 2 تا سوال دارم:خجالت:
1) من نمی تونم اندازه فونت متن اصلی پرینتم رو تغییر بدم(تو footer , header میشد سایز و فونت تعریف کرد ولی توی متن اصلی نمی دونم چیکار باید کنم) خیلی ریزه
2) چه جوری سایز لوگو رو بزرگتر کنم؟
میشه بازم کمکم کنید؟؟؟:گریه:

the king
پنج شنبه 21 دی 1391, 05:53 صبح
مرسی the king از کدی که دادید فقط با عرض شرمندگی من 2 تا سوال دارم:خجالت:
1) من نمی تونم اندازه فونت متن اصلی پرینتم رو تغییر بدم(تو footer , header میشد سایز و فونت تعریف کرد ولی توی متن اصلی نمی دونم چیکار باید کنم) خیلی ریزه

دلیل اینکه معمولا کسی خود فرم رو مستقیما چاپ نمی کنه همینه، فونتی که روی صفحه نمایش مناسبه به خاطر پایین بودن dpi صفحه نمایشه، روی چاپگر که
dpi اش به مراتب بیشتره یا ریز میشه یا بی کیفیت. معمولا موقع چاپ چیزی که روی فرم هست رو چاپ نمی کنند، از کمپوننت ها یا کلاس هایی که مخصوص
چاپ گزارش طراجی شده اند استفاده می کنند. شما اگر فرم تون رو باریک تر کنید، به همون نسبت موقع چاپ بزرگتر دیده میشه چون الگوریتم این
روال اونقدر بزرگ اش می کنه تا عرض فرم با عرض کاغذ منطبق بشه.



2) چه جوری سایز لوگو رو بزرگتر کنم؟
میشه بازم کمکم کنید؟؟؟:گریه:

اون RectangleF logoRect رو در کد پیدا کنید، الان نوشته 0.08f ئه طول صفحه، یعنی ابعاد لوگو 8 درصد طول صفحه باشه، چه افقی و چه عمودی،
اگر اون دو تا 0.08f رو زیاد کنید، فرضا بکنید 0.20f اونوقت بزرگتر نشون داده میشه.

h_m0zhdeh
پنج شنبه 21 دی 1391, 06:41 صبح
دوست عزیز به خاطر تمام کمک هاتون ممنون:قلب:
خیلی لطف کردید
تستش می کنم و امیدوارم بازم بتونم ازتون کمک بگیرم