2013-08-28 6 views
1

Я пытаюсь центрировать строку на printdocument. Я сделал следующее с изображением, и оно работает, но похоже, что оно не работает с строкой.Graphics.DrawString center in printdocument width

Вот код, который я использовал для центрирования изображения

e.Graphics.DrawImage(logo, (e.MarginBounds.Width/2) - (logo.Width/2), height); 

Текста я пытаюсь центр является поставкой из вкладки в TabControl

using (var sf = new StringFormat()) 
{ 
     height = logo.Height + 15; 
     sf.LineAlignment = StringAlignment.Center; 
     sf.Alignment = StringAlignment.Center; 
     e.Graphics.DrawString(tabData.Text, new Font(this.Font.Name, 10), 
      new SolidBrush(tabData.ForeColor), 
      (e.MarginBounds.Width/2) - (txtData.Width/2), height, sf); 
    } 

Я также попытался ниже, и используется string_size.Width/2 вместо txtData.Width

SizeF string_size = e.Graphics.MeasureString(tabData.Text, tabData.Font); 

EDIT

Текущий полный код

 float height = 0; 
     tabData.Text = "Date Range: 02/02/2010 - 08/09/2013"; //set just for testing 
     using (var logo = Properties.Resources.title) 
     { 
      e.Graphics.DrawImage(logo, e.PageBounds.Left + (e.MarginBounds.Width/2) - (logo.Width/2), height); 
      height = logo.Height + 15; 
     } 

     using (var sf = new StringFormat()) 
     { 

      sf.LineAlignment = StringAlignment.Center; 
      sf.Alignment = StringAlignment.Center; 
      e.Graphics.DrawString(tabData.Text, new Font(this.Font.Name, 10), new SolidBrush(tabData.ForeColor), e.PageBounds.Left + (e.PageBounds.Width/2), height, sf); 
     } 

Не понимаю, почему я должен использовать смесь PageBounds и MarginBounds к центру изображения, то с текстом будет центрировать либо с обеих MarginBounds или обоих PageBounds

ответ

4

Следующие работы для меня. Возможно, вам понадобится использовать PageBounds, если ваши поля не являются однородными.

void pd_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     int w = e.MarginBounds.Width/2; 
     int x = e.MarginBounds.Left; 
     int y = e.MarginBounds.Top; 
     Font printFont = new Font("Arial", 10); 
     Bitmap logo = System.Drawing.SystemIcons.WinLogo.ToBitmap(); 

     int height = 100 + y; 
     string tabDataText = "Hello World"; 
     var tabDataForeColor = Color.Blue; 
     var txtDataWidth = e.Graphics.MeasureString(tabDataText, printFont).Width; 

     e.Graphics.DrawImage(logo, 
      e.MarginBounds.Left + (e.MarginBounds.Width/2) - (logo.Width/2), 
      e.MarginBounds.Top + (e.MarginBounds.Height/2) - (logo.Height)); 

     using (var sf = new StringFormat()) 
     { 
      height += logo.Height + 15; 
      sf.LineAlignment = StringAlignment.Center; 
      sf.Alignment = StringAlignment.Center; 
      e.Graphics.DrawString(tabDataText, new Font(this.Font.Name, 10), 
       new SolidBrush(tabDataForeColor), 
       e.MarginBounds.Left + (e.MarginBounds.Width/2), 
       e.MarginBounds.Top + (e.MarginBounds.Height/2) + (logo.Height/2) + 15, 
       sf); 
     } 

     e.HasMorePages = false; 
    } 

Edit Response

Вывод с использованием нового кода. Вы говорите, что это то, что вы хотите?

Или вы хотите этого?

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

Кроме того, ваш текст выровнен по центру, чтобы сделать опорную точку рисования текста посредине строки вместо верхнего левого, как logo.

+0

Для логотипа Получает мне центр 'e.PageBounds.Left + (e.MarginBounds.Width/2) - (logo.Width/2)' Чтобы далеко вправо «e.MarginBounds.Left + (e.MarginBounds.Width/2) - (logo.Width/2) ' Справа ' e.PageBounds.Left + (e.PageBounds.Width/2) - (логотип.Width/2) ' Почему я должен использовать сочетание обоих, чтобы в итоге было центрировано изображение? – Tsukasa

+0

Для текста в центр я могу использовать либо обе страницы, либо оба поля MarginBounds. Не понимаю, почему это работает для одного, а не для другого. – Tsukasa

+0

Обновленный приведенный выше код, который содержит полный код в настоящее время в PrintDocument – Tsukasa