Как изменить размер растрового изображения, чтобы текст отображался в нем? - PullRequest
0 голосов
/ 16 мая 2018

Я работаю над печатью чеков с использованием C # и WinForms. Проблема заключается в том, что после нажатия кнопки печати он печатает только первый элемент в представлении таблицы данных и половину второго элемента, например:

enter image description here

Вот код, который я использую:

private void btnSave_Click(object sender, EventArgs e)
{
    for (int i = 0; i<dataGridView1.Rows.Count; i++ )
    {
        OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=TS-POS.accdb");
        OleDbCommand cmd = new OleDbCommand("INSERT INTO Sales (InvoiceNo,InvoiceDate, Pname, Pprice, Bcode, Staff) VALUES ('" + txtInvoiceNo.Text + "','" + dateTimePicker1.Value + "', '" + dataGridView1.Rows[i].Cells[1].Value + "', '" + dataGridView1.Rows[i].Cells[3].Value + "', '" + dataGridView1.Rows[i].Cells[0].Value + "', '" + lblUser.Text + "')", conn);
       // cmd.Parameters.AddWithValue("@staff", OleDbType.VarChar).Value = lblUser.Text;
        conn.Open();
        cmd.ExecuteNonQuery(); 
        conn.Close();

    }

    printready();

    PrintDialog pd = new PrintDialog();

    pd.PrinterSettings = new PrinterSettings();

    if (DialogResult.OK == pd.ShowDialog(this))
    {
        PrintDocument pdoc = new PrintDocument();

        pdoc.PrintPage += new PrintPageEventHandler(pqr);

        pdoc.Print();
    }
}

void pqr(object o, PrintPageEventArgs e)
{
    System.Drawing.Image i = this.pictureBox1.Image;

    Point p = new Point(1, 1);
    e.Graphics.DrawImage(i, p);
}

private void printready()
{ 
    string welcome = "Thank You For Visiting Dulabk";
    string InvoiceNo = txtInvoiceNo.Text;
    string InvoiceDate = dateTimePicker1.Value.ToLongDateString();
    Bitmap bitm = new Bitmap(welcome.Length * 30, 90);

    using (Graphics graphic = Graphics.FromImage(bitm))
    {
        int startX = 0;
        int startY = 0;
        int Offset = 0;

        Font newfont = new Font("Arial Black", 8);
        Font newfont2 = new Font("Arial Black", 10);
        PointF point = new PointF(40f, 2f);
        SolidBrush black = new SolidBrush(Color.Black);
        SolidBrush white = new SolidBrush(Color.White);
        graphic.FillRectangle(white, 0, 0, bitm.Width, bitm.Height);
        graphic.DrawString("" + InvoiceNo + "", newfont2, black, startX, startY + Offset);
        Offset = Offset + 20;
        PointF pointPrice = new PointF(15f, 45f);
        graphic.DrawString("" + InvoiceDate + "", newfont2, black, startX, startY + Offset);
        Offset = Offset + 20;
        PointF pointPname = new PointF(10f, 65f); 
        PointF pointBar = new PointF(10f, 65f);
        graphic.DrawString("" + welcome + "", newfont2, black, startX, startY + Offset);
        Offset = Offset + 20;
        PointF pointList = new PointF(10f, 65f); 

        for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {
            int ii = 1;
            ii++;

            graphic.DrawString(" " + dataGridView1.Rows[i].Cells[1].Value +"  " + dataGridView1.Rows[i].Cells[2].Value +"  " + dataGridView1.Rows[i].Cells[3].Value +"" , new Font("Arial Bold", 11),
                     new SolidBrush(Color.Black), startX, startY + Offset);
            Offset = Offset + 20;
            graphic.DrawString(" ---------- ", newfont2, black, startX, startY + Offset);
        }
    }

    using (MemoryStream Mmst = new MemoryStream())
    {
        bitm.Save("ms", ImageFormat.Jpeg);
        pictureBox1.Image = bitm;
        pictureBox1.Width = bitm.Width;
        pictureBox1.Height = bitm.Height;


    }
}

Я не уверен, что является причиной этого: я попытался увеличить смещения и добавить больше строк под строками просмотра данных, но больше ничего не печатается.

EDIT

Хорошо, я нашел проблему, вот в этой строке:

Bitmap bitm = new Bitmap(welcome.Length * 30, 90);

Как я могу сделать размер изображения динамическим, а не в соответствии со значением, которое я установил в коде?

1 Ответ

0 голосов
/ 16 мая 2018

У вас есть переменное количество строк для элементов и фиксированное количество дополнительной информации. Вы знаете, сколько вертикального пространства вы собираетесь использовать для каждой строки, поэтому вы можете заранее рассчитать размер растрового изображения.

Кстати, в коде используется много ресурсов, которые должны быть утилизированы в дополнение к сущности graphic. Возможно, вы захотите использовать «использование» на них вместо того, как я делал это в следующем коде. Кроме того, были некоторые неиспользованные переменные, которые я закомментировал.

Таким образом, вы можете получить что-то вроде:

private void printready()
{
    string welcome = "Thank You For Visiting Dulabk";
    string InvoiceNo = txtInvoiceNo.Text;
    string InvoiceDate = dateTimePicker1.Value.ToLongDateString();

    int lineHeight = 20;
    int supplementaryLines = 9;

    Bitmap bitm = new Bitmap(welcome.Length * 30, (supplementaryLines + dataGridView1.Rows.Count) * lineHeight);

    using (Graphics graphic = Graphics.FromImage(bitm))
    {
        int startX = 0;
        int startY = 0;
        int offsetY = 0;
        Font newfont2 = null;
        Font itemFont = null;
        SolidBrush black = null;
        SolidBrush white = null;

        try
        {
            //Font newfont = new Font("Arial Black", 8);
             newfont2 = new Font("Arial Black", 10);
             itemFont = new Font("Arial Bold", 11);

             black = new SolidBrush(Color.Black);
             white = new SolidBrush(Color.White);

            //PointF point = new PointF(40f, 2f);

            graphic.FillRectangle(white, 0, 0, bitm.Width, bitm.Height);
            graphic.DrawString("" + InvoiceNo + "", newfont2, black, startX, startY + offsetY);
            offsetY = offsetY + lineHeight;

            //PointF pointPrice = new PointF(15f, 45f);
            graphic.DrawString("" + InvoiceDate + "", newfont2, black, startX, startY + offsetY);
            offsetY = offsetY + lineHeight;

            //PointF pointPname = new PointF(10f, 65f);
            //PointF pointBar = new PointF(10f, 65f);
            graphic.DrawString("" + welcome + "", newfont2, black, startX, startY + offsetY);
            offsetY = offsetY + lineHeight;

            PointF pointList = new PointF(10f, 65f);

            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                int ii = 1;
                ii++;

                graphic.DrawString(" " + dataGridView1.Rows[i].Cells[1].Value + "  " + dataGridView1.Rows[i].Cells[2].Value + "  " + dataGridView1.Rows[i].Cells[3].Value + "", itemFont,
                         black, startX, startY + offsetY);
                offsetY = offsetY + lineHeight;
                graphic.DrawString(" ---------- ", newfont2, black, startX, startY + offsetY);
            }
        }
        finally
        {
            black.Dispose();
            white.Dispose();
            itemFont.Dispose();
            newfont2.Dispose();
        }
    }

    using (MemoryStream Mmst = new MemoryStream())
    {
        bitm.Save("ms", ImageFormat.Jpeg);
        pictureBox1.Image = bitm;
        pictureBox1.Width = bitm.Width;
        pictureBox1.Height = bitm.Height;


    }

    bitm.Dispose();

}

Теперь остается проблема того, что делать, если строка превышает welcome.Length * 30, но я подозреваю, что вы можете понять это сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...