从表单的句柄创建图形的奇怪行为

时间:2010-02-10 18:23:20

标签: c# winforms gdi+

编辑:抱歉,我的不好,我忘了一条线。那些是干净的条件(全新的项目)

        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 个答案:

答案 0 :(得分:3)

只是旁注。甚至还没有创建表单句柄:

    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 :(得分:1)

我在创建图形对象时发现了一些不稳定的行为。图形对象旨在用于短期使用。通常,以下两种方法最可靠:

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();

答案 2 :(得分:0)

尝试在frm.ShowDialog();之前处理图形对象。

答案 3 :(得分:0)

我之前经历过两次相似的行为。我没有针对您的问题的具体答案,但您必须首先确保在获取Graphics对象之前完全创建表单(显示/加载/处理创建)。在你的情况下,我会在ShowDialog调用后得到Graphics对象。从你的代码片段开始,这很难做到。)注意dboarman-FissureStudios“可靠”的方法,因为表单/控件是完全创建的,所以是可靠的。

另外,你为什么使用Graphics.FromHandle?我会使用Control.CreateGraphics方法。

此外,尚未创建表单的句柄。因此,调用Graphics.FromHandle是不正确的。

在创建像这样的Graphics对象并且不处理它时,我在使用表单之前遇到了问题。完成后,您必须调用Dispose方法。您无法存储Graphics对象。每次需要时,您必须创建并处理它。查看Graphics类的文档。