DrawString
テキストを異なるサイズのフォントで垂直方向に揃えるために使用したい。基本的に、ドルよりも小さなフォントでセントを印刷して、レポートに販売価格を印刷しようとしています。これはレポート エンジンにあり、Windows フォームではなく画像に書き込む必要があるため、使用するのDrawString
ではなく使用する必要があると思いますTextRenderer
。
BaseLine にテキストを描画する方法を説明するさまざまな記事を見つけました。これらは問題なく動作しているようですが、サイズが異なる同じフォントが 1 ピクセルずつずれている可能性があります。私はこれらを取り、フォントのアセントデザイン情報を使用して整列する方法を考え出すことができると思っていましたが、うまくいきませんでした:-(
誰にも役立つサンプルコードはありますか?
更新 1 : 合計を変更して、垂直方向ではなく上揃えにしたいことを反映します。Arial 20 で印刷されたドル値の上部を、Arial 14 のセント値の上部と水平方向に揃えたいと思います。私が試したすべてのフォントに問題がありました。
次の画像では、Arial Black を使用しています。
大きいフォントでは、赤い線と 1 の上部の間にギャップがあることがわかりますが、小さいフォントに到達するまでにそれは消えます。
Arial では、ラインの上から始まります。
そして、これはVerdanaで、大きなフォントで大きなギャップから始まると思います.
これら 3 つについては、次のコードを使用しています。
float offset = myFont.SizeInPoints /
myFont.FontFamily.GetEmHeight(myFont.Style) *
(myFont.FontFamily.GetLineSpacing(myFont.Style) - myFont.FontFamily.GetCellAscent(myFont.Style));
float pixels = e.Graphics.DpiY / 72f * offset;
float baseline = pixels;// (int)(pixels + 0.5f);
PointF renderPt = new PointF(left, y - baseline);
e.Graphics.DrawString("$1", myFont, new SolidBrush(Color.Black), renderPt);
また、このサンプルをいくつかのテストの基礎として使用しました。アセント ラインの描画方法が正確であれば、最初の書き込みポイントを調整するだけでよいと考えました。残念ながら、フォント サイズを大きくしたり、別のフォントに変更したりすると、アセント ラインが不正確に描画されてしまい、そのパスをたどることができませんでした。
TextRenderer
Windowsフォームイベントを使用しておらOnPaint
ず、適切なグラフィックを取得する方法がわからなかったため、動作させる方法がわからなかったため、使用していません。少し時間に追われていましたが、それが次の選択肢になるかもしれません。