From jmchillihiney's most excellent code bank sumission on Drawing:


The way GDI+ works, controls get repainted on screen over and over again, sometimes many times in quick succession. On each of these occasions the control's Paint event is raised. You need to use the Paint event of the control to perform your own drawing or else, the next time the control is repainted, your drawing will just disappear as the control paints over it.

When you're creating a custom control you should override the OnPaint method and perform your drawing there. When you're designing a form or user control and you want to add custom drawing to a child control you handle that control's Paint event, then perform your drawing in the event handler.

You may have seen, or heard people talk about, controls flickering on screen. That's caused by repainting large areas of the control repeatedly and happens because painting on screen is actually quite a slow process. As such, you should try to do as little of it as possible.
So, I am attempting to draw part of a custom control. I have placed a SplitContainer on a UserControl, and oriented it vertically. I then shrunk to top panel to 15 pixels in height.

I have two Methods which each draw a different type of Path + fill into the panel, and then draw a border around it (One is a gradient fill, and the other is just a plain color).

The idea is that when the user clicks on this panel, it switches from one to the other (a "Selected State" and "Not-Selected" state).

I have also created an icon which looks like the +/- widget on a treeview (or more specifically, on the vs2008 Toolbox, which is essentially what I am trying to emulate here . . .) which toggles as the control is selected/unselected. Not that ultimately, the selected state will change when the user selects OTHER controls, but the Expand/Collapse gizmo will toggle when the user clicks on the panel in question.

Again, check out the vs2008 toolbox. The Group "headers" are what I am after here.

Believe it or not, all of this now WORKS (gee me, look what I did!) EXCEPT the initialization. If I "Handle" the paint event of the SplitCOntainer.Panel1 object in any way which prevents the flickering jmc alludes to above, any redrawing required by either initialization OR hiding/unhiding of the host form is prevented. And it seems like the SplitContainer panel is constantly redraing (probably checking to see if the splitter has been moved).

I can post some code, but it is a little confusing, since I am dealing with some semi-complex interaction here. Also, It is not necssecarily structured well ()yet). AFTER I figured out the drawing bits, THEN I was going to try to do some refactoring and restructuring. Code Follows in next post.

If anyone has any thoughts or experience with this, I woul ddefinitely appreciate it!