在无边框表格上绘制图形

时间:2012-11-10 19:12:22

标签: c# .net graphics

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)

1 个答案:

答案 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);
    }
}

你可以用同样的方式调用它,但是现在每次重新绘制表单时,它都会重绘圆圈。