PDA

View Full Version : روش پرینت از یک صفحه بصورت full screen



bahar_engineer
پنج شنبه 15 مرداد 1388, 14:06 عصر
همونطور که بارها گفتم می خوام از یه صفحه پرینت بگیرم در واقع می خوام از یک groupbox پرینت بگیرم که خودش شامل یه تکست باکس می شه
البته می خوام فول اسکرین باشه یعنی موقع چاپ کل صفحه پر کنه

چند تا روش داشتم :
1. استفاده از کامپوننت ControlPrint که ضمیمه اش کردم و کدش برای پرینت از یک کنترل اینه :


ControlPrint m_print = new ControlPrint(groupBox3);
printPreviewDialog1.Document = (PrintDocument)m_print;
printPreviewDialog1.ShowDialog();
که شما به جای groupbox3 می تونین هر کنترلی که خواستین چاپ کنین رو بذارین

این کد مشکلش اینه که نمی دونم با چه تنظیماتی اونو فول اسکرین چاپ کنم... البته سمپل خودش فول هست اما من چیزی توش پیدا نکردم

2. از groupbox عکس گرفتم و اون عکس رو بصورت فول اسکرین با کد زیر چاپ می کنم:
کد رویداد کلیک دکمه پرینت:


temimg = Emxx.Capture.Control(groupBox1);
printDialog1.Document = printDocument1;
printDialog1.ShowDialog();
printPreviewDialog1.Document = printDocument1;
printPreviewDialog1.ShowDialog();
که Emxx یک dll هست که اونم توی ضمیمه گذاشتم و از کنترل ها عکس می گیره

این کد هم توی رویداد printDocument1_PrintPage می نویسیم:


e.Graphics.DrawImage(myimage, 0, 0, a, b);
و a و b ابعاد تصویر هستند که می خوایم توی صفحه چاپ بشه و من a=850 و b=1100 گرفتم که فول اسکرین می شه اینطوری

در این حالت هم مشکل من اینه که در حالت عادی مسئله ای وجود نداره یعنی شما یک عکس داشته باشی راحت به این شکل با این کد که توی رویداد printDocument1_PrintPage گذاشتم از عکست پرینت فول اسکرین می گیری

اما الان که من اومدم اول از groupbox عکس گرفتم گویا ابعاد این عکس کوچک هست و مجبور شدم اونو تبدیل کنم به ابعاد بزرگ و از این کد استفاده کردم



Image newBitmap = new Bitmap(temimg, new Size(1500, 2000));
myimage = newBitmap;
و به این شکل عکسم بزرگ شد و فول اسکرین هم شد چون زمانی که عکس کوچک بود و پرینت می گرفت عکس تار نمایش داده می شد ... با این کار عکس شفاف و با رزلوشن نسبتاً خوبی نمایش داده می شود . ابعاد عکس من به 1500*2000 تغییر یافته است

خوب حالا مشکل اینجاست که با انواع پرینت عکس به سادگی چاپ می شود به جز پرینتر اصلی

یعنی با ADobe PDf و ... چاپ می شود اما هنگامی که پرینتر hp را به عنوان پرینتر مورد نظر کاربر انتخاب می کنم خطا می ده که فکر می کنم به خاطر حجم بالای عکس باشه که براش ارسال می کنم

خطا اینه :


Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

با این اوصاف انگار فقط می مونه استفاده از کریستال ریپورت
به نظر شما برای پرینت گرفتن از یک کنترل groupbox استفاده از کریستال ریپورت کار درستیه؟

اگه اینطوره در این مورد راهنمایی کنین چون من اصلاً نمی دونم این کریستال چطوریه اونم برای یه تک صفحه چون من در اینجا نیازی به ارتباط کریستال با بانک ندارم



من منتظرم ... همه نوعش و امتحان کردم دیدید که .. پس دریغ نکنید

Unknownlive
پنج شنبه 15 مرداد 1388, 23:13 عصر
اووه برو از رویداد ها دکمه PrintScreen را صدا بزن و اگه خواستی فقط پنجره باشه Alt+PrintScreen هرچند این روش غیر اصولی

bahar_engineer
شنبه 17 مرداد 1388, 09:58 صبح
مرسی اما من فقط می خواستم از کنترل groupbox پرینت بگیرم نه کل صفحه و نه کل فرم ...

به هر حال خودم حلش کردم

Thx

mahdidoopdoop
شنبه 17 مرداد 1388, 10:51 صبح
مرسی اما من فقط می خواستم از کنترل groupbox پرینت بگیرم نه کل صفحه و نه کل فرم ...

به هر حال خودم حلش کردم

Thx
سلام

ميشه بفرماييد چه جوري حلش كرديد كه ماهم ياد بگيريم؟:کف:

bahar_engineer
شنبه 17 مرداد 1388, 11:10 صبح
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;

namespace childfriend
{

public partial class typespell : Form
{
public Image pic;
public Boolean landscape;
private int gh = 496, gw = 702, fh = 660, fw = 780;
public Image myimage, temimg;
private int a= 850, b= 1100;

public typespell()
{
InitializeComponent();

}

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
e.Graphics.DrawImage(temimg, 0, 0, a, b);
}


private void Form1_Load(object sender, EventArgs e)
{
}

private void button4_Click(object sender, EventArgs e)
{

temimg = Emxx.Capture.Control(groupBox1);
printDialog1.Document = printDocument1;
printDialog1.ShowDialog();
printPreviewDialog1.Document = printDocument1;
printPreviewDialog1.ShowDialog();
}
}
}



از کامپوننت Emxx که توی ضمیمه هست استفاده کنید .. اونو بصورت رفرنس به برنامه تون اضافه کنین . این کامپوننت از کنترل groupbox عکس می گیره (کد قرمز رنگ) و عکس گرفته شده رو توی متغیر ما که از نوع image هست به نام temimg ذخیره می کنه

در رویداد printDocument1_PrintPage هم که عکس گرفته شده بصورت فول اسکرین چاپ می شه

موفق باشید

milad_tensy
سه شنبه 27 اردیبهشت 1390, 03:58 صبح
من فکر می کنم این کد از قلم افتاده


printDocument1.PrintPage+=new PrintPageEventHandler(printDocument1_PrintPage);