Странный способ создания графики из ручки формы - PullRequest
2 голосов
/ 10 февраля 2010

РЕДАКТИРОВАТЬ: извините, мой плохой, я забыл строку. и это чистые условия (совершенно новый проект)

        Form frm = new Form();
        Graphics graphics = Graphics.FromHwnd(frm.Handle);
        frm.FormBorderStyle = FormBorderStyle.None;
        frm.WindowState = FormWindowState.Maximized;
        frm.TransparencyKey = Color.Magenta;

        frm.ShowDialog();

со второй строкой и без нее я получаю два совершенно разных результата.

почему, когда я создаю графический объект из дескриптора формы, он не максимизирует форму ...

я единственный, с кем это случилось? у вас есть идея, почему это происходит (со мной или вообще)?

Большое спасибо.

Ответы [ 4 ]

3 голосов
/ 02 марта 2011

Просто примечание. Дескриптор формы еще даже не создан:

    Form frm = new Form();
    if (frm.IsHandleCreated == true)
    {

      // Doesn't get here
    }
    Graphics graphics = Graphics.FromHwnd(frm.Handle);

Может быть, вы ищете что-то вроде:

                Form frm = new Form();
                frm.HandleCreated += (s, ev) =>
                    {
                        if (frm.IsHandleCreated == true)
                        {
                            Graphics graphics = Graphics.FromHwnd(frm.Handle);
// FIXME not sure what you want to do, but drawing into this still won't work.

                        }
                    };

                frm.Paint += (s, ev) =>
                    {
                        ev.Graphics.DrawLine(Pens.Black, 10, 10, 100, 100);

                    };

                frm.FormBorderStyle = FormBorderStyle.None;
                frm.WindowState = FormWindowState.Maximized;
                frm.TransparencyKey = Color.Magenta;

                frm.ShowDialog();
1 голос
/ 12 февраля 2010

Я обнаружил некоторые ошибочные поведения при создании графического объекта. Графический объект предназначен для кратковременного использования. Обычно следующие 2 метода являются наиболее надежными:

private void Form1_Paint(object sender , PaintEventArgs e)
{
    Graphics g = e.Graphics;

    this.FormBorderStyle = FormBorderStyle.None;
    this.WindowState = FormWindowState.Maximized;
    this.TransparencyKey = Color.Magenta;

}

OR

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;

    this.FormBorderStyle = FormBorderStyle.None;
    this.WindowState = FormWindowState.Maximized;
    this.TransparencyKey = Color.Magenta;

    base.OnPaint(e);
}

Кроме того, поскольку вы не создаете графический объект вручную, вы не выполняете g.Dispose();

0 голосов
/ 04 марта 2010

Я уже два раза сталкивался с подобным поведением. У меня нет конкретного ответа на ваш вопрос, но вы должны убедиться, что форма полностью создана (отображена / загружена / обработана), прежде чем получить объект Graphics. В вашем случае я бы получил объект Graphics после вызова ShowDialog. Из вашего фрагмента кода это будет трудно сделать.) Обратите внимание, что «надежные» методы dboarman-FissureStudios надежны, поскольку форма / элемент управления полностью созданы.

Кроме того, почему вы используете Graphics.FromHandle? Я бы использовал метод Control.CreateGraphics.

Более того, дескриптор формы еще не создан. Поэтому вызов Graphics.FromHandle неверен.

У меня раньше были проблемы с формами, когда я создавал графический объект, а не выбрасывал его. Вы должны вызвать метод Dispose, как только закончите. Вы не можете хранить графический объект. Вы должны создавать и распоряжаться им каждый раз, когда вам это нужно. Ознакомьтесь с документацией для класса Graphics.

0 голосов
/ 12 февраля 2010

Попробуйте утилизировать графический объект до frm.ShowDialog();.

...