470,631 Members | 1,820 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,631 developers. It's quick & easy.

avoid flickering during sizing form

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
Nov 21 '07 #1
4 4547
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/lib...es(VS.80).aspx

[Control.DoubleBuffered Property]
http://msdn2.microsoft.com/en-us/lib...ed(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.WindowsMess ages.WM_ERASEBKGND)

{

base.OnNotifyMessage(m);

}

}

Just see as example,...
Regards

Kerem

--
-----------------------
Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
ke*****@arcor.de

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/
-----------------------
"This reply is provided as is, without warranty express or implied."

Nov 21 '07 #2
thanks for the info but unfortunatelly it does not help me.
so i do not know what to do :-(
Kerem Gümrükcü wrote:
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/lib...es(VS.80).aspx

[Control.DoubleBuffered Property]
http://msdn2.microsoft.com/en-us/lib...ed(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.WindowsMess ages.WM_ERASEBKGND)

{

base.OnNotifyMessage(m);

}

}

Just see as example,...
Regards

Kerem
Nov 21 '07 #3
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 ?

Kerem Gümrükcü wrote:
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/lib...es(VS.80).aspx

[Control.DoubleBuffered Property]
http://msdn2.microsoft.com/en-us/lib...ed(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.WindowsMess ages.WM_ERASEBKGND)

{

base.OnNotifyMessage(m);

}

}

Just see as example,...
Regards

Kerem
Nov 21 '07 #4
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. wrote:
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 ?

Kerem Gümrükcü wrote:
>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/lib...es(VS.80).aspx
[Control.DoubleBuffered Property]
http://msdn2.microsoft.com/en-us/lib...ed(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.OptimizedDoubleBuff er |
ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.EnableNotifyMessage , true);

protected override void OnNotifyMessage(Message m)

{

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

{

base.OnNotifyMessage(m);

}

}

Just see as example,...
Regards

Kerem
Nov 21 '07 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

6 posts views Thread by Joaquin Grech | last post: by
2 posts views Thread by John Lee | last post: by
2 posts views Thread by John Lee | last post: by
8 posts views Thread by benben | last post: by
5 posts views Thread by n00b | last post: by
6 posts views Thread by Mark Thompson | last post: by
5 posts views Thread by jtalbot_vizible | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.