4

ここに状況があります。Visual Studio 2010 で C# を使用して Windows フォームで従業員カード構造を作成する必要があります。構造には、白い背景のラベルと画像ボックスが含まれる場合があります。作成に問題はありませんでしたが、ユーザーがそのカードを印刷できるように、このフォームに「印刷」という名前のボタンも付けています。私はそれをグーグルで検索しましたが、具体的なものは何も見つかりませんでした。私を助けてください。

namespace Employee_Card_Manager
{
public partial class Card : Form
{
    public Card(String a, String b, String c, String d, String e, String f, String g, String h, String i)
    {
        InitializeComponent();
        this.label2.Text = a;
        this.label9.Text = b;
        this.label10.Text = c;
        this.label11.Text = d;
        this.label12.Text = e;
        this.label13.Text = f;
        this.label14.Text = g;
        this.label16.Text = h;
        this.pictureBox1.Image = Image.FromFile(i);
        Image myimg = Code128Rendering.MakeBarcodeImage(h, 2, true);
        this.pictureBox2.Image = myimg;
    }
    private void button1_Click(object sender, EventArgs e)
    {
          //Print Card Code
    }
  }
}

カードのテンプレートは以下の通りです。

従業員カードの構造

すべてのカード構造をパネル コントロールに配置し、パネルの背景を白に設定しました。このカードを印刷するコードを入力できますか? ありがとう

4

2 に答える 2

20

完全に機能する次のコードを見つけました!!

    //declare event handler for printing in constructor
        printdoc1.PrintPage += new PrintPageEventHandler(printdoc1_PrintPage);

    //Rest of the code
    Bitmap MemoryImage;
    public void GetPrintArea(Panel pnl)
    {
        MemoryImage = new Bitmap(pnl.Width, pnl.Height);
        pnl.DrawToBitmap(MemoryImage, new Rectangle(0, 0, pnl.Width, pnl.Height));
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        if (MemoryImage != null)
        {
            e.Graphics.DrawImage(MemoryImage, 0, 0);
            base.OnPaint(e);
        }
    }
    void printdoc1_PrintPage(object sender, PrintPageEventArgs e)
    {
        Rectangle pagearea = e.PageBounds;
        e.Graphics.DrawImage(MemoryImage, (pagearea.Width / 2) - (this.panel1.Width / 2), this.panel1.Location.Y);
    }
    public void Print(Panel pnl)
    {
        pannel = pnl;
        GetPrintArea(pnl);
        previewdlg.Document = printdoc1;
        previewdlg.ShowDialog();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Print(this.panel1);
    }
于 2012-05-17T17:43:50.503 に答える
0

このMSDNページは機能しませんか? http://msdn.microsoft.com/en-us/library/aa287529(v=vs.71).aspx

編集:前述のリンクの例を変更し、さまざまな形式で再利用できるPrintablePanelクラスを作成しました。

public partial class PrintablePanel : Panel
{
    public PrintablePanel()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs e)
    {

        base.OnPaint(e);
    }

    [System.Runtime.InteropServices.DllImport("gdi32.dll")]
    public static extern long BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);


    public Bitmap GetImage()
    {
        Bitmap memoryImage = null;
        Graphics mygraphics = CreateGraphics();

        Size s = this.Size;
        memoryImage = new Bitmap(s.Width, s.Height, mygraphics);
        Graphics memoryGraphics = Graphics.FromImage(memoryImage);
        IntPtr dc1 = mygraphics.GetHdc();
        IntPtr dc2 = memoryGraphics.GetHdc();
        BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376);
        mygraphics.ReleaseHdc(dc1);
        memoryGraphics.ReleaseHdc(dc2);

        return memoryImage;
    }
于 2012-05-15T17:31:08.017 に答える