avoid flickering during sizing form

  • Thread starter Thread starter R.A.F.
  • Start date Start date
R

R.A.F.

Hi,

Basically i've read that under C++ we can avoid flickering forms during
sizing (maximize, minimize, restore,...) in SDi/MDI application.

I understood that for that i need to override the WndProc with WM_PAINT
and WM_SIZE messages.

however, under MFC there is a useful method called SetRedraw(bool);
it allows or not, to redraw the relative control.

i would like to know if a similar method exists under C# ?

thanks a lot,

RAF
 
Hi,

you can set the forms double buffered property to true
and you can set special style flags which can make the
painting of your the way you want it. Also you can override
the WndProc of the forms and catch window messages
and manipulate the windows message queue.

See here for the Flasg and Double Buffer:

[ControlStyles]
http://msdn2.microsoft.com/en-us/library/system.windows.forms.controlstyles(VS.80).aspx

[Control.DoubleBuffered Property]
http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered(VS.80).aspx

What i recommend is to set everything you want in
a class where you inerit from the control/form of
interesst and set its flags and properties in tis constructor.


Something like that here i made for a ListView Control
to reduce its filcker on redrawing new elements dramatically:


public REListView(){

//Activate double buffering

this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.EnableNotifyMessage, true);

protected override void OnNotifyMessage(Message m)

{

if(m.Msg !=
(int)REWin32ApiClass.Win32ApiConstants.WindowsMessages.WM_ERASEBKGND)

{

base.OnNotifyMessage(m);

}

}

Just see as example,...


Regards

Kerem

--
-----------------------
Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
(e-mail address removed)

Best Quote: "Ain't nobody a badass with a double dose
of rock salt...", Kill Bill Vol.2

Microsoft Live Space: http://kerem-g.spaces.live.com/
Latest Open-Source Projects: http://entwicklung.junetz.de
Sign my guestbook: http://entwicklung.junetz.de/guestbook/
 
thanks for the info but unfortunatelly it does not help me.
so i do not know what to do :-(
 
Basically it seems to flick due to SDI child form frame, client area and
its caption.
so, somehow i need to block drawing of this SDI child form till it is
not maximized, and once it is done...to show this form...

but how to do it ?
 
so i finally solve my problem as following :

in my main form (SDI parent form), i have a private data member named
fOption defined as :
FOptions fOption; // refering to my form called "Options"

// later on my menuitem

private void MenuOptions_Click(object sender, EventArgs e)
{
TSContainer.ContentPanel.Controls.Clear();
if (this.fOption != null)
{
fOption.SuspendLayout();
fOption.Parent = TSContainer.ContentPanel;
NativeMethods.SendMessage(fOption.Handle, (int)(Msg_WM.WM_SETREDRAW),
0, 0);
fOption.WindowState = FormWindowState.Maximized;
NativeMethods.SendMessage(fOption.Handle, (int)(Msg_WM.WM_SETREDRAW),
1, 0);
fOption.ResumeLayout();
}
else
{
fOption = new FOptions();
fOption.TopLevel = false;
fOption.Parent = TSContainer.ContentPanel;
fOption.WindowState = FormWindowState.Maximized;
fOption.Show();
}
}

this avoid user to see fOption form flicks (caption, bar, frame +
process to maximize it) when SDI child is going to be shift from another
child form to this fOption form.

Does a better method exist ?
thanks a lot,

RAF.

R.A.F. said:
Basically it seems to flick due to SDI child form frame, client area and
its caption.
so, somehow i need to block drawing of this SDI child form till it is
not maximized, and once it is done...to show this form...

but how to do it ?
Hi,

you can set the forms double buffered property to true
and you can set special style flags which can make the
painting of your the way you want it. Also you can override
the WndProc of the forms and catch window messages
and manipulate the windows message queue.

See here for the Flasg and Double Buffer:

[ControlStyles]
http://msdn2.microsoft.com/en-us/library/system.windows.forms.controlstyles(VS.80).aspx


[Control.DoubleBuffered Property]
http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered(VS.80).aspx


What i recommend is to set everything you want in
a class where you inerit from the control/form of
interesst and set its flags and properties in tis constructor.


Something like that here i made for a ListView Control
to reduce its filcker on redrawing new elements dramatically:


public REListView(){

//Activate double buffering

this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.EnableNotifyMessage, true);

protected override void OnNotifyMessage(Message m)

{

if(m.Msg !=
(int)REWin32ApiClass.Win32ApiConstants.WindowsMessages.WM_ERASEBKGND)

{

base.OnNotifyMessage(m);

}

}

Just see as example,...


Regards

Kerem
 
Back
Top