窗口消息发送问题

sxqinge 2012-07-24 09:02:25
问题描述:
我从Form1中给Form2发送消息(在工程文件中,将Form2的创建函数已屏蔽掉),希望所有继承于Form2的窗口都能同时接受到这个发送消息并做及时处理。

我的做法:
使用FindWindow()函数获取Form2的句柄(此窗体未构造,是否获取的句柄不能反映真实值呢?),然后向Form2发送消息,未发送成功。

求助:
请各位能提供点思路,或许我这条路走不通,当然也和没有尝试成功有关系,但不知道该怎么去实现我想要的方法,请指点明路,谢谢。
...全文
180 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxworld 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

所以就只好出此下策给每个子窗口发送消息,并进行处理。
[/Quote]

这个不是“出此下策”,而是必须的,每个从TForm2继承的类的实例,都是独立的窗体,每一个都不同于TForm2的实例。

你可以使用全局对象 Screen 枚举App的从TForm2继承的类的实例就可以了。


sxqinge 2012-07-24
  • 打赏
  • 举报
回复
是的,向Form2发送消息的话,子窗口也都可以进行消息处理,无需重复设置。
现在的问题是,我把Form2的构造函数在工程文件中删除了,重新添加的话就报错,所以就只好出此下策给每个子窗口发送消息,并进行处理。
并且也有个奇怪问题,使用FindWindow函数获取的窗口句柄有时候也不一定正确,比如我想向另一个显示窗口发送消息(窗口在工程文件中自动创建),我在不同窗口调用FindWindow时得到的值也不定相同,不得其解。
fxworld 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
但是每个继承窗口都进行消息响应处理,觉得很麻烦, 如果在父窗口中处理就好了。猪哥能给个具体的方法实现吗?回头一定好好学习下。
[/Quote]

TForm2做好消息处理后,继承TForm2的类就自动具备了TForm2的消息处理了,继承类不需要重复取处理。
fxworld 2012-07-24
  • 打赏
  • 举报
回复
在8楼的回复内容:

使用全局对象 Screen 枚举App的从TForm2继承的类的实例就可以了。

狗日的csdn 管理员。
sxqinge 2012-07-24
  • 打赏
  • 举报
回复
谢谢猪哥和fxworld的热心回复,很汗颜对于回调函数我不会用。
我还是用了刚才自己的那个笨方法可以实现自己的问题,但是每个继承窗口都进行消息响应处理,觉得很麻烦, 如果在父窗口中处理就好了。猪哥能给个具体的方法实现吗?回头一定好好学习下。
fxworld 2012-07-24
  • 打赏
  • 举报
回复
我在8楼的回复,明明是回复楼主的问题,竟然被屏蔽了,我靠csdn.
fxworld 2012-07-24
  • 打赏
  • 举报
回复
csdn怎么发神经啊,我的回复总也出不来。
fxworld 2012-07-24
  • 打赏
  • 举报
回复
使用 全局对象 Screen枚举App的当前所有窗体,找出从TForm2继承的类就可以了。
Jim@luckeeinc.com 2012-07-24
  • 打赏
  • 举报
回复
如果是想要在new Form2的继承窗口的时候触发 那可以写在Form2的构造函数中 new一个子类的时候会去触发父类的构造

如果Form2的继承窗口已经new出来了 想给Form2的子窗口同时发送消息 那可能要用到回调函数然后枚举 EnumChildWindows 去找出所有Form2的子窗口 再处理
sxqinge 2012-07-24
  • 打赏
  • 举报
回复
我想用一个笨方法:
设一个全局变量数组,在Form2的FormShow()函数中将当前句柄全部存入数组中,这样就可以获取所有继承于Form2的句柄,然后在Form1的处理事件中向每个句柄所属窗口发送消息。
但是这样的话太麻烦了,有没有一个更合理的方法呢?
sxqinge 2012-07-24
  • 打赏
  • 举报
回复
谢谢猪哥的回复。
我的窗体关系有点乱,有几个继承于Form2的窗体是嵌套在Form1的TPageControl中的,这里或许可以用你的方法去实现;但是还有些窗体是独立的小窗口,比如一些浮动窗口等。我希望在Form1中进行某些处理的时候,所有继承于Form2的窗口都能同时响应消息。
Jim@luckeeinc.com 2012-07-24
  • 打赏
  • 举报
回复
不用指定也不用添加
比如说 你有3个Form Form1 Form2 Form3 。。。。。
其中Form3等等是继承的Form2
那你在Form2的构造函数中把代码写好
如果在Form1中直接去写TForm3 *f = new TForm3(this); f->ShowModal();........肯定会去触发的
sxqinge 2012-07-24
  • 打赏
  • 举报
回复
是的,但是我又想手工将Form2的构造函数在工程文件中添加的话,单文本编译无误,整个文件编译就报错了,提示"Unresolved external..."
有没有一个好的方法,我无需再添加Form2的构造函数,本考虑使用MVC模式,但是这个玩起来有点复杂还不熟悉,时间上就来不及了。
fxworld 2012-07-24
  • 打赏
  • 举报
回复
Form2窗体未构造,你怎么给它发消息呢?
缘中人 2012-07-24
  • 打赏
  • 举报
回复
继承Form2的应该当然可以收到此消息,关键是发送消息是的句柄指定正确就可以了,句柄是具体窗体的句柄
ccrun.com 2012-07-24
  • 打赏
  • 举报
回复
12楼请淡定,你看不到某个回复,这是CSDN目前难以解决的BUG。多生成几次帖子就ok了。
七擒关羽 2012-07-24
  • 打赏
  • 举报
回复
说明一下 当你生成的时候 你的Form1 Form2都存在,只你看到的是你显示出来的
例如 Form2->Show() 就显示窗口2,Form2->Hide()就是隐藏窗口2,所以你可以直接传值过去

如果是new出来的 例如TForm2 newForm = new TForm2();newForm->Show();你也可以传值过去,但是需要传值回来,那么该值是全局的才可以,和指针一样,你函数里分配内存,出了函数该指针无效

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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