C#中的这种行为很奇怪。我有以下课程可以让我在桌面上有效地“画画”:
class drawOnDesktop {
public static Form dodF = new Form();
public static Graphics formGraphics;
public drawOnDesktop() {
formGraphics = dodF.CreateGraphics();
dodF.BackColor = Color.LightGreen;
dodF.TransparencyKey = Color.LightGreen;
dodF.Size = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
dodF.Location = new Point(0,0);
dodF.StartPosition = FormStartPosition.Manual;
//dodF.FormBorderStyle = FormBorderStyle.None;
dodF.WindowState = FormWindowState.Maximized;
dodF.MinimizeBox = false;
dodF.MaximizeBox = false;
dodF.ControlBox = false;
//dodF.TopMost = true; //For development in case something goes wrong
dodF.BringToFront();
dodF.Show();
}
public static void drawCircle(Point location) {
formGraphics.FillEllipse(Brushes.Black, location.X, location.Y, 10, 10);
}
}
我从我的主要表单中这样称呼它:
drawOnDesktop dod = new drawOnDesktop();
drawOnDesktop.drawCircle(new Point(100,100));
如果您运行该代码,则会在屏幕的左上角出现一个黑色的小圆圈。问题是你可以看到表单的边框。现在,尝试评论FormBorderStyle
行。黑点将出现几分之一秒,然后消失。为什么!?正如您所看到的,我在此表单上设置了 lot 属性,但它仍然拒绝工作。它是否被操作系统重新粉刷了?
我不需要担心鼠标事件或类似的东西 - 放置在屏幕上的点是完全程序化的,而不是来自用户。同样,如果我设置dodF.ShowInTaskbar = false
,则整个程序崩溃。
如何修复此代码,以便点出现并保持到formGraphics.Clear(Color.Black)
?
答案 0 :(得分:1)
不要随意保留图形副本,这只是在寻找麻烦。正如其他人所说,你应该使用paint事件在屏幕上绘制:
class drawOnDesktop
{
public Form dodF = new Form();
List<Point> circles = new List<Point>();
public drawOnDesktop()
{
dodF.BackColor = Color.LightGreen;
dodF.TransparencyKey = Color.LightGreen;
dodF.Size = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
dodF.Location = new Point(0, 0);
dodF.StartPosition = FormStartPosition.Manual;
dodF.FormBorderStyle = FormBorderStyle.None;
dodF.WindowState = FormWindowState.Maximized;
dodF.MinimizeBox = false;
dodF.MaximizeBox = false;
dodF.ControlBox = false;
dodF.TopMost = true; //For development in case something goes wrong
dodF.BringToFront();
dodF.Paint += dodF_Paint;
dodF.Show();
}
void dodF_Paint(object sender, PaintEventArgs e)
{
using (Graphics g = dodF.CreateGraphics())
{
foreach(Point location in circles)
g.FillEllipse(Brushes.Black, location.X, location.Y, 10, 10);
}
}
public void drawCircle(Point location)
{
circles.Add(location);
}
}
你可以用同样的方式调用它,但是现在每次重新绘制表单时,它都会重绘圆圈。