5

私がやっていることは、文字列のピクセル サイズを取得し、それを 100 分の 1 インチに変換することです (つまり、ピクセル/DPI = インチ、インチ * 100 = 100 分の 1 インチ)。これが私のコードです:

private static SizeF TextSize(string text, Font txtFnt)
{
    SizeF txtSize = new SizeF();

    // The size returned is 'Size(int width, int height)' where width and height
    // are the dimensions of the string in pixels
    Size s = System.Windows.Forms.TextRenderer.MeasureText(text, txtFnt);

    // Value based on normal DPI settings of 96
    txtSize.Width = (float)Math.Ceiling((float)s.Width / 96f * 100f); 
    txtSize.Height = (float)Math.Ceiling((float)s.Height / 96f * 100f);

    return txtSize;
}

現在、Arial フォントを使用すると、12 未満のフォントでは問題なく動作しますが、計算されたサイズが実際のサイズよりも小さいため、文字が途切れ始めます。DPI 設定が 96 に設定されていることはわかっています。私のフォントはすべて同じように定義されており、フォント サイズのバリエーションは次のとおりです。

Font myFont = new Font("Arial", <font size>, FontStyle.Regular, GraphicsUnit.Point);

GraphicsUnit.Point文字列を描画しているカスタムコントロールのために使用する必要があると思いますが、GraphicsUnit問題はありますか?

機能はMeasureText正しく動作していますか、それとも何か他のことが起こっていますか?

編集

カスタム印刷プレビュー コントロールに描画しています。印刷プレビュー コントロールの単位は「インチ/100」です (したがって変換)。テキスト、画像などは Printer グラフィックス オブジェクトで描画されていると思いますが、完全にはわかりません。

4

3 に答える 3

3

ずっと前に、特にテキストボックス内のテキストを測定するという同様の問題に遭遇しまし。問題の要点は次のとおりです。テキストを描画するには、主に 2 つの方法があります。Win32 API と System.Drawing。テキスト ボックス内のテキストを測定しようとすると、Win32 API を使用して描画されるため、Win32 API を使用して測定する必要もあります。System.Drawing によって描画されたテキストを測定すると、.net を使用した測定値が一致します。

基本的に、フォームのテキスト ボックスは Win32 API を使用してレイアウトと描画を行い、測定値も Win32 から取得する必要があります。

具体的に何をどこで測定しているのかを言わなかったので、この答えは当てはまらないかもしれません。

于 2010-12-29T19:26:38.633 に答える
0

フォントヒンティング。

Windowsが使用するフォントにはヒントがあります。つまり、フォントで指定されているサイズと正確に一致しない場合があります。

http://blogs.msdn.com/b/cjacks/archive/2006/05/11/595525.aspx

于 2011-06-10T02:07:18.840 に答える
0

オプションは違いを生み、フォントが大きいほど影響が大きくなります。これが私たちに最適な設定です - あなたのマイレージは異なるかもしれません. (J# でこれを使用するため、コードは奇妙です):

private static System.Drawing.StringFormat createStringFormat()
{

    System.Drawing.StringFormat fmt = new System.Drawing.StringFormat (System.Drawing.StringFormat.get_GenericTypographic());
    fmt.set_Trimming(System.Drawing.StringTrimming.None);
    fmt.set_FormatFlags(System.Drawing.StringFormatFlags.MeasureTrailingSpaces | System.Drawing.StringFormatFlags.NoWrap);
    return fmt;
}
于 2011-06-10T01:11:03.823 に答える