Graphics.DrawString 以打印文档宽度为中心
Posted
技术标签:
【中文标题】Graphics.DrawString 以打印文档宽度为中心【英文标题】:Graphics.DrawString center in printdocument width 【发布时间】:2013-09-01 05:34:54 【问题描述】:我正在尝试将一个字符串置于打印文档的中心。 我已经用图像完成了以下操作,它可以工作,但似乎与字符串不一样。
这是我用来居中图像的代码
e.Graphics.DrawImage(logo, (e.MarginBounds.Width / 2) - (logo.Width / 2), height);
我试图居中的文本是从 TabControl 中的 Tab 提供的
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);
编辑
当前完整代码
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 居中
【问题讨论】:
【参考方案1】:以下内容对我有用。如果您的边距不均匀,您可能需要使用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;
编辑回复
使用您的新代码输出。你说这是你想要的吗?
或者你想要这个?
边距是位于页面内部的矩形。这些边距可能是不对称的,所以如果你想要绝对中心,你应该参考PageBounds
。
此外,您的文本居中对齐,因此绘制文本的参考点位于字符串的中间,而不是像 logo
那样的左上角。
【讨论】:
For the logo Gets me center '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) - (logo.Width / 2)' 为什么我是否必须混合使用两者才能最终以图像为中心? 对于居中的文本,我可以同时使用 PageBounds 或 MarginBounds。不明白为什么它似乎适用于一个而不是另一个。 更新了上面的代码以包含当前打印文档中的完整代码 请回复我的澄清。 选项 2 是我正在寻找的。感谢您澄清为什么使用相同的计算文本和徽标位于不同的位置以上是关于Graphics.DrawString 以打印文档宽度为中心的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Graphics::DrawString 绘制杂项字符?