好吧,在你用StringFormat.Alignment=StringAlignment.Center垃圾邮件给我之前…听听我的问题:
当我用以下代码绘制文本时,字符串在打印预览中居中,但在打印时不在实际纸张上居中。整个页面向右偏一点,因此有些内容在打印预览时显示为打印,但在打印时会从纸张上脱落(不只是超出页边空白范围,而是从纸张上脱落)。
private void button1_click(object sender,eventargs e)
{
printDocument pd=new printDocument();
pd.printpage+=新的printpageeventhandler(pd_printpage);
printPreviewDialog ppd=新建printPreviewDialog();
((窗体)ppd).windowstate=form windowstate.maximized;
ppd.document=pd;
ppd.showDialog();
}
void pd_printpage(对象发送方,printpageEventargs e)
{
对于(int y=100;y<400;y+=25)
{
stringFormat sf=new stringFormat();
sf.alignment=stringAlignment.center;
E.图形.画矩形(钢笔.黑色,新矩形(5,Y,840,25));
}
e.hasmorepages=false;
}
< /代码>
有没有想过为什么它会关闭?这应该是微不足道的,但事实并非如此。
编辑:我发现它不仅仅是文本…它只打印了一点点。我已经更新了上面的代码,以提供更好的问题示例。只需将其放入一个有按钮的表单中即可。
edit 2:给出答案后,我修改了代码,现在可以工作了。我正在为那些可能想看到它的人提供最终代码。我必须认识到我是在打印预览对话框中还是在纸上看到它,所以我有一个ispreview标志来处理这个问题。
<> <代码> >
public分部类form1:form
{
bool ispreview=true;
公共窗体()
{
初始化组件();
}
专用的void按钮1_click(对象发送器,事件参数e)
{
ispreview=真;
printDocument pd=new printDocument();
pd.endprint+=新的printEventHandler(pd_endprint);
pd.printpage+=新的printpageEventHandler(pd_printpage);
printPreviewDialog ppd=新建printPreviewDialog();
((窗体)ppd).windowstate=form windowstate.maximized;
ppd.document=pd;
ppd.showDialog();
}
void pd_endprint(对象发送器,printEventArgs e)
{
ispreview=false;
}
void pd_printpage(对象发送方,printpageeventargs e)
{
矩形b3=e.pagebounds;
如果(ISPREVIEW)
{
e.graphics.translateTransform(e.pagesettings.hardbarginx,e.pagesettings.hardbarginy);
}
b3.宽度-=(int)e.pagesettings.hardbarginx*2;
b3.height-=(int)e.pagesettings.hardbarginy*3;
In=b3.y;
int x=0;
同时(Y+25)<b3.底部)
{
X++;
stringFormat sf=new stringFormat();
sf.alignment=stringAlignment.center;
矩形R=新矩形(b3.x,y,b3.宽度,25);
e.图形.画矩形(钢笔.黑色,R);
e.graphics.drawstring(x.toString(),this.font,brush.black,b3.x+5,y+5);
y+=25;
}
//画最后一点
e.graphics.drawrectangle(pens.black,新矩形(b3.x,y,b3.宽度,b3.高度-y));
e.hasmorepages=false;
}
}
< /代码>
当我用以下代码绘制文本时,字符串在打印预览中居中,但在打印时不在实际纸张上居中。整个页面向右偏了一点,因此有些内容在打印预览时显示为打印,但在打印时会从纸张上脱落(不仅超出页边距范围,而且会从纸张上脱落)。
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;
}
有没有想过为什么它会关闭?这应该是微不足道的,但事实并非如此。
编辑:我发现这不仅仅是短信…它只打印了一点点。我已经更新了上面的代码,以提供更好的问题示例。把它放在一个有按钮的窗体中。
编辑2:给出了答案后,我修改了代码,现在可以工作了。我正在为那些可能想看到它的人提供最终代码。我必须知道我是在打印预览对话框中还是在纸上看到这个,所以我有一个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;
}
}