2011-12-13 8 views
0

オプションTextRenderingHint.ClearTypeGridFitでTahomaフォントで描画されるラベルにAutoSizeを使用するのは問題です。 ClearTypeGridFitが指定されていないと大丈夫ですが、親コンテナによって切り取られます(添付の画像:最初のラベル '、'が切り取られます)ラベルコントロールにTahoma、TextRenderingHint.ClearTypeGridFitとAutoSize(WindowsXP)の組み合わせを使用する

私はそれがTahomaフォントでしか見つかりませんでした。 customlabelの

コード:デザイナーのファイルからのコードの

class CustomLabel: Label 
{ 
    public CustomLabel() 
     :base() 
    { 
    } 

    protected override void OnPaint (PaintEventArgs e) 
    { 
     e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; 
     base.OnPaint(e);    
    } 
} 

平和:

public override Size GetPreferredSize (Size theProposedSize) 
    {    
     if (TextRendering == TextRenderingHint.ClearTypeGridFit) 
     { 
      Graphics aGraphics = Graphics.FromHwnd(this.Handle); 
      if (aGraphics != null) 
      { 
       aGraphics.TextRenderingHint = theTextRendering; 
       Size aResult = TextRenderer.MeasureText(aGraphics, Text, Font, theProposedSize); 
       //apply control minimum size 
       aResult.Height = Math.Max(aResult.Height, MinimumSize.Height); 
       aResult.Width = Math.Max(aResult.Width, MinimumSize.Width); 
       return aResult; 
      } 
     } 

     return base.GetPreferredSize(theProposedSize); 
    } 
:私はちょうど上書きGetPreferedSize機能を発見した何

 // 
     // label1 
     // 
     this.label1.AutoSize = true; 
     this.label1.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.label1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 
     this.label1.Location = new System.Drawing.Point(54, 95); 
     this.label1.Name = "label1"; 
     this.label1.Size = new System.Drawing.Size(35, 13); 
     this.label1.TabIndex = 1; 
     this.label1.Text = resources.GetString("label1.Text"); 
     // 
     // customLabel1 
     // 
     this.customLabel1.AutoSize = true; 
     this.customLabel1.BackColor = System.Drawing.Color.NavajoWhite; 
     this.customLabel1.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.customLabel1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 
     this.customLabel1.ForeColor = System.Drawing.Color.Black; 
     this.customLabel1.Location = new System.Drawing.Point(1, 1); 
     this.customLabel1.Margin = new System.Windows.Forms.Padding(0); 
     this.customLabel1.Name = "customLabel1"; 
     this.customLabel1.Size = new System.Drawing.Size(192, 154); 
     this.customLabel1.TabIndex = 0; 
     this.customLabel1.Text = resources.GetString("customLabel1.Text"); 

enter image description here

しかし、結果に最大サイズを適用することはできません。 なぜ最大サイズが必要ですか?たとえば、ラベルを幅で制限する可能性があります。

アイデア?

+1

AutoSizeプロパティは、折り返しを防ぎ、唯一の事故で右のフォームエッジになるだろう。このラベルコントロールの実際の設定は何ですか? –

+0

@Hans Passant、私は最初の投稿を変更しました – Allender

答えて

0

だから、私の最終的な解決策はそうなります

public override Size GetPreferredSize (Size theProposedSize) 
    { 
     if (SystemInfo.WinVersion == SystemInfo.Version.WindowsXP) 
     { 
      if (theTextRendering == TextRenderingHint.ClearTypeGridFit) 
      { 
       Graphics aGraphics = Graphics.FromHwnd(this.Handle); 
       if (aGraphics != null) 
       { 
        aGraphics.TextRenderingHint = theTextRendering; 
        Size aResult = TextRenderer.MeasureText(aGraphics, Text, Font, theProposedSize); 
        //apply padding and margin 
        aResult.Width += Margin.Horizontal + Padding.Horizontal; 
        aResult.Height += Margin.Vertical + Padding.Vertical; 
        //apply control minimum size 
        aResult.Height = Math.Max(aResult.Height, MinimumSize.Height); 
        aResult.Width = Math.Max(aResult.Width, MinimumSize.Width); 

        //adopt maximum width 
        if (MaximumSize.Width > 0) 
        { 
         while (aResult.Width > MaximumSize.Width) 
         { 
          aResult.Width -= MaximumSize.Width; 
          aResult.Height += Font.Height; 
          if (aResult.Width < MaximumSize.Width) 
          { 
           aResult.Width = MaximumSize.Width; 
          } 
         } 
        } 

        return aResult; 
       } 
      } 
     } 

     return base.GetPreferredSize(theProposedSize); 
    } 
関連する問題