2011-03-02 43 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,并且最重要的是它不会闪烁。