C# C图形、油漆、图片盒定心

C# C图形、油漆、图片盒定心,c#,forms,graphics,paint,picturebox,C#,Forms,Graphics,Paint,Picturebox,好的,这就是问题所在:在C表单中,我创建了一个新的私有void: private void NewBtn(string Name, int x, int y) 它的目的是创建一个模仿按钮行为的picturebox。别问为什么,我只是喜欢把事情复杂化,而且可以被呼叫任意次数 Font btnFont = new Font("Tahoma", 16); PictureBox S = new PictureBox(); S.Location = new System.Drawing.Point(x,

好的,这就是问题所在:在C表单中,我创建了一个新的私有void:

private void NewBtn(string Name, int x, int y)
它的目的是创建一个模仿按钮行为的picturebox。别问为什么,我只是喜欢把事情复杂化,而且可以被呼叫任意次数

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);
现在,我担心的是绘画/图形部分忽略了代码的其余部分,我只给出了部分。当我称它为NewBtnName,x,y时,我想把我写为Name的文本放在void的中心。那么,我应该用什么来表示呢

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

var size = g.MeasureString(Name, btnFont);

e.Graphics.DrawString(Name, btnFont, Brushes.Black,
                      (S.Width - size.Width) / 2,
                      (S.Height - size.Height) / 2));
考虑到特定按钮/图片框的字体和文本不会改变,您可以通过只测量一次字符串来改善这一点

我还建议检查S.Size是否比Size宽/高,并处理它,这样图形就不会试图从负坐标开始绘制字符串

e.Graphics.DrawString(("Name", new Font("Arial", 16), Brushes.Black, 10, 10, drawFormat);
考虑到特定按钮/图片框的字体和文本不会改变,您可以通过只测量一次字符串来改善这一点

我还建议检查S.Size是否比Size宽/高,并处理它,这样graphics就不会尝试从负坐标开始绘制字符串。

尝试使用使用该选项的

e.Graphics.DrawString(("Name", new Font("Arial", 16), Brushes.Black, 10, 10, drawFormat);
这里有两个选项第一个使用坐标

e.Graphics.DrawString(("Name", new Font("Arial", 16), Brushes.Black, 10, 10, drawFormat);
第二种方法是创建一个矩形,如下所示:

 e.Graphics.DrawString("Name", new Font("Arial", 16), Brushes.Black, new Rectangle(0,0,this.Width,this.Height), drawFormat);
尝试使用使用该选项的

这里有两个选项第一个使用坐标

e.Graphics.DrawString(("Name", new Font("Arial", 16), Brushes.Black, 10, 10, drawFormat);
第二种方法是创建一个矩形,如下所示:

 e.Graphics.DrawString("Name", new Font("Arial", 16), Brushes.Black, new Rectangle(0,0,this.Width,this.Height), drawFormat);

很好用!非常感谢。还感谢另一个人的尝试,我很感激:工作完美!非常感谢。还感谢另一个人的尝试,我很感激:看起来很有趣,但是嘿,如果它能工作为什么要修复:将它保存到以后再尝试,不想错过任何东西,谢谢。看起来很有趣,但是嘿,如果它能工作为什么要修复:将它保存到以后再尝试,不想错过任何东西,谢谢。作为旁白,你真的应该更好地命名你的方法。该方法名称表示可以创建一个新按钮。方法名称应该是描述性的。在这种情况下,像AddNewPictureBoxI这样的东西我还在做,谢谢你的建议;顺便说一句,你真的应该更好地命名你的方法。该方法名称表示可以创建一个新按钮。方法名称应该是描述性的。在这种情况下,像AddNewPictureBoxI这样的东西我还在做,谢谢你的建议;