И ссылка на объект требуется для нестатического поля, метода или свойства - PullRequest
0 голосов
/ 11 июля 2011

Я пытаюсь нарисовать вещи в форме через класс. Вот код.

public static void DrawStatBars()
    {
        Graphics g = Graphics.FromImage(Graphic.StatBarBackbuffer);
        Font fnt = new Font("Microsoft Sans Serif", 8, FontStyle.Bold);
        g.DrawImage(Graphic.EmptyHPBar, new Point(12, 12));
        g.DrawImage(Graphic.EmptyManaBar, new Point(12, 35));
        g.DrawImage(Graphic.EmptyEXPBar, new Point(12, 58));
        g.DrawImage(Graphic.HPBar, new Rectangle(12, 15, (int)picHpWidth, Graphic.HPBar.Height), new Rectangle(0, 0, (int)picHpWidth, Graphic.HPBar.Height), GraphicsUnit.Pixel);
        g.DrawImage(Graphic.ManaBar, new Rectangle(12, 38, (int)picManaWidth, Graphic.ManaBar.Height), new Rectangle(0, 0, (int)picManaWidth, Graphic.ManaBar.Height), GraphicsUnit.Pixel);
        g.DrawImage(Graphic.EXPBar, new Rectangle(12, 61, (int)picEXPWidth, Graphic.EXPBar.Height), new Rectangle(0, 0, (int)picEXPWidth, Graphic.EXPBar.Height), GraphicsUnit.Pixel);
        g.DrawString(lblHPText, fnt, new SolidBrush(Color.Black), 40, 15);
        g.DrawString(lblManaText, fnt, new SolidBrush(Color.Black), 40, 38);
        g.DrawString(lblEXPText, fnt, new SolidBrush(Color.Black), 40, 63);
        g.Dispose();


        g = frmMainGame.picGeneral.CreateGraphics;
        g.DrawImage(Graphic.StatBarBackbuffer, new Point(0, 0));
        g.Dispose();
    }

Проблема в g = frmMainGame.picGeneral.CreateGrpahics;. Поскольку элемент управления не является статическим, как бы мне получить доступ к нему через класс вместо перемещения кода и необходимости перекодировать его, чтобы он был в коде самой формы.

Ответы [ 2 ]

0 голосов
/ 11 июля 2011

Вы можете добавить событие для обработки вашего метода PictureBox.Paint

private void picGeneral_Paint(object sender, PaintEventArgs e)
{
    // Use e.Graphics to do your drawing!
    e.Graphics.DrawStatsBars();
}

Превратите ваш метод в метод расширения

public static class GraphicsExtensions
{
    public static void DrawStatsBars(this Graphics g)
    {
        // Your code
    }
}
0 голосов
/ 11 июля 2011

На ум приходит пара вариантов:

  1. Передайте проблему вызывающей стороне, то есть заставьте ее передать фактическую ссылку в качестве параметра. Если они не знают, тогда попросите своего абонента передать его и т. Д. В конце концов, кто-то должен знать, какой объект вам нужно использовать.
  2. Если вы знаете, что будет только одна интересная ссылка, то вы можете хранить ее статически где-нибудь, когда объект будет создан. В зависимости от структуры вашего приложения вы можете сохранить его в собственном классе объекта, в классе создателя, в классе пользователя или в классе приложения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...