Хорошо, прежде чем спамить меня 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;
}
}
В моем случае это не механический. Но это может быть ошибка драйвера принтера. Когда я печатаю файл, на выходном изображении установлены точные поля. Страница напечатана правильно, с точно такими же полями. Единственное, что неправильно, это предварительный просмотр. – Harry