文档章节

学习 Message(1): 消息发送

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 879
阅读 23
收藏 0
消息流程:

譬如用鼠标左键点击一下窗体, 系统会收到一条 WM_LBUTTONDOWN 消息;
当鼠标抬起, 系统又会收到 WM_LBUTTONUP 消息.

系统收到消息后, 会告诉窗体发生的事情, 然后窗体再做出反应; 当然窗体能否做出反应要看窗体是否有相应的响应代码.

要响应 WM_LBUTTONDOWN 消息, 我们需要在 OnMouseDown 事件中写代码;
要响应 WM_LBUTTONUP 消息, 我们需要在 OnMouseUp 事件中写代码;

当然我们也可以通过其他方法(譬如消息方法)来响应消息.

关于消息流程, 这样说其实不够完整, 更详细的流程可以参见:
http://www.cnblogs.com/del/archive/2008/04/08/1142768.html 系列.

消息发送:

我们通过鼠标、键盘等操作, 就在有意无意地随时向系统发送消息; 但有时我也需要间接发送消息, 譬如: 我们并不需要点击窗体, 也可以向窗体发送一条 WM_LBUTTONDOWN 消息, 从而引发 OnMouseDown 事件的执行.

发送消息的常用函数:
function SendMessage(
  hWnd: HWND;        {目标句柄}
  Msg: UINT;         {要发送的消息(编号)}
  wParam: WPARAM;    {消息参数}
  lParam: LPARAM     {消息参数}
): LRESULT; stdcall; {返回处理结果}

function PostMessage(
  hWnd: HWND;     {目标句柄}
  Msg: UINT;      {要发送的消息(编号)}
  wParam: WPARAM; {消息参数}
  lParam: LPARAM  {消息参数}
): BOOL; stdcall; {是否发送成功}

function Perform(
  Msg: Cardinal;  {要发送的消息(编号)}
  WParam: WPARAM; {消息参数}
  LParam: LPARAM  {消息参数}
): LRESULT;       {返回处理结果}

 
 
 
 
 

 

 

  

SendMessage 发送消息后会等待处理结果;
PostMessage 把消息送人等待处理的消息队列.

发送 SendMessage 消息好比: 你扔一颗手榴弹到敌群中, 并期待看到血肉横飞的场面;
发送 PostMessage 消息好比: 你在敌人就要路过的地方埋上一颗地雷, 你就不管了.

其实 SendMessage 和 PostMessage 在实用过程中区别并不是很大.

Perform 和上面两个不同, 它是控件的一个方法, 最早定义在 TControl 类, TControl 的子孙都有这个方法, TControl 之上的父类们不需要处理消息, 也没有消息要处理.

Perform 和 SendMessage 更相似, 但貌似少了一个参数, 其实没有, 只是换了一下位置, 看它的调用对比:
SendMessage(控件句柄, 消息, 参数, 参数);
控件.Perform(消息, 参数, 参数);

消息和消息参数:

消息就是一个整数, 就是微软给做的一个编号:
0 .. WM_USER-1: Windows 使用
WM_USER .. $7FFF: 窗体类使用
$8000 .. $BFFF: 保留
$C000 .. $FFFF: 应用程序使用
大于 $FFFF: 保留

Delphi 也自定义了一些消息, 分别是 CM_ 和 CN_ 打头.

消息参数是个比较复杂的概念, 因为不同的消息有不同的参数规定, 其实学习消息的过程就是学习消息参数.
不过有些消息的参数就特简单, 譬如 WM_CLOSE 是关闭窗口的消息, 它不需要什么参数(不需要也要按格式写个数).

下面的例子使用四种不同的方法来关闭窗口:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  SendMessage(Self.Handle, WM_CLOSE, 0, 0);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_CLOSE, 0, 0);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Self.Perform(WM_CLOSE, 0, 0);
end;

end.

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/10/24/1318897.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
ActiveMQ学习笔记(6)——JMS消息类型

1.前言 ActiveMQ学习笔记(四)——通过ActiveMQ收发消息http://my.oschina.net/xiaoxishan/blog/380446 和ActiveMQ学习笔记(五)——使用Spring JMS收发消息http://my.oschina.net/xiaoxishan/......

郭寻抚
2015/03/02
3K
0
vc6.0添加自定义用户消息的基本过程

在学习过程中遇到要添加用户自定义消息的过程.我觉得书上写的比较散,于是就自己总结了这个基本过程,以为日后备查. 首先弄清楚两点:(1)谁要发送这个消息(2)谁要接受这个消息。 用一个简单...

长平狐
2012/11/01
60
0
Handler Looper Message

Android(1)-Handler Looper Message MessageQueue http://www.cnblogs.com/TS-qrt/articles/android.html Android学习笔记——从源码看Handler的处理机制 http://www.cnblogs.com/yjiyjige/......

当空皓月
2014/10/23
0
0
ios视频直播(二)- RTMP协议学习总结

一。什么是rtmp协议 RTMP协议就是Real Time Messaging Protocol,实时消息传输协议, 是Adobe公司为Flash播放器和服务器之间音、视频及数据传输开发的实时消息传送协议。协议中,视频必须是H26...

鹿微微鹿
2016/06/25
113
3
RabbitMQ的几种典型使用场景

AMQP AMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现。它主要包括以下组件: 1.Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程。 2.Virtual Host:其实...

引鸩怼孑
2016/02/20
914
0

没有更多内容

加载失败,请刷新页面

加载更多

一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
今天
1
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
4
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
16
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部