问题
I can do something as simple as:
- Create a new .NET form application
- Put a single RectangleShape onto the form
add the following into the InitializeComponent method in the designer code
Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or _ ControlStyles.UserPaint Or _ ControlStyles.DoubleBuffer, True) Me.UpdateStyles()
- Run the program
- Resize the form
- Watch angrily as the rectangle flickers
Is it possible to get rid of this? Or is the ShapeContainer internally flawed and I need to find a different solution?
回答1:
It's fairly flawed. It uses its own window that's overlaid onto the form with the WS_EX_TRANSPARENT style turned on. That style makes it invisible, but also prevents any kind of double-buffering from working properly. Double-buffering the form has no effect, wrong window.
It is otherwise a rather expensive way to draw shapes. The cheap and flicker-free way is using e.Graphics.FillRectangle() in the form's OnPaint() override or Paint event handler.
回答2:
I've never used the ShapeContainer but when ever I do custom graphics like that, I create a subclass for a Panel and in the constructor of my subclass I set DoubleBuffered to true.
More specific code example here.
来源:https://stackoverflow.com/questions/6585973/net-powerpacks-rectangleshape-flickers-on-form-resize