2015-08-29 83 views
1

問題示例: 我有一個控件可以繪製一些幾何圖形(我使用面板)。 我畫了一條線。 現在,當我將光標移動到其中一條線的提示時,我希望將該點「突出顯示」(圍繞它畫出一個實心圓)。 當我將光標從點移開時,我希望「高亮」圓被擦除,但我不想重繪該線。Winforms多層圖形

所以,從技術上講,我需要兩層: 第一層來繪製我的線。 第2層繪製/擦除高光。 我不想每次在第二層繪製/擦除東西時重繪第一層。

有什麼建議嗎?

+2

@HighCore建議使用WPF,但不推薦使用'winforms','WPF'不需要10%的時間,代碼和工作量。 – Loathing

回答

1
  • 選項1:另一個Panel在底部之一。這對覆蓋包括半透明度的圖形很有用。 (嵌套意味着:panel2.Parent = panel1)如果需要,可以嵌套許多圖層。

  • 選項2:繪製PanelBackgroundImage並使用繪圖表層爲interactivce東西。

我注意到,你「不想再畫線」。這不是你在做圖形時通常會說/做/嘗試的。如果你認真對待這個選項2!

繪製的控制和位圖和here使用選項2,顯示的橫爲位圖上方的光標的另一個例子的差見here

順便說一句,這兩個選項並不是相互排斥的:你可以窩​​與BackgroundImages,並畫上了最上面的一個互動的東西..

+0

透明度在Windows窗體中效果不佳,特別是如果您通過獨立事件重繪每個圖層。解決方案是在繪製第二層之前保留第一層的「複製」。在進行新的重繪時,複製保存的圖像並進行第二次繪圖。 – Graffito

+0

對__overlapping__控件爲真。但是__nested__控件在Winform的僞裝透明度下工作得很好。 – TaW

+0

@ TaW - 快速反應:)。我甚至沒有完成我的評論,因爲我經常在CR上鍵入[Enter]鍵,什麼觸發了我的評論的早期驗證... – Graffito

0

@TaW幾乎回答了這個問題。我樹立了一個榜樣:

對於靜態圖中:

private Bitmap myStaticImage; 

public Form2() 
{ 
    InitializeComponent(); 

    this.myStaticImage = new Bitmap(200, 100); 

    Graphics g = Graphics.FromImage(this.myStaticImage); 

    g.DrawLine(Pens.Red, new Point(0, 0), new Point(200, 0)); 

    this.panel1.BackgroundImage = this.myStaticImage; 
} 

對於動態繪圖:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    // Stuff 
} 

我建議使用PictureBoxDoubleBuffered屬性設置爲true的UserControlPanel控件不是雙緩衝的,會閃爍。