怎么样截获多个控件的WindowProc事件

LWLIFE 2010-01-05 11:29:26

比如我有10个控件A1-A10我定义了10个函数指针B1-B10,并定义了一个新的事件处理函数NewProc,在程序开始时我可以把B1-B10分别指向A1-A10的WindowProc,然后把A1-A10的WindowProc指向我定义的NewPorc,在NewProc后我怎么才能去调用对应的B1-B10呢?不知道我说的是否明白,就是N个控件的WindowProc指向了同一个NewProc函数,我在NewProc函数后怎么调用控件原来的WindowProc函数?
...全文
292 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
avi9111 2011-04-10
  • 打赏
  • 举报
回复
重载个windowProc有这么复杂么?

C++是不是只能这样重载?
LWLIFE 2010-01-08
  • 打赏
  • 举报
回复
楼上一语惊人,果然是高手,这样确实可以,至少他自己能找到自己的windowsproc了,不用我去判断是哪个了,谢谢了
银点 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lwlife 的回复:]
这样吧,我说一下我想做的事情吧,我有不定个PANEL每个PANEL里面有一个图片组件,这个是第三方,因为他没有滚轮事件,所以我想截获消息,做滚轮判断,剩下的还用他原来的消息处理,我想做的就是这个了,可能是我把方法想复杂了,有没有简单的方法呢,谢谢/
[/Quote]
自己重写一个组件,可以从panel继承,直接把图片组件放进去,重载一次windowsproc就完了,这是最简单的方法,类似问题我 都是这么做的
LWLIFE 2010-01-08
  • 打赏
  • 举报
回复
这样吧,我说一下我想做的事情吧,我有不定个PANEL每个PANEL里面有一个图片组件,这个是第三方,因为他没有滚轮事件,所以我想截获消息,做滚轮判断,剩下的还用他原来的消息处理,我想做的就是这个了,可能是我把方法想复杂了,有没有简单的方法呢,谢谢/
LWLIFE 2010-01-07
  • 打赏
  • 举报
回复
楼上的你好,我不知道你回复这句话有什么意义,在上面以经说明了现在不是一个,如果是一个我知道怎么处理,我的问题也不是问一个怎么处理,而是在新的后面怎么调用不同的旧的?
土著巫师 2010-01-07
  • 打赏
  • 举报
回复
简而言之,先保留原来的函数指针,执行自己的后,再调用保留的旧的函数。具体怎么实现可参考silverpot的说明。
LWLIFE 2010-01-07
  • 打赏
  • 举报
回复
我处理的是图片,我现在的做法是定义一个指针,然后来回切换,可是这样有刷屏看的不是很爽,有没有办法解决刷屏的问题呢?
银点 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lwlife 的回复:]
谢谢楼上的回复,我的问题就从这里开始
在NewProc后我怎么才能去调用对应的B1-B10呢?
就是在NewWindowProc;里我怎么去调用对应的OldWindowProc[i]呢?每个控件都会有重绘等N个事件,我处理完我的肯定要调用他默认自己的,现在我就是确定不是这个OLD该怎么调用 的
[/Quote]

Sorry,我想不到办法了。等高人吧
LWLIFE 2010-01-07
  • 打赏
  • 举报
回复
谢谢楼上的回复,我的问题就从这里开始
在NewProc后我怎么才能去调用对应的B1-B10呢?
就是在NewWindowProc;里我怎么去调用对应的OldWindowProc[i]呢?每个控件都会有重绘等N个事件,我处理完我的肯定要调用他默认自己的,现在我就是确定不是这个OLD该怎么调用 的
CACACACACA 2010-01-07
  • 打赏
  • 举报
回复
先说都处理什么消息了.
银点 2010-01-07
  • 打赏
  • 举报
回复
单从WindowProc函数中无法判断它当下处理的是哪个窗口的消息。如果非要按上边讨论思路做,多个组件共用一个窗口函数的话,就得在TMessage里加入识别信息。那这样一来,需要自定义消息,并且重载组件的消息dispatch和defaulthandler两个函数,让它们从根上就向下传输自定义的消息。这样一做工作量反而大于一个个指定组件自己的新的窗口函数。
LWLIFE 2010-01-05
  • 打赏
  • 举报
回复
谢谢楼上的回复,这些我知道,现在我说的是多个,如果一个怎么都好解决,现在控件也是动态生成的,不定多少个的
银点 2010-01-05
  • 打赏
  • 举报
回复

void __fastcall TForm1::FormCreate(TObject *Sender)
{
OldWindowProc = Button1->WindowProc;
Button1->WindowProc = NewWindowProc;

}

银点 2010-01-05
  • 打赏
  • 举报
回复

class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
void __fastcall NewWindowProc(Messages::TMessage &Message);
TWndMethod OldWindowProc ;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};


void __fastcall TForm1::FormCreate(TObject *Sender)
{
OldWindowProc = Button1->WindowProc;

}
//---------------------------------------------------------------------------

void __fastcall TForm1:: NewWindowProc(Messages::TMessage &Message)
{
//————————你的消息处理

OldWindowProc(Message);
}
银点 2010-01-05
  • 打赏
  • 举报
回复
在你对窗口函数赋值之前,先保存原来的窗口函数
银点 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lwlife 的回复:]
谢谢楼上的回复,这些我知道,现在我说的是多个,如果一个怎么都好解决,现在控件也是动态生成的,不定多少个的
[/Quote]

举一反三啊,兄弟!
先动态生成一个TWndMethod OldWindowProc[]数组,维数根据你组件的个数定;
TWndMethod* OldWindowProc = new TWndMethod[Count];

动态生成组件的时候,在你new完之后就执行
OldWindowProc[i] = YourComponet->WindowProc;
YourComponet->WindowProc = NewWindowProc;


13,825

社区成员

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

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