C# X和Y的Picturebox位置与在属性中输入的位置不同

C# X和Y的Picturebox位置与在属性中输入的位置不同,c#,C#,我有两个画框,一个英雄和一个敌人。英雄似乎在我在PictureBox(0,0)的属性中指定的位置加载良好。但是,我希望将敌人图片框设置为位置(90,90),我确实将其设置为该位置,但是当我运行windows窗体时(出于某种原因),它显示图片窗体位于位置(60,58) 英雄图片盒是绿色的,敌人是橙色的 我想做一个简单的游戏,并希望移动英雄的确切大小作为瓷砖,他是这样,如果你移动到敌人的地方,他们应该堆叠在对方的单位。我将表格设置为全尺寸(300300),两个图片框的大小均为(30,30)。因此,如

我有两个画框,一个英雄和一个敌人。英雄似乎在我在PictureBox(0,0)的属性中指定的位置加载良好。但是,我希望将敌人图片框设置为位置(90,90),我确实将其设置为该位置,但是当我运行windows窗体时(出于某种原因),它显示图片窗体位于位置(60,58)

英雄图片盒是绿色的,敌人是橙色的

我想做一个简单的游戏,并希望移动英雄的确切大小作为瓷砖,他是这样,如果你移动到敌人的地方,他们应该堆叠在对方的单位。我将表格设置为全尺寸(300300),两个图片框的大小均为(30,30)。因此,如果将它们设置在(0,0)的起始位置,它们应该能够向左和向右“移动”10次。我不确定是不是我的移动方法把我搞砸了,但我也不知道为什么当我试图将x和y的位置发布到控制台以调试这种情况时,x和y的位置是不同的——而不是我将其放置在窗体和属性中的90,90。理想情况下,我应该能够向左移动3次,向下移动3次,然后在敌人的上方移动,但这一点都不正确

有什么原因使它们不一样吗?我会附上照片和我的源代码


起始位置

英雄移动-他们不是直接在对方之上,而是应该在对方之上

敌人属性-显示大小和位置

英雄属性-显示大小和位置

代码


顺便说一句,行为部分下的pctrBxEnemy的属性显示了CenterImage。当CenterImage尝试将图像定位到客户区域的中心时,它可能会重新定位图片框

我试图加载你的项目。奇怪的是,敌人的位置是60,58。尽管如此,您可以在初始化时在代码中重写它(如下所示)。现在,当我按下3和3的权利-框完全重叠

public Form1()
    {
        InitializeComponent();
        Console.WriteLine("HERO STARTING LOCATION --- X = : {0} ---- Y = : {1}", pctrBxHero.Location.X, pctrBxHero.Location.Y);
        pctrBxEnemy.Location = new Point(90, 90);
    }

我无法在我的示例项目中重现您的问题

以下是我的输出:

HERO --- X = : 30 ---- Y = : 0
ENEMY --- X = : 90 ---- Y = : 90
HERO --- X = : 60 ---- Y = : 0
ENEMY --- X = : 90 ---- Y = : 90
HERO --- X = : 90 ---- Y = : 0
ENEMY --- X = : 90 ---- Y = : 90
HERO --- X = : 90 ---- Y = : 30
ENEMY --- X = : 90 ---- Y = : 90
HERO --- X = : 90 ---- Y = : 60
ENEMY --- X = : 90 ---- Y = : 90
HERO --- X = : 90 ---- Y = : 90
ENEMY --- X = : 90 ---- Y = : 90
在开始和移动后使用屏幕截图:

我使用的代码是:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private Font fnt = new Font("Lucida", 10);

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        int x = pctrBxHero.Location.X;
        int y = pctrBxHero.Location.Y;

        if (e.KeyCode == Keys.Right) x += 30;
        else if (e.KeyCode == Keys.Left) x -= 30;
        else if (e.KeyCode == Keys.Up) y -= 30;
        else if (e.KeyCode == Keys.Down) y += 30;

        pctrBxHero.Location = new Point(x, y);

        Console.WriteLine("HERO --- X = : {0} ---- Y = : {1}", x, y);
        Console.WriteLine("ENEMY --- X = : {0} ---- Y = : {1}", pctrBxEnemy.Location.X, pctrBxEnemy.Location.Y);
    }

    private void pctrBxHero_Paint(object sender, PaintEventArgs e)
    { 
        e.Graphics.DrawString("@", fnt, Brushes.Green, new Point(0, 0));
    }

    private void pctrBxEnemy_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawString("X", fnt, Brushes.Orange, new Point(0, 0));
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        fnt.Dispose();
    }

}
我注意到您有“pictureBox2\u Paint\u 1”,这意味着您在连接PictureBox之后重命名了它,并且您可能在一个点上有两个Paint()事件(因为它在末尾添加了“\u 1”)。有可能你只需要从新的图片盒开始;删除现有的、添加新的、重命名它们,然后重新设置它们的属性。最后,选择每一个,单击“闪电”图标查看它们的事件,然后重新连接它们的Paint()事件

**********编辑**********

这里有一种替代方法可以解决缩放问题。完全摆脱画框,在你的形体的绘画()事件中画出你的英雄和敌人。这可能看起来像:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
        sf.Alignment = StringAlignment.Center; // vertical center
        sf.LineAlignment = StringAlignment.Center; // horizontal center
    }

    private int boxSize = 30;
    private bool EnemyKilled = false;
    private Point pntHero = new Point(0, 0);
    private Point pntEnemy = new Point(3, 3);
    private Font fnt = new Font("Lucida", 10);
    private StringFormat sf = new StringFormat();

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Right) pntHero.Offset(1,0);
        else if (e.KeyCode == Keys.Left) pntHero.Offset(-1, 0);
        else if (e.KeyCode == Keys.Up) pntHero.Offset(0, -1);
        else if (e.KeyCode == Keys.Down) pntHero.Offset(0, 1);

        if (pntHero.Equals(pntEnemy))
        {
            EnemyKilled = true;
        }

        this.Invalidate();

        Console.WriteLine("HERO: " + pntHero.ToString());
        Console.WriteLine("ENEMY: " + pntEnemy.ToString());
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Rectangle rc;

        rc = new Rectangle(new Point(pntEnemy.X * boxSize, pntEnemy.Y * boxSize), new Size(boxSize, boxSize));
        e.Graphics.DrawRectangle(Pens.White, rc);
        e.Graphics.DrawString(EnemyKilled ? "X" : "O", fnt, Brushes.Orange, (RectangleF)rc, sf);

        rc = new Rectangle(new Point(pntHero.X * boxSize, pntHero.Y * boxSize), new Size(boxSize, boxSize));
        e.Graphics.DrawRectangle(Pens.White, rc);
        e.Graphics.DrawString("@", fnt, Brushes.Green, (RectangleF)rc, sf);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        fnt.Dispose();
    }

}

经过几个小时的混乱,我已经解决了我的问题。原来这是一个缩放问题

我已将表单
AutoScaleMode
属性设置为
“Font”
——这是默认设置

那就是缩小我的图片框和缩小我的表格。我认为问题之所以如此严重是因为我使用的是笔记本电脑和24英寸显示器。我在我的辅助显示器(24英寸)上运行该程序,它产生了扭曲的结果

由于高Dpi屏幕,现在每天按像素构建的东西似乎没有那么有效/吸引人

一旦我将表单
AutoScaleMode
切换到
Dpi
时,结果实际上产生了一个真正的300x300,我的图片框正是它们应该出现的位置

这有点烦人,我花了一段时间才意识到,但希望这能帮助其他人

我仍然不能确切地确定为什么像素/帧不会像我在属性中指定的那样显示为300x300,但现在已经解决了。如果有人知道,我很想知道为什么



谢谢。我投了更高的票,因为我没有意识到它被改变了。不过,它并没有解决我的问题,但我感谢您的帮助!它只会影响图像,不会影响pbox。更新了答案。。。强制敌人图片框的定位。我现在也很困惑,哈哈。谢谢你。你是对的,但我认为你是对的,我相信主要原因是,这是一个规模问题。与上面我的截图相比,看看你的图片框大小。经过一个多小时的纠结,我知道了原因。查看我文章的下半部分,在“编辑”行下面,寻找替代方法。
public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
        sf.Alignment = StringAlignment.Center; // vertical center
        sf.LineAlignment = StringAlignment.Center; // horizontal center
    }

    private int boxSize = 30;
    private bool EnemyKilled = false;
    private Point pntHero = new Point(0, 0);
    private Point pntEnemy = new Point(3, 3);
    private Font fnt = new Font("Lucida", 10);
    private StringFormat sf = new StringFormat();

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Right) pntHero.Offset(1,0);
        else if (e.KeyCode == Keys.Left) pntHero.Offset(-1, 0);
        else if (e.KeyCode == Keys.Up) pntHero.Offset(0, -1);
        else if (e.KeyCode == Keys.Down) pntHero.Offset(0, 1);

        if (pntHero.Equals(pntEnemy))
        {
            EnemyKilled = true;
        }

        this.Invalidate();

        Console.WriteLine("HERO: " + pntHero.ToString());
        Console.WriteLine("ENEMY: " + pntEnemy.ToString());
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Rectangle rc;

        rc = new Rectangle(new Point(pntEnemy.X * boxSize, pntEnemy.Y * boxSize), new Size(boxSize, boxSize));
        e.Graphics.DrawRectangle(Pens.White, rc);
        e.Graphics.DrawString(EnemyKilled ? "X" : "O", fnt, Brushes.Orange, (RectangleF)rc, sf);

        rc = new Rectangle(new Point(pntHero.X * boxSize, pntHero.Y * boxSize), new Size(boxSize, boxSize));
        e.Graphics.DrawRectangle(Pens.White, rc);
        e.Graphics.DrawString("@", fnt, Brushes.Green, (RectangleF)rc, sf);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        fnt.Dispose();
    }

}