还是关于消息(30分)

  • 主题发起人 主题发起人 hongsen
  • 开始时间 开始时间
H

hongsen

Unregistered / Unconfirmed
GUEST, unregistred user!
我想知道DELPHI应用程序的消息处理机制。具体问题如下:<br>&nbsp;1,对DELPHI 中FORM里的控件的事件触发所产生的消息的HANDLE是指控件<br>本身,还是FORM?<br>&nbsp;2,通常都在FORM的PRIVATE 或PROTECTED里强制指定消息处理函数(用<br>关键字)。我怎么知道这个函数是处理达到FORM的消息,还是达到具体的控件。CLICK BUTTON时应该产生一个消息吧。假如我要对此消息重指定<br>处理函数,怎么办(不用ONCLICK事件)<br>&nbsp; 好象在C++中对对话框中的按纽等的操作产生一个COMMAND消息,如何解释?<br>3,怎样触发事件,直接调用事件吗?事件是否非得和消息关联?<br>
 
1.不知您的Handle指的是哪个.但随消息来的Handle肯定是发出该消息的控件的.<br>2.FORM的消息函数处理的消息,当然是到达FORM的.比如,CLICK一个BUTTON,<br>&nbsp; BUTTON收到的消息是WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_LBUTTONUP等等,<br>&nbsp; 而FORM里应该响应BN_CLICK.也就是说,BUTTON控件将各种WM_消息组合翻译成<br>&nbsp; 了发给父窗口的通知消息.这些通知消息是放在WM_COMMAND消息中发出来的,<br>&nbsp; 所以说对话框中的控件操作产生COMMAND消息.也就是,BN_CLICK是WM_COMMAND<br>&nbsp; 的一个参数,而不是一个真正的消息.<br>&nbsp; 不用ONCLICK事件,须响应具有BN_CLICK参数的WM_COMMAND消息.但DELPHI已经<br>&nbsp; 作了很多工作,使我们不需要响应WM_COMMAND,而直接将BN_CLICK当作普通消息<br>&nbsp; 处理就可以了.消息的参数里有产生该消息的Handle/ID,可以据此判断消息源.<br>3.事件和消息没有必然联系.消息只是通知事件发生的一种方法.我们完全可以用别<br>&nbsp; 的方法完成这个功能,比如函数调用的方法.所以,事件响应函数是可以直接调用<br>&nbsp; 的,而不必通过SENDMESSAGE之类的方法.
 
首先感谢lhz的热情回答。<br>在下还有不明白的方面需继续请教:<br>1,是否每条消息都标明消息发送者?如果是,在消息记录的哪个域,我对消息结构的WPARAM和LPARAM一直没搞清楚。如果不是,接收者怎么判断消息发送者?<br>2,是否对FORM中的所有部件的操作都反映到给FORM而不是各部件的消息队列<br>发送消息?如果部件有自己的消息队列,那么假如我想给FORM中的某个部件的<br>某条消息指定 消息处理函数,怎么办?(不用事件处理函数,再说事件和消息<br>不完全等价)<br>3,我试过触发一个事件可以直接调用该事件,如:BUTTON1.ONCLICK(button1);<br>我查得参数SENDER是The Sender parameter is the object whose event <br>handler is called.这儿前面的BUTTON1和后面的BUTTON1重复,如果把参数写成别的,结果如何?
 
1.不是每个消息都有Sender.通知消息是一定有Sender的,还要其它的一些消息也有<br>&nbsp; Sender.但有些消息也没有Sender.这个在Win32API的SDK中有详细的描述.<br>2.消息队列每个线程只有一个,而不是每个窗口都有.线程接收消息后,用<br>&nbsp; DispatchMessage()将消息分发到相应的窗口.要改变某部件的消息响应,可以:<br>&nbsp; (1)从该部件继承出新的部件,并在派生部件中响应消息.<br>&nbsp; (2)运行时,用SetWindowLong安装新的窗口函数.Win32API SDK有详细说明<br>&nbsp; (3)用HOOK.<br>3.结果依赖于响应该事件的函数.如果该函数不使用Sender,将没有任何问题.如果<br>&nbsp; 该函数从Sender参数得到一些信息,并作相应处理,将影响程序的效果.<br><br>BTW:您好象对Win32API不是很熟悉.要使用这方面的技术,建议您先学一下Win32API.
 
接受答案了.
 
&nbsp; HongSen:<br>&nbsp; &nbsp; &nbsp; &nbsp;你是谁(可是92751班的哪一个)请回答<br>!!!!!!!!!!!!!!!
 
后退
顶部