2010-07-26 2 views
3

Хорошо, прежде чем спамить меня StringFormat.Alignment = StringAlignment.Center ... услышать весь мой вопрос:Почему версия PrintPreview не совпадает с печатью?

Когда я рисую текст с помощью следующего кода, строка находится в центре PrintPreview, но не центрирован на фактическая бумага при печати. Вся страница немного вправо, поэтому некоторые вещи отображаются как печать в превью на печать, но при печати они отваливаются от бумаги (не только за пределами диапазона полей, но и выталкивают бумагу).

private void button1_Click(object sender, EventArgs e) 
    { 
     PrintDocument pd = new PrintDocument(); 

     pd.PrintPage += new PrintPageEventHandler(pd_PrintPage); 

     PrintPreviewDialog ppd = new PrintPreviewDialog(); 

     ((Form)ppd).WindowState = FormWindowState.Maximized; 

     ppd.Document = pd; 
     ppd.ShowDialog(); 
    } 

    void pd_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     for (int y = 100; y < 400; y += 25) 
     { 
      StringFormat sf = new StringFormat(); 
      sf.Alignment = StringAlignment.Center; 

      e.Graphics.DrawRectangle(Pens.Black, new Rectangle(5, y, 840, 25)); 
     } 

     e.HasMorePages = false; 
    } 

Любые мысли о том, почему это не так? Это должно быть тривиально, но это не так.

EDIT: Я обнаружил, что это не только текст ... Он печатает ВСЁ совсем немного. Я обновил код выше, чтобы обеспечить лучший пример проблемы. Просто оставьте это в форме с помощью кнопки на нем.

EDIT 2: С ответом на этот вопрос я изменил код, и теперь это работает. Я предоставляю окончательный код тем, кто может его увидеть. Я должен узнать, вижу ли я это в диалоговом окне PrintPreview или на бумаге, поэтому у меня есть флаг IsPreview, чтобы справиться с этим.

public partial class Form1 : Form 
{ 
    bool IsPreview = true; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     IsPreview = true; 
     PrintDocument pd = new PrintDocument(); 

     pd.EndPrint += new PrintEventHandler(pd_EndPrint); 
     pd.PrintPage += new PrintPageEventHandler(pd_PrintPage); 


     PrintPreviewDialog ppd = new PrintPreviewDialog(); 

     ((Form)ppd).WindowState = FormWindowState.Maximized; 

     ppd.Document = pd; 
     ppd.ShowDialog(); 
    } 

    void pd_EndPrint(object sender, PrintEventArgs e) 
    { 
     IsPreview = false; 
    } 

    void pd_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     Rectangle b3 = e.PageBounds; 

     if (IsPreview) 
     { 
      e.Graphics.TranslateTransform(e.PageSettings.HardMarginX, e.PageSettings.HardMarginY); 
     } 

     b3.Width -= (int)e.PageSettings.HardMarginX * 2; 
     b3.Height -= (int)e.PageSettings.HardMarginY * 3; 

     int y = b3.Y; 
     int x=0; 
     while ((y + 25) < b3.Bottom) 
     { 
      x++; 
      StringFormat sf = new StringFormat(); 
      sf.Alignment = StringAlignment.Center; 

      Rectangle R = new Rectangle(b3.X, y, b3.Width, 25); 

      e.Graphics.DrawRectangle(Pens.Black, R); 
      e.Graphics.DrawString(x.ToString(), this.Font, Brushes.Black, b3.X + 5, y + 5); 

      y += 25; 
     } 
     // draw the last little bit 
     e.Graphics.DrawRectangle(Pens.Black, new Rectangle(b3.X, y, b3.Width, b3.Height - y)); 

     e.HasMorePages = false; 
    } 
} 

ответ

6

Отказ от права имеет тенденцию объясняться значением PageSettings.HardMarginX. Значение, созданное драйвером принтера. Драйверы принтера, как правило, не очень хороши в том, чтобы догадаться, как может выглядеть фактический маршрут бумаги через принтер. Это механические, прижимные ролики, выравнивание лотков и многое другое. Специалисты по программному обеспечению и механикам не часто обедают вместе.

Но инженер-программист почти всегда может исправить проблему инженера-механика. Вам понадобится диалоговое окно «Параметры», позволяющее пользователю исправить проблему инженера-механика. Используйте значение в вызове e.Graphics.TranslateTransform.

+0

В моем случае это не механический. Но это может быть ошибка драйвера принтера. Когда я печатаю файл, на выходном изображении установлены точные поля. Страница напечатана правильно, с точно такими же полями. Единственное, что неправильно, это предварительный просмотр. – Harry

0

Причина предварительный просмотр не совпадает с бумагой, потому что вы не выбрали принтер еще. Каждый принтер немного отличается для таких вещей, как непечатаемые области, принудительные поля и т. Д. Прошло некоторое время с тех пор, как я сделал печать winforms, но я помню, что переданный графический объект имеет способ учесть это.

Смежные вопросы