关于多个Form控制问题

vace2008 2008-07-08 11:05:48
请高手回答:
现在我的项目需要同时出现5个Form
A.B
C.D
E
其中E为控制Form,根据E上面的Button控制A/B/C/D四个位置的Form显示(可能会是其他的多个Form)

现在有一个头疼的问题。
1、当A/B/C/D四个位置的Form收到ALT+F4的关闭消息时,只关闭当时处于焦点位置的Form,请问高手怎么解决这个问题。
自己的思考:是不是把关闭的事件都委托为Form E,由Form E中的函数,由Form E来完成,
请专家参考是否能实现,或者有更好的办法。
2、现在想实现:当A收到Page UP消息时,Form A要翻页。可是如果此时E获得焦点,点PAGE UP则A没有一点反应,请问
怎么解决这个问题呢?是不是需要在Form E上做消息相应,控制Form A,要是这样那岂不是每个Form都要做类似的操作?
3、这样的构架够不够合理呢?有没有更好的构架来完成这个功能。

谢谢!
...全文
104 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dream83619 2008-07-09
  • 打赏
  • 举报
回复
看到问题之后第一想法是:
将所有打开的子窗体保存在一个List中,如List<Form> listForms; listForms可以保存在MainForm中
根据需求将需要子窗体需要同步的事件委托给MainForm中的函数处理.例如OnChildFormKeyDown()
注意将Form的Closed消息通知给MainForm,将listForms中的ChildForm Remove掉.
代码大概如下:
// MainForm.cs
// 新建子窗体
Form childForm = new Form();
childForm.KeyDown += new System.Windows.Forms.KeyEventHandler(OnChildFormKsyDown);
childForm.FormClosed += new System.EventHandler(OnChildFormClosed)
m_listForms.add(childForm);

// 接受子窗体KeyDown消息
OnChildFormKeyDown(object sender, ...)
{
// 处理子窗体KeyDown消息, 同步m_listForms中所有子窗体的KeyDown事件
}

// 接收子窗体Closed消息
OnChildFormCLosed(object sender, ...)
{
Form frm = sender as Form
if (frm != null)
{
this.m_listForms.Remove(frm);
}
}
amandag 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 vace2008 的回复:]
能不能讲明白一点?
1、我思考了很久,第一点问题应该不是很大。用到委托事件即可,ABCD四个Form派生于同一类,该类中将关闭事件委托于FrmMain即可。
2、关于第二点,FrmMain怎么获得其他窗口上的消息呢?比如说,A需要PAGE UP消息,现在B是焦点,收到PAGE UP消息的是B,FrmMain也无能为力。
FrmMain自己都不知道,怎么能通知到A呢?如果通过B通知FrmMain,再有FrmMain来通知A是不是绕的太远了点?况且有时候A这个位置,…
[/Quote]
==
其实这个就是MDI窗体的优势,这种模式可以参考观察者模式
falx2004 2008-07-09
  • 打赏
  • 举报
回复
观察者模式搞之
mapserver 2008-07-08
  • 打赏
  • 举报
回复
1、在这5个Form中添加KeyDown事件,随便那个Form受到ALT+F4的时候,直接推出工程:Application.Exit();
vace2008 2008-07-08
  • 打赏
  • 举报
回复
能不能讲明白一点?
1、我思考了很久,第一点问题应该不是很大。用到委托事件即可,ABCD四个Form派生于同一类,该类中将关闭事件委托于FrmMain即可。
2、关于第二点,FrmMain怎么获得其他窗口上的消息呢?比如说,A需要PAGE UP消息,现在B是焦点,收到PAGE UP消息的是B,FrmMain也无能为力。
FrmMain自己都不知道,怎么能通知到A呢?如果通过B通知FrmMain,再有FrmMain来通知A是不是绕的太远了点?况且有时候A这个位置,
并不是Form A所占据有没有更好办法呢?
3、方便透露一下你的QQ吗?想讨论下。
amandag 2008-07-08
  • 打赏
  • 举报
回复
1、当A/B/C/D四个位置的Form收到ALT+F4的关闭消息时,只关闭当时处于焦点位置的Form,请问高手怎么解决这个问题。
自己的思考:是不是把关闭的事件都委托为Form E,由Form E中的函数,由Form E来完成,
2、现在想实现:当A收到Page UP消息时,Form A要翻页。可是如果此时E获得焦点,点PAGE UP则A没有一点反应,请问
怎么解决这个问题呢?是不是需要在Form E上做消息相应,控制Form A,要是这样那岂不是每个Form都要做类似的操作?
==
给一个主窗体,可以是FrmMain,专门负责通讯处理,其它窗体只要给FrmMain发送消息即可,这也是设计模式的一种思想

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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