Preventing OnDrawItem from being called?
in an inherited TabControl that's being ownerDrawn, is there any way to prevent OnDrawItem from being called when the width of the control is changed? essentially i need the tabstrip to stay the same but im changing the width of the control for the needed functionality (animated sliding right-aligned tabcontrol) ..i have a timer going while the width is < the itemSize height or whatever..it FUNCTIONS fine it's just that OnDrawItem() is getting called for each of the tabs EACH time the width is changed and it's causing horrible flickering, even with double buffering..i've set ControlStyle.ResizeRedraw to false without any luck, it's still calling OnDrawItem -- just wondering if there's any way to prevent OnDrawItem from being called, or preventing it from DOING anything when i'm animating (i've tried setting a boolean while im animating and if (!currently_animating) { // do my DrawItem functionality here } but it's still doing some base set of drawing (I'm assuming the separator lines and such) ..any ideas? Thanks!
-Randy
Just wanted to make sure you set the double buffering correctly -- this generally requires setting three styles, right? Did you set all three to true (AllPaintinginWMPaint, UserPaint, and DoubleBuffer)? And did you move all painting code to the overridden Paint event? Otherwise, I don't believe double-buffering can work.
here are the 5 controlflags i have set:
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint,true);
this.SetStyle(ControlStyles.DoubleBuffer,true);
this.SetStyle(ControlStyles.Selectable,true);
this.SetStyle(ControlStyles.ResizeRedraw,false);
Well, those look cool. The only other "simple" suggestion I can make is to verify that all your painting happens in the Paint event--that is, you don't grab a graphics object anywhere else other than your Paint event.
actually that is the problem..damn.
quick one for you, how would i construct the DrawItemEventArgs to send to OnDrawItem()?
right now in my OnPaint override:
if (!this._moving)
{
for (int i=0;i<this.TabCount;i++)
{
}
}
..but im not sure how to construct the DrawItemEventArgs for each tab because of the Rectangle required..how would i figure out the Rectangle to send it?
I haven't done an ownerdraw Tab, so I'm not up on the details (done combo/list/menu, but never tabs). Seems to me that you must somehow indicate from within the code that's painting your tabs that you need to have painting done (i usually set class-level flags for this) and then invalidate the form. In the Paint event, you check the flag and redraw the thing that needs to be redrawn.
TabControl has a GetTabRect that returns the rectangle for the tab.
Regarding your initial issue, you might be able to p/invoke the Win32 api LockWindowUpdate that is supposed to prevent Paint messages from being processed. Don't forget to "unlock" the window when you are done with your animation effect.
-mark