【问题标题】:C#: Avoid desktop screen refresh when painting on the desktop directlyC#:直接在桌面上绘画时避免桌面屏幕刷新
【发布时间】:2014-02-18 06:02:39
【问题描述】:

我正在编写一个应用程序,用户可以直接在桌面上绘制注释(圆、线、矩形等)。

我正在使用来自 User32.dll 的 GetDC 并成功在桌面上绘制了一个矩形:

namespace Annotation
{
   public partial class BaseForm : Form
   {
    [DllImport("User32.dll")]
    static extern IntPtr GetDC(IntPtr hwnd);

    [DllImport("User32.dll")]
    static extern void ReleaseDC(IntPtr dc);

    public BaseForm()
    {
        InitializeComponent();
        BackColor = Color.Lime;
        TransparencyKey = Color.Lime; 
    }

    private void button1_Click(object sender, EventArgs e)
    {
        IntPtr desktop = GetDC(IntPtr.Zero);
        using (Graphics g = Graphics.FromHdc(desktop))
        {
            g.FillRectangle(Brushes.Red, 0, 0, 100, 100);
        }
    }
  }
}

当我单击按钮时,桌面上将绘制一个矩形。但是当我将鼠标移到矩形上时,桌面会被重绘,我的矩形会消失。

有没有办法可以让矩形永远留在那里(直到我清除绘图)?

谢谢。

【问题讨论】:

  • 是的,改为创建一个窗口。
  • 我手头没有示例,但您可以创建一个覆盖整个桌面的透明窗口并在其上绘图。
  • FWIW,你当前的程序没有调用ReleaseDC。这是一个很大的泄漏。

标签: c#


【解决方案1】:

有没有一种方法可以让矩形永远留在那里(直到我清除绘图)?

如果您坚持直接在桌面上绘图,则不会。桌面窗口归系统所有。当系统决定需要重新绘制它时,例如因为另一个窗口经过桌面,它会重新绘制桌面。由于系统对您希望显示的内容一无所知,因此无法重新绘制您的注释。

如果您希望持久状态出现在桌面上,您必须创建一个窗口来绘制该状态。创建一个透明的点击窗口,然后在该窗口中绘制您想要的内容。

【讨论】:

  • 我可以创建一个透明的窗口,然后我可以点击这些窗口,这样当我尝试在该窗口上绘制某些东西时,它就会失去焦点。你知道我该如何克服这个问题吗?
  • 我不明白这个问题。我想您需要窗口是透明的,单击以使用户仍然可以访问桌面。无论如何,您的问题正如我所描述的那样。您不能直接绘制到桌面窗口的设备上下文。它不是持久的。这是 Windows 绘画中的一个基本概念。
  • @Kintarō 您可以在表单上使用 TopMost = True 将窗口保持在其他窗口之上。
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多