c# win 父窗口 随 子窗口 最小最大化变化而变化

bososoft 2011-11-16 11:59:09
也就是

父随 子 this.WindowState = FormWindowState.Minimized;
this.WindowState = FormWindowState.Normal


怎样实现
...全文
342 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
bososoft 2011-11-17
  • 打赏
  • 举报
回复
嵌入也可以 『不过就得再处理 Form2的透明 这块我不用作答』
飞天凤凰601 2011-11-17
  • 打赏
  • 举报
回复
form1代码

const int WM_SYSCOMMAND = 0x112;
const int SC_CLOSE = 0xF060;
const int SC_MINIMIZE = 0xF020;
const int SC_MAXIMIZE = 0xF030;

protected override void WndProc(ref Message SystemMessage)
{
switch (SystemMessage.Msg)
{
case WM_SYSCOMMAND:
if (((int)SystemMessage.WParam) == 0xf040)
{
//最小化事件代码
this.WindowState = FormWindowState.Normal;
f2.WindowState = FormWindowState.Normal;

}
else
{
base.WndProc(ref SystemMessage);
}
break;
default:
base.WndProc(ref SystemMessage);
break;
}
}


Form2 f2 = new Form2();
private void button1_Click(object sender, EventArgs e)
{

f2.Owner = this;
f2.ShowDialog();
}

public void Formmin()
{
this.WindowState = FormWindowState.Minimized;
}


private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Normal)
{
f2.ShowDialog();
}
}


form2代码

const int WM_SYSCOMMAND = 0x112;
const int SC_CLOSE = 0xF060;
const int SC_MINIMIZE = 0xF020;
const int SC_MAXIMIZE = 0xF030;

protected override void WndProc(ref Message SystemMessage)
{
switch (SystemMessage.Msg)
{
case WM_SYSCOMMAND:
if (((int)SystemMessage.WParam) == SC_MINIMIZE)
{
//最小化事件代码
Form1 f1 = (Form1)this.Owner;
f1.Formmin();
this.WindowState = FormWindowState.Normal;
this.Hide();

}
else
{
base.WndProc(ref SystemMessage);
}
break;
default:
base.WndProc(ref SystemMessage);
break;
}
}
bososoft 2011-11-17
  • 打赏
  • 举报
回复
对 oysy(太阳之子) 谢谢 你说的对

Form2 是半透明的 所以不能嵌入 Form1里
bososoft 2011-11-17
  • 打赏
  • 举报
回复
过程是这样的
1: 父 Form1 上有个按钮 点击弹出 Form2.ShowDialog()

注:『要保证 Form2 在 Form1上』

2: Form2上有个按钮 点击 成最小化 同时 Form1 也成最小化

注:『Form2 最好 ShowIcon = false;ShowInTaskbar = false;』


3:点击 最小化的 Form1 两个窗口同时 this.WindowState = FormWindowState.Normal




飞天凤凰601 2011-11-17
  • 打赏
  • 举报
回复
这句话的叙述有严重问题,造成错误
“1: 父 Form1 上有个按钮 点击弹出 Form2.ShowDialog()

注:『要保证 Form2 在 Form1上』

应该是:
“1: 父 Form1 上有个按钮 点击弹出 Form2.ShowDialog()

注:『要保证 Form2 在 Form1顶上

才是你想要的?
MKing0412 2011-11-17
  • 打赏
  • 举报
回复

protected override void OnResize(EventArgs e)
{
if(WindowState == FormWindowState.Maximized)
{
//最大化时所需的操作
MessageBox.Show("max");
}
else if(WindowState == FormWindowState.Minimized)
{
//最小化时所需的操作
MessageBox.Show("min");
}
}



事件 填你的代码
bososoft 2011-11-17
  • 打赏
  • 举报
回复
这么做的目的主要是为了锁屏

form1 是主屏 点击其上按钮后 弹出form2 就一直在 form1 前面保证 form1 不能被操作

这样不能老让它在屏幕上待的呀!! 所以 ShowDialog() !

最小化 再还原呢? 还要是上一状态!

目前就是最小化后 form2 闪了

bososoft 2011-11-17
  • 打赏
  • 举报
回复
前辈 给点代码 呵呵 谢谢
threenewbee 2011-11-17
  • 打赏
  • 举报
回复
父窗体Handle子窗体的FormResize事件。
飞天凤凰601 2011-11-17
  • 打赏
  • 举报
回复
把form1代码加上下面的,然后Form1_Resize事件代码删除


const int WM_SYSCOMMAND = 0x112;
const int SC_CLOSE = 0xF060;
const int SC_MINIMIZE = 0xF020;
const int SC_MAXIMIZE = 0xF030;

protected override void WndProc(ref Message SystemMessage)
{
switch (SystemMessage.Msg)
{
case WM_SYSCOMMAND:
if (((int)SystemMessage.WParam) == 0xF020)
{
//最小化事件代码
this.WindowState = FormWindowState.Normal;
f2.WindowState = FormWindowState.Normal;
}
else
{
base.WndProc(ref SystemMessage);
}
break;
default:
base.WndProc(ref SystemMessage);
break;
}
}
飞天凤凰601 2011-11-17
  • 打赏
  • 举报
回复
我把你第三条改成了form1最大化时,。。。。。

form1代码

Form2 f2 = new Form2();
private void button1_Click(object sender, EventArgs e)
{

f2.Owner = this;
f2.TopLevel = false;
f2.Parent = this;
f2.Show();
}

public void Formmin()
{
this.WindowState = FormWindowState.Minimized;
}

private void Form1_Resize(object sender, EventArgs e)
{

if (this.WindowState == FormWindowState.Maximized)
{
this.WindowState = FormWindowState.Normal;
f2.WindowState = FormWindowState.Normal;

}
}


form2代码

private void Form2_Resize(object sender, EventArgs e)
{


if (this.WindowState == FormWindowState.Minimized)
{
Form1 f1 = (Form1)this.ParentForm;
f1.Formmin();

}

}
飞天凤凰601 2011-11-17
  • 打赏
  • 举报
回复
我做了,你第三点和第二点都是最小化form1,冲突了。。。
MKing0412 2011-11-17
  • 打赏
  • 举报
回复

private void button1_Click(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
Application.OpenForms["Form1"].WindowState = FormWindowState.Minimized;
}

private void Form2_Activated(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Minimized)
{
WindowState = FormWindowState.Normal;
Application.OpenForms["Form1"].WindowState = FormWindowState.Normal;
}
}

Form2中代码。
form1中如果把form2弹出用showdialog,会关闭不知道原因,详情
用的 show()
剩下的你自己解决吧。
bososoft 2011-11-17
  • 打赏
  • 举报
回复
怎么没人回答呀 可以+分
MKing0412 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 bososoft 的回复:]
其实 这里面主要是 要把 form2.hide()
[/Quote]
mark一个
bososoft 2011-11-17
  • 打赏
  • 举报
回复
其实 这里面主要是 要把 form2.hide()

MKing0412 2011-11-17
  • 打赏
  • 举报
回复
解决了?
最小化的时候
form2 会不会关闭?
ttt291 2011-11-17
  • 打赏
  • 举报
回复
不过最好的办法是,直接在Form2_Resize 里边处理,让form1的隐藏或者显示,同事控制1的ShowInTaskbar属性就好了,因为form2如果设置成ShowInTaskbar=false,最小化的时候,会显示在任务栏的上边,不好看了。
ttt291 2011-11-17
  • 打赏
  • 举报
回复
Form2 frm; //form1上定义的全局变量。

private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Normal && frm!=null)
{
frm.WindowState = FormWindowState.Normal;
}
} //form1的Resize事件
private void btn_Click(object sender, EventArgs e)
{
frm = new Form2(this);
frm.ShowDialog();
}
form2开始显示了,并且把form1传过去了。

form2这边
Form1 form1;
public Form2(Form1 form1)
{
InitializeComponent();
this.form1 = form1;
}
//form2的Resize事件
private void Form2_Resize(object sender, EventArgs e)
{
if(this.WindowState==FormWindowState.Minimized)
form1.WindowState=FormWindowState.Minimized;
}

其实就是个相互改变状态。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧