4

VS2008 でLabelコントロールのOnPaintメソッドをオーバーライドしました。

void Label_OnPaint(object sender, PaintEventArgs e) {
  base.OnPaint(e);
  dim lbl = sender as Label;
  if (lbl != null) {
    string Text = lbl.Text;
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    if (myShowShadow) { // draw the shadow first!
      e.Graphics.DrawString(Text, lbl.Font, new SolidBrush(myShadowColor), myShadowOffset, StringFormat.GenericDefault);
    }
    e.Graphics.DrawString(Text, lbl.Font, new SolidBrush(lbl.ForeColor), 0, 0, StringFormat.GenericDefault);
  }
}

これは機能しますが、テキストを垂直方向と水平方向の両方で中央揃えにする方法を知りたいです。メソッドについては聞いたことがMeasureString()ありますが、私の「テキスト」には改ページが含まれる可能性があるため、問題が複雑になります。

誰かがこれを行う方法を教えてもらえますか?

4

4 に答える 4

9

または、独自のStringFormatオブジェクトを作成DrawStringし、RectangleFをサポートするのオーバーロードを使用してそれを渡すことができます。

StringFormat formatter = new StringFormat();
formatter.LineAlignment = StringAlignment.Center;
formatter.Alignment = StringAlignment.Center;

RectangleF rectangle = new RectangleF(0, 0, lbl.Width, lbl.Height);

e.Graphics.DrawString(Text, lbl.Font, new SolidBrush(lbl.ForeColor), rectangle, formatter);
于 2010-04-07T15:26:09.173 に答える
3

とフラグTextRenderer.DrawTextを使用して呼び出すことができます。HorizontalCenterVerticalCenter

于 2010-04-07T15:22:48.790 に答える
2

これが私が現在使用しているコードです、

SizeF size;
string text = "Text goes here";
size = e.Graphics.MeasureString(text, font);
x = (lineWidth / 2) - (size.Width / 2);
y = top;
e.Graphics.DrawString(text, font, Brushes.Black, x, y);
于 2011-09-27T19:38:39.930 に答える
1

StringAlignmentあまり信頼できないことが判明したため、作成したツールを(1年後に)追加したかっただけです。Neo のバージョンと非常によく似ていることがわかりました。

以下のコードは、テキストを垂直方向と水平方向の両方で中央揃えする優れた仕事をします。また、さまざまなオーバーロードを使用して記述したため、さまざまなオプションを指定して、このコントロールを希望どおりに動作させることができます。

ここに私のオーバーロードがあります:

private static void DrawCenter(Label label, Graphics graphics) {
  DrawCenter(label.Text, label, label.Location, label.ForeColor, graphics);
}

private void DrawCenter(string text, Label label, Graphics graphics) {
  DrawCenter(text, label, label.Location, label.ForeColor, graphics);
}

private static void DrawCenter(string text, Label label, Point location, Graphics graphics) {
  DrawCenter(text, label, location, label.ForeColor, graphics);
}

private static void DrawCenter(string text, Label label, Point location, Color fontColor, Graphics graphics) {
  Rectangle rect = new Rectangle(location, label.Size);
  SizeF lSize = graphics.MeasureString(text, label.Font, rect.Width);
  PointF lPoint = new PointF(rect.X + (rect.Width - lSize.Width) / 2, rect.Y + (rect.Height - lSize.Height) / 2);
  graphics.DrawString(text, label.Font, new SolidBrush(fontColor), lPoint);
}

これらをラベルの OnPaint イベントに使用するには、質問の元のコードを次のように変更するだけです。

private void Label_OnPaint(object sender, PaintEventArgs e) {
  base.OnPaint(e);
  Label lbl = sender as Label;
  if (lbl != null) {
    string txt = lbl.Text;
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    if (myShowShadow) { // draw the shadow first!
      Point offset = new Point(lbl.Location.X - 1, lbl.Location.Y - 1)
      DrawCenter(txt, lbl, offset, myShadowColor, e.Graphics);
    }
    DrawCenter(lbl, e.Graphics);
  }
}

Print_Document イベントの場合、デザイナーで既にラベルの周りにボックスがある場合、ラベルの周りにボックスも印刷するバージョンがあります。

private static void DrawCenter(string text, Label label, Point location, Color fontColor, Graphics graphics) {
  Rectangle rect = new Rectangle(location, label.Size);
  SizeF lSize = graphics.MeasureString(text, label.Font, rect.Width);
  PointF lPoint = new PointF((rect.Width - lSize.Width) / 2, (rect.Height - lSize.Height) / 2);
  graphics.DrawString(text, label.Font, new SolidBrush(fontColor), lPoint);
  if (label.BorderStyle != BorderStyle.None) {
    using (Pen p = new Pen(Color.Black)) {
      graphics.DrawRectangle(p, rect);
    }
  }
}

これが少しでも役に立つと思ったら、+1 をください。

〜ジョー

于 2012-08-03T13:50:22.473 に答える