C# graphics, paint, picturebox centering

2019-08-13 19:28发布

Ok, so this is the problem: in C# forms I've created a new private void:

private void NewBtn(string Name, int x, int y)

Which has a purpose of creating a picturebox that imitates behavior of a button (don't ask why, I simply enjoy complicating things) and can be called as many times as I want.

Font btnFont = new Font("Tahoma", 16);
PictureBox S = new PictureBox();
S.Location = new System.Drawing.Point(x, y);
S.Paint += new PaintEventHandler((sender, e) =>
{
    e.Graphics.TextRenderingHint = 
        System.Drawing.Text.TextRenderingHint.AntiAlias;
    e.Graphics.DrawString(Name, btnFont, Brushes.Black, 0, 0);
});
Controls.Add(S);

Now, I am worried about part with Paint/Graphics (ignore rest of the code, I only gave some of it). I want to center the text that I write as "Name" in void when I call it "NewBtn(Name, x, y)". So, what should I put as

e.Graphics.DrawString(Name, btnFont, Brushes.Black, ThisX???, 0);

Suggestions?

2条回答
姐就是有狂的资本
2楼-- · 2019-08-13 19:38
var size = g.MeasureString(Name, btnFont);

e.Graphics.DrawString(Name, btnFont, Brushes.Black,
                      (S.Width - size.Width) / 2,
                      (S.Height - size.Height) / 2));

You can improve this by measuring the string only once, considering the font and text won't change for a specific Button/PictureBox.

And I would also suggest checking if S.Size is wider / taller than size and handling it, so graphics won't try to draw a string starting at negative coordinates.

查看更多
欢心
3楼-- · 2019-08-13 20:00

Try using the Graphics.DrawString methods that uses the String.Drawing.StringFormat Option

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

You have two options here the first to use coordinates.

e.Graphics.DrawString(("Name", new Font("Arial", 16), Brushes.Black, 10, 10, drawFormat);

the second is to create a rectange like this:

 e.Graphics.DrawString("Name", new Font("Arial", 16), Brushes.Black, new Rectangle(0,0,this.Width,this.Height), drawFormat);
查看更多
登录 后发表回答