是不是控件上发生的所有事件都要通知所在窗口?如何通知?这什么要这样?

解决方案 »

  1.   

    我看delphi处理消息时:
    比如按钮被按下,会发送消息给按钮所在的窗口,窗口经过一系列处理后又发送消息给按钮,按钮再调用窗口过程进行响应click事件。
    为什么按钮要发送消息给按钮所在的窗口?
      

  2.   

    > 按钮被按下,会发送消息给按钮所在的窗口,窗口经过一系列处理后又发送消息给按钮,按钮再调用窗口过程进行响应click事件。为什么按钮要发送消息给按钮所在的窗口?描述似乎有一点不对,应该是:窗口某位置被按一下鼠标左键,发送消息给窗口,窗口经过一系列判断决定将消息发送给按钮。按钮收到消息,决定要不要处理:如果存在click事件handler,则执行click事件handler。应该是这样子吧!?
      

  3.   

    看《inside vcl》或《delphi 面向对象编程思想》
      

  4.   

    举个例子:假如Form上有个panel,panel上有个button,现在你点了一下button,WM_BUTTONDOWN会先传到form,form发现此点在panel中,便转发到panel;panel收到后,发现在button里,就再转发至button,button再按自己的逻辑处理
      

  5.   


    windows这样做的目的是什么?
      

  6.   

    > windows这样做的目的是什么?
      

  7.   

    > windows这样做的目的是什么?把消息传递给应该对这个消息负责或感兴趣的对象。
      

  8.   

    > 我是想:消息这样传递,拐这么多弯,应该有系统的道理。只是不知道为什么?
    > 是不是通知父窗口知道自己的状态?等等从windows的角度来说,因为它只认识到Form,所以它把消递传递给它。
    在Delphi中,Form以下的框架是Delphi开发团队设计出来的,所以由Form(包括Application)负责继续判断再传递下去。所以,它的道理就只是“把消息传递给应该对这个消息负责或感兴趣的对象”如此而已。至于你曾经说,“Button又把事件传递给Form”,你是把“消息”和“事件”的概念混淆了,
    Button“没有”把消息传递给Form以通知自己的状态!事件与事件处理代码,是OO编程的概念,与消息是两码子事。
      

  9.   

    按下按钮时,会向窗口发送wm_command是为什么?真不明白了
      

  10.   

    > 按下按钮时,会向窗口发送wm_command是为什么?真不明白了
      

  11.   

    > 按下按钮时,会向窗口发送wm_command是为什么?真不明白了没有 trace 代码不敢说我的回答一定对……
    但是考虑到我确实看过Delphi有代码在发送消息,可以试著说说看我的理解。但,我只能就我能理解的部份说说。微软用这种消息传递的机制,以解决这种面向窗口的应用会发生的这些那些的需要(点鼠标是最简单的,还有很多复杂的,之所以如此,因为要实现真正遇到的问题嘛!)Delphi接手过来,在TApplication下按著微软的消息传递机制,在自己的框架下,实现全部的功能,
    想也知道,一定存在复杂度和难度,原因是,真正面对的问题就是很复杂。这种由上而下的机制看似很完美,但其实是为了便于学习者了解而简化的模型,真正的模型肯定要复杂得多,
    这点你一定明白。比如从一个控件拖曳到另一个控件,就不是由上而下这种简化的模型能解释。因此,Delphi在实践这个机制时,突然发现按个按钮时,TForm最好也要有什么反应,
    最后发现这个行为和原本TForm接到一个消息时要处理的行为是一致的,
    那么,基于不重新发明轮子的理由,TButton就仿Windows的行为发一个消息给TForm,
    那也有可能。至于你问 TButton 为什么要发 Wm_Command 给 TForm,
    具体要TForm做什么?
    这个,………………………
    我就不知道了。
    待后续高手回答你。不好意思啦。
      

  12.   

    总的脉络:
    子控件(button)的WM_LBUTTONUP消息VCL先是将它交给操作系统处理,操作系统把这个消息又转化成它的父窗口的命令消息WM_COMMAND,TWinControl又把命令消息转化为VCL内部的消息CN_COMMAND转发给先前给它发送命令消息的子控件,最后消息在子控件类(这里为TButton)中被最终处理产生OnClick事件并结束消息的传递。