1

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。黒い点が一瞬表示され、消えます。どうして!?ご覧のとおり、このフォームに多くのプロパティを設定しましたが、それでも機能しません。OSによって再描画されていますか?

マウス イベントなどについて心配する必要はありません。画面上に配置されるドットは、ユーザーによるものではなく、完全にプログラムによるものです。また、 を設定dodF.ShowInTaskbar = falseすると、プログラム全体がクラッシュします。

このコードを修正して、ドットが表示され、私まで残るようにするにはどうすればよいformGraphics.Clear(Color.Black)ですか?

4

1 に答える 1

1

グラフィックのコピーを残さないでください。それは単に問題を引き起こしているだけです。他の人が述べているように、画面に描画するにはペイントイベントを使用する必要があります。

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

同じように呼び出すこともできますが、フォームが再描画されるたびに、円が再描画されます。

于 2012-11-10T19:58:48.260 に答える