编辑:抱歉,我的不好,我忘了一条线。那些是干净的条件(全新的项目)
Form frm = new Form();
Graphics graphics = Graphics.FromHwnd(frm.Handle);
frm.FormBorderStyle = FormBorderStyle.None;
frm.WindowState = FormWindowState.Maximized;
frm.TransparencyKey = Color.Magenta;
frm.ShowDialog();
有了,没有第二行,我得到两个完全不同的结果..
为什么,当我从表单句柄创建图形对象时,它不会最大化表单...
我是唯一一个碰巧遇到的人吗?你知道为什么会发生这种情况(对我来说,或者根本没有)?非常感谢。
答案 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类的文档。