windows消息系统是由三部分组成
消息队列
消息循环
窗口过程一个消息从发生到处理的过程如下:
事件发生->消息队列->消息循环->事件处理消息传递由Tobject.DIspach()重载实现,消息发送其中sendmessage()发送到应用程序后有返回,而postmessage()无返回.
另外,对于广播消息,有Broadcast()函数,也可以用如下形式:
Sendmessage(HWND_BROADCAST,TMessage,0,0);实现
最近学的,不知道理解的对不对,请指点
能不能给个这些函数使用的例子???还有,以WM开头的是窗口消息,那么以EM开头的是什么消息??还有其他种类吗?
postmessage//将消息发送到消息队列,直到其前面的消息处理完毕后再执行
对于VCL内部如何对消息进行封装我还不大懂
|
|
SendMessage()-------------------------------------->>WinProc地址
^
|
|
消息泵
^
|
|
|
PostMessage()-----------消息n+1
消息n+2
消息n+3
[消息]
perform: 控件1------------->控件2
|
|
SendMessage()-------------------------------------->>WinProc地址
^
|
|
消息泵
^
|
|
|
PostMessage()-----------消息n+1
消息n+2
消息n+3
[消息]
perform: 控件1------------->控件2
sendmessage()是通过控制句柄来实现
postmessage()还要通过消息泵转化perform()就可以直接传递??
function PostMessage(hWnd: HWND;Msg: UINT;wParam: WPARAM;lParam :LPARAM):Bool;
stdcall; 是API函数
SendMessage():发送一个消息,系统直接调用窗口进程。通信是即时的,直到窗口进程为调用函数返回一个结果,应用程序才能继续。PostMessage():寄送一个消息时,系统发送到拥有该窗口的应用程序消息队列中。消息队列是系统定义的一个内存快,用于临时存贮消息,或是把消息直接发送窗口过程。每个窗口维护自己的消息队列,并从中取出消息,利用窗口函数进行处理。调用函数发送消息后就立即返回,但结果只是表示消息寄送成功与否,而不表示调用窗口进程的结果。
这个perform嘛。
看看delphi的定义。
WindowProc(Message);
他把一个指定的消息交给窗口(控件窗口)处理函数。function TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
var
Message: TMessage;
begin
Message.Msg := Msg;
Message.WParam := WParam;
Message.LParam := LParam;
Message.Result := 0;
if Self <> nil then WindowProc(Message);
Result := Message.Result;
end;
2、PostMessage,将消息放入窗口所属引用程序的消息队列,立即返回。
3、Perform是VCL自己定义的,直接调用VCL控件的窗口过程,等待消息处理完毕后返回。WM表示Windows Message,即Windows标准消息。EM、LB、CB等是Windows的一些分类消息,分别对应于Eidt/Memo/RichEdit、ListBox、ComBox等Windows标准控件。
另外,VCL内部也根据一些需要定义了消息。—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
初学delphi ,没有人指点,幸好还有CSDN
能不能帮我介绍关于这方面的比较好的书???
现在很多书都是在msdn上copy些例子,然后骗我们钱。