MDI子窗体切换的问题 子窗体最大化的时候,MDI子窗体切换的时候会闪一下(切换的窗体最大化,之前的窗体normal化)可不可以避免? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 打开窗口双缓存试试!Form.doubleBuffer = true; 为什么以前的窗口要nomral化?所有的窗口都最大化,然后隐藏其他窗口行不行?你说的东西如果一定要这样的话。Resize过程明显我认为是OnPaint太复杂造成的。可不可以在Resize的时候简化OnPaint过程 这个问题我也想问,用Mdi最大化的时候,都会很慢的,不知道为什么 回复3楼darkkeeper 不知道你是否作过MDIMDI默认就是这样的,窗口最大化的时候,就是当前窗口最大化,其他窗口状态不变只有选择某一个窗口的时候,这个窗口才最大化,之前的窗口还会自动normal化 自己再顶顶,微软真是可恶,自己用这好的东西,却把这等残次品API和类库给外人用 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); } } 自己去看吧,要不你自己写个Form 你在子窗体的load里用代码写使窗体最大化。微软真是可恶,自己用这好的东西,却把这等残次品API和类库给外人用。是的,这个就是微软的害处啊。 回楼上clocke :对阿,就是您说的那样,请问有没有解决或者折中的想法或方案。回c863123:在load里面做处理没用,每次切换的时候,MDI还是自动的更改了(当前子窗体最大化,其他normal) 感谢关注~! 呵呵,那就和我前阵子做的MDI程序差不多了,回去再详细解答,现在上班ING~ 让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();起作用也是两三行代码了,如果不满意别骂我^_^... 再顶一次,clocke 的方法只能解决刚刚打开form时候的闪烁,而且副作用比较大,没有了window自带的排列。yuwenge 的方法在全屏的时候也ok,但是父窗口normal的时候,解锁会造成整个屏幕都闪一下有没有只是锁定父窗口的方法呢?谢谢各位 70分在线急等:List 怎么转换成Dictionary java程序运行平台的更换 请问大家,在datagrid中直接修改了数据之后,怎么将修改后的结果保存到数据库中并在DataGrid中显示 请问winform中右上方的退出×怎么添加事件? 如何调整TreeView控件Nodes显示的间距 数据库,存储过程 和 SQL语句怎么用 C#应用 vs2008字体异常,请问是何原因?如何解决? 本人初学,请各位看下这段代码那里错了? 请问如何填充TreeView? VS2005可视化数据集编辑向导能否在SQL语句中指定参数? 多线程下载在 dataGridView显示的问题?
Form.doubleBuffer = true;
不知道你是否作过MDIMDI默认就是这样的,窗口最大化的时候,就是当前窗口最大化,其他窗口状态不变
只有选择某一个窗口的时候,这个窗口才最大化,之前的窗口还会自动normal化
微软真是可恶,自己用这好的东西,却把这等残次品API和类库给外人用
{
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);
}
}
微软真是可恶,自己用这好的东西,却把这等残次品API和类库给外人用。
是的,这个就是微软的害处啊。
让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();
起作用也是两三行代码了,如果不满意别骂我^_^...
yuwenge 的方法在全屏的时候也ok,但是父窗口normal的时候,解锁会造成整个屏幕都闪一下
有没有只是锁定父窗口的方法呢?谢谢各位