子窗体最大化的时候,
MDI子窗体切换的时候会闪一下(切换的窗体最大化,之前的窗体normal化)
可不可以避免?

解决方案 »

  1.   

    打开窗口双缓存试试!
    Form.doubleBuffer = true;
      

  2.   

    为什么以前的窗口要nomral化?所有的窗口都最大化,然后隐藏其他窗口行不行?你说的东西如果一定要这样的话。Resize过程明显我认为是OnPaint太复杂造成的。可不可以在Resize的时候简化OnPaint过程
      

  3.   

    这个问题我也想问,用Mdi最大化的时候,都会很慢的,不知道为什么
      

  4.   

    回复3楼darkkeeper 
    不知道你是否作过MDIMDI默认就是这样的,窗口最大化的时候,就是当前窗口最大化,其他窗口状态不变
    只有选择某一个窗口的时候,这个窗口才最大化,之前的窗口还会自动normal化
      

  5.   

    自己再顶顶,
    微软真是可恶,自己用这好的东西,却把这等残次品API和类库给外人用
      

  6.   

    protected virtual void CreateHandle()
            {
                IntPtr zero = IntPtr.Zero;
                if (this.GetState(0x800))
                {
                    throw new ObjectDisposedException(base.GetType().Name);
                }
                this.SetState(0x40000, true);
                if (Application.UseVisualStyles)
                {
                    zero = UnsafeNativeMethods.ThemingScope.Activate();
                }
                Rectangle bounds = this.Bounds;
                try
                {
                    System.Windows.Forms.CreateParams createParams = this.CreateParams;
                    this.SetState(0x40000000, (createParams.ExStyle & 0x400000) != 0);
                    if (this.parent != null)
                    {
                        Rectangle clientRectangle = this.parent.ClientRectangle;
                        if (!clientRectangle.IsEmpty)
                        {
                            if (createParams.X != -2147483648)
                            {
                                createParams.X -= clientRectangle.X;
                            }
                            if (createParams.Y != -2147483648)
                            {
                                createParams.Y -= clientRectangle.Y;
                            }
                        }
                    }
                    if ((createParams.Parent == IntPtr.Zero) && ((createParams.Style & 0x40000000) != 0))
                    {
                        Application.ParkHandle(createParams);
                    }
                    this.window.CreateHandle(createParams);
                    this.UpdateReflectParent(true);
                }
                finally
                {
                    this.SetState(0x40000, false);
                    UnsafeNativeMethods.ThemingScope.Deactivate(zero);
                }
                if (this.Bounds != bounds)
                {
                    LayoutTransaction.DoLayout(this.ParentInternal, this, PropertyNames.Bounds);
                }
            }
      

  7.   

    自己去看吧,要不你自己写个Form
      

  8.   

    你在子窗体的load里用代码写使窗体最大化。
    微软真是可恶,自己用这好的东西,却把这等残次品API和类库给外人用。
    是的,这个就是微软的害处啊。
      

  9.   

    回楼上clocke :对阿,就是您说的那样,请问有没有解决或者折中的想法或方案。回c863123:在load里面做处理没用,每次切换的时候,MDI还是自动的更改了(当前子窗体最大化,其他normal) 感谢关注~!
      

  10.   

    呵呵,那就和我前阵子做的MDI程序差不多了,回去再详细解答,现在上班ING~
      

  11.   

                
    让LZ失望了,前两天心情十分不好,所以即使有来CSDN也不想发帖子!至于你出现的问题在我看来其实很简单,每个子窗体被最激活时是NORMAL模式;如果有多个子窗体,那么所有子窗体起始(深蓝色的边框)位置从父窗体中从上到下呈对角线向下排,因为在切换子窗体时系统都会重绘子窗体界面,所以在SHOW子窗体时把只要设置好子窗体的SHOW的起始位置就好了!
                //设置运行窗体的起始位置
                childrenWindow.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
                //设置起始位置的具体位置,这个参数可以根据实际情况设置!例如如果工具有几排,那么Y参数就要对应相减,
                childrenWindow.Location = new Point(-3, -30);
                //最大化显示
                childrenWindow.WindowState = System.Windows.Forms.FormWindowState.Maximized;
                childrenWindow.Show();
    起作用也是两三行代码了,如果不满意别骂我^_^...
      

  12.   

    再顶一次,clocke 的方法只能解决刚刚打开form时候的闪烁,而且副作用比较大,没有了window自带的排列。
    yuwenge 的方法在全屏的时候也ok,但是父窗口normal的时候,解锁会造成整个屏幕都闪一下
    有没有只是锁定父窗口的方法呢?谢谢各位