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