2014-02-17 44 views
0

我正在編寫一個應用程序,以便用戶可以直接在桌面上繪製註釋(圓形,直線,矩形等)。C#:直接在桌面上繪畫時避免桌面屏幕刷新

我使用從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); 
     } 
    } 
    } 
} 

當我按一下按鈕,一個矩形將在桌面上繪製。但是當我將鼠標移過矩形時,桌面將被重新繪製,我的矩形將消失。

有沒有一種方法可以使矩形永遠留在那裏(直到我清除圖形)?

謝謝。

+1

是的,請改爲創建一個窗口。 – GSerg

+0

我沒有一個方便的示例,但是您可以創建一個覆蓋整個桌面並在其上繪製的透明窗口。 –

+0

FWIW,您當前的程序不會調用'ReleaseDC'。這是一個很大的漏洞。 –

回答

4

有沒有一種方法可以讓矩形永遠留在那裏(直到我清除圖形)?

不是如果你堅持直接在桌面上繪圖。桌面窗口由系統擁有。當系統確定需要重新繪製時,例如因爲另一個窗口通過了桌面,它將重新繪製桌面。由於系統對您想要顯示的內容一無所知,因此它不能重新繪製註釋。

如果您希望持久狀態出現在桌面上,則必須創建一個窗口來繪製該狀態。創建一個透明的點擊窗口,並繪製你將在該窗口中的內容。

+0

我可以創建一個透明的窗口,但然後我可以點擊窗口,當我試圖在窗口上繪製某些東西時,它將會失去焦點。你知道我怎麼能克服這個? –

+0

我不明白這個問題。我想,你需要透明的窗口,點擊,以便用戶仍然可以訪問桌面。無論如何,你的問題就像我描述的那樣。您無法直接繪製桌面窗口的設備上下文。它不是持久的。這是Windows繪畫中的一個基本概念。 –

+0

@Kintarō您可以在窗體上以TopMost = True保持您的窗口高於其他窗口。 – Measuring