2011-03-02 75 views
0

我有一個自定義控件,我用它作爲橡皮筋繪製藍色邊框和半透明中間。我正在處理鼠標向下/移動事件以調整面板大小。當鼠標移動事件被調用時,一切似乎都能正常工作,它全部按照我的預期繪製,但是當鼠標停止移動時,半透明下方的某些自定義控件正在重繪自己。用z順序玩耍什麼都不會做。半透明面板顯示下方的控件

這裏是透明面板:

 protected override CreateParams CreateParams 
     { 
      get 
      { 
       CreateParams cp = base.CreateParams; 
       cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT 
       return cp; 
      } 
     } 

     protected override void OnPaint(PaintEventArgs pe) 
     { 
      pe.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 101, 135, 196)), this.ClientRectangle); 
      pe.Graphics.DrawRectangle(Pens.DarkBlue, 
       pe.ClipRectangle.Left, 
       pe.ClipRectangle.Top, 
       this.Width - 1, 
       this.Height - 1); 
     } 

     protected override void OnPaintBackground(PaintEventArgs pevent) 
     { 
      //do not allow the background to be painted 
     } 

     protected override void OnSizeChanged(EventArgs e) 
     { 
      base.OnSizeChanged(e); 
     } 
+0

您的控件是否從Panel類派生? – 2011-03-02 15:48:07

+0

不,只是用戶控制 – 2011-03-02 16:22:28

+0

會發生什麼情況是,通過透明控件(無透明控件獲取無效)在油漆底下獲取無效的控件。你想以這種方式實現將是非常困難的。我們在我們的一個項目中進行了全面的測試,並通過在運行時修改對API的調用,完全重定向了WinForms控件的渲染。但這很難,需要很長時間。如果你有這種可能性,你可能需要考慮WPF的這個用例。或者製作UI WPF的一部分並在WinForms中託管它。 – 2011-03-03 00:18:49

回答

0

所以,事實證明這是一個非常棘手的問題與半透明度(即使微軟已經在資源管理器等做了)。最後我破解了一個解決方案,中間現在完全透明,橡皮筋只是一個邊界。

邊框仍然繪製在某些控件的下方,因此對於每個控件,我們在它們的Paint事件中添加一條語句,如果rubberBand可見,則調用ruberBand.Invalidate()。嘿presto,一個黑色的橡皮筋,超越控制。

IMO仍然比使用DrawReversibleRectangle更好,因爲您可以在面板內部使用autoscrolling,並且最重要的是它不會閃爍。