2005/10/09 | 注意这一句话
类别(语言类学习笔记) | 评论(0) | 阅读(75) | 发表于 11:50
SendMessage(FindWindow('TfmMan_MainForm',nil),WM_User+100,Integer(PChar('0')),0);
稍后该装一下就可一改为文本了哦unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure MS(var smessage:tmessage);message Wm_User+1;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(self.Handle,wm_user+1,Integer(PChar(self.Caption)),Integer(PChar('bbb')));
end;

procedure TForm1.MS(var smessage: tmessage);
begin
ShowMessage(PChar( smessage.WParam));
ShowMessage(PChar( smessage.lParam));
end;

end.



消息过滤

过滤消息又称为消息陷阱。用户可能需要屏蔽某系消息或截获某些消息进行处理。消息过滤一般有三种途径:

◇ 重载构件继承的虚拟方法wndproc。
◇ 针对某消息编写消息处理句柄。
◇ 重载构件继承的虚拟方法DefauleHandler,在其中对消息进行处理。

常用的是第2种方法,在上节已经介绍,第1种方法与第3种使用相似,重载虚拟方法wndproc的一般过程:

procedure TMyObject.wndproc(var message:TMessage);
begin
{...判断此消息是否该处理}
inherited wndproc(message);
{未处理的消息交由父辈wndproc方法处理}

end;

可以看出,在wndproc方法处理消息的优势是可以过滤整个范围内的消息,而不必为每个消息指定一个处理句柄,事实上TControl构件中就是利用它来过滤并处理所有的鼠标消息(从WM_MOUSEFIRST到WM_MOUSELAST)同样利用它可以阻止某些消息被发送给处理句柄。

procedure TControl.Wndproc(var message:TMessage);
begin
if (message.msg>=WM_MOUSEFIRST) and (message.msg<=WM_MOUSELAST) then
if Dragging then{处理拖拽事件}
DragMouseMsg(TWMMouse(message))
else
{处理其他鼠标消息}
else
Dispatch(message);
{否则正常发送消息}
end;

一个完整的例子:

unit myEdit;
interface
uses
Windows,messages,sysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;
type
Tmyedit=class(Tedit)
private
{private declarations}
protected
{protected declarations}
{other fields and methods}
procedure wndproc(var message:Tmessage);override;
public
{public declarations}
published
{published declarations}
end;

procedure Register;
implementation

procedure Register;
begin
RegisterComponents('Samples',[Tmyedit]);
end;

procedure Tmyedit.wndproc(var message:Tmessage);
bigin
if message.msg=WM_MOUSEMOVE then
begin
cursor:=crarrow;
{设置光标为crarrow,而不是缺省光标}
exit;
end;
if message.msg=WM_SetFocus then
exit;
{屏蔽掉WM_SetFocus,不让组件获得焦点}
inherited wndproc(message);
{其他消息交父辈处理}
end;
end.







11:47:32 | 固定链接 | 评论 (0) | 引用通告 (0) | 记录它 | 学习笔记


固定链接 关闭

spaces.msn.com/members/aumstudio/Blog/cns!1pfaYprdAvBEbECwEyOuyp3A!144.entry







消息处理

所谓消息处理,就是应用程序以某种方式响应Windows消息。在Delphi中,每个消息都有各自的过程,这些用于消息处理的过程必须满足3个条件:

◇ 这个过程必须是一个对象中的方法。
◇ 这个过程必须有一个var参数,变量的类型是TMessage或其他特殊的消息记录。
◇ 声明这个过程时,必须使用message指示符,后面是要处理的消息的常量值。

下面是一个处理WM_PAINT消息的过程的代码:

procedure WMPaint(var mMsg:TWMPaint);message:WM_PAINT;

然后在单元的Implementation部分实现这个过程。

procedure TForm1.WMPaint(var Msg:TWMPaint);
begin
Beep;
Inherited;
end;

上述代码中的Inherited语句将传递消息给祖先对象,也就是把消息传递给TForm中处理WM_PAINT消息的过程。





0:51:35 | 固定链接 | 评论 (1) | 引用通告 (0) | 记录它 | 学习笔记


固定链接 关闭

spaces.msn.com/members/aumstudio/Blog/cns!1pfaYprdAvBEbECwEyOuyp3A!140.entry







UINT RegisterWindowMessage(lpsz)

函数说明:RegisterWindowMessage函数定义一个新的窗口消息,该消息保证在整个系统范围内是唯一的。调用SendMessage或PostMessage函数时可以使用该函数返回的消息值。
参数说明: lpsz
  指向一个以NULL结束的字符串,该字符串指定待登记的消息。
返回值:若成功地登记了消息,返回值是一个消息标识符。该标识符值的范围在0XC000到0XFFFF之间,否则,返回值为0。
注释:RegisterWindowMessage函数通常用于为两个合作应用程序之间的通信登记消息。
  若两个不同的应用程序登记了相同的消息字符串,则这两个应用程序返回相同的消息值。该消息一直维持被登记状态,直到Windows会话结束。当多个应用程序必须处理同一消息时才使用RegisterWindowMessage函数。在一个窗口类范围内发送私有消息时,应用程序可使用范围在WM_USER到0X7FFF之间的任意整数。





0:50:45 | 固定链接 | 评论 (0) | 引用通告 (0) | 记录它 | 学习笔记


固定链接 关闭

spaces.msn.com/members/aumstudio/Blog/cns!1pfaYprdAvBEbECwEyOuyp3A!139.entry







Windows发送消息的方式

(1)VCL的Perform()适用于所有TControl派生对象。只要知道Form或组件的实例,Perform()可以发送消息给任何一个Form或组件。
(2)SendMessage()和PostMessage()函数是Windows中两个发送消息的API函数,SendMessage()直接把一个消息发送给窗口程序并等消息处理完之后返回,PostMessage()只是把消息发送给消息队列,然后立即返回,并不要知道消息是否处理完。

两个API的参数是一致的。参数hWnd指接收消息的窗口句柄;参数Msg指消息标识符;参数Wparam指32位的特定附加信息;参数Lparam指32位的特定附加信息。

(一)在程序内部发送消息:

Const WM_MYMESSAGE=WM_USER+200;
Begin
SomeForm.perform(WM_MYMESSAGE,0,0);
//或者
SendMessage(SomeForm.handle,WM_MYMESSAGE,0,0);
//或者
PostMessage(SomeForm.handle,WM_MYMESSAGE,0,0);

然后定义一个消息处理过程,处理WM_MYMESSAGE消息

private
procedure doMyMessage(var msg:TMessage);message WM_MYMESSAGE;
end;

procedure Tform.doMyMessage(var Msg:TMessage);
begin
//作想要的处理
end;

(二)在应用程序之间发送消息:

最好调用RegisterWindowMessage()函数,这个函数能够确保每个应用程序使用一致的消息序号。

(三)广播消息

TWinControl的派生对象可以调用Broadcast()向它的子组件广播一个消息,当需要向一组组件发送相同的消息时,便可以使用这种技术。例如,Panel1可以给它的所有子组件发送一个叫UM_FOO的自定义消息:

var
M:TMessage;
begin
with M do
begin
msg:=UM_FOO;
wParam:=0
lParam:=0;
Result:=0;
end;
panel1.Broadcast(M);
end;

还可以利用SendMessage()和PostMessage()函数,需要把hWnd参数设置为HWND_BROADCAST,它代表向所有的窗口发送消息。

SendMessage(HWND_BROADCAST,FMessageID,0,0);





0:49:58 | 固定链接 | 评论 (0) | 引用通告 (0) | 记录它 | 学习笔记


固定链接 关闭

spaces.msn.com/members/aumstudio/Blog/cns!1pfaYprdAvBEbECwEyOuyp3A!138.entry







VCL 的消息处理原理

每个VCL 组件都有内在的消息处理机制,在建立一个窗体或加入一个组件时,VCL 就已经注册了一个消息接受例程MainWndProc,这个例程是每个窗体和组件所固有的。Delphi内部使用这个例程接收来自各方面的消息并把它们发送给适当的处理方法,如果没有特定的处理方法,则调用缺省的消息处理句柄。

MainWndProc 不直接处理消息,也不能被重载,而是交由WndProc 方法处理并提供异常保护。WndProc 是在TControl类中定义的一个虚拟方法,可覆盖,可以对自己关心的消息进行截获、处理,提供自定义的消息处理例程。对于不处理的要调用继承让父类去处理,这也是非常好的编程习惯。WndProc 调用Dispatch方法进行消息分配,而Dispatch方法将根据消息号码调用组件的最后继承类中处理此消息的句柄方法。如果此组件和它的祖先类中都没有对应此消息的处理句柄,Dispatch方法便会调用DefauleHandler方法。DefauleHandler方法是定义于Tobject中的虚拟方法,它只实现简单的返回而不对消息进行任何处理。我们可以通过此虚拟方法的重载,在子类中实现对消息的缺省处理。

Tobject.Dispatch派发消息时是按照继承链逆流而上的。首先找本类中用Message定义的消息处理方法,如果覆盖的话,则调用它来处理,如果没有就继续查找父类。首先从Message定义方法查起,然后再看看DefauleHandler中是否覆盖,这样一直找到TObject的DefauleHandler,在Tobject.DefauleHandler中什么都不处理,只是走到了消息处理的尽头。









0:48:43 | 固定链接 | 评论 (0) | 引用通告 (0) | 记录它 | 学习笔记


固定链接 关闭

spaces.msn.com/members/aumstudio/Blog/cns!1pfaYprdAvBEbECwEyOuyp3A!136.entry







窗口响应消息的步骤

从消息的产生到消息被一个窗口响应,这其中要经历5 个步骤:

(1)系统中发生了某个事件。
(2)Windows 把这个事件翻译成消息,然后把它放到消息队列中。
(3)应用程序从消息队列中接收这个消息,并把它存放在TMsg纪录中。
(4)应用程序把消息传递给一个适当的窗口过程。
(5)窗口过程响应这个消息并进行处理。

步骤(3)(4)构成了应用程序的消息循环。







0:47:27 | 固定链接 | 评论 (0) | 引用通告 (0) | 记录它 | 学习笔记


固定链接 关闭

spaces.msn.com/members/aumstudio/Blog/cns!1pfaYprdAvBEbECwEyOuyp3A!133.entry







Windows的消息系统的组成

Windows的消息系统由以下3部分组成:

◇ 消息队列:Windows 能够为所有的应用程序维护一个消息队列,应用程序必须从消息队列中获取消息,然后分派给某个窗口。
◇ 消息循环:通过这个循环机制,应用程序从消息队列中检索消息,再把它分派给适当的窗口,然后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。
◇ 窗口过程:每个窗口都有一个窗口过程,以接收Windows 传递给窗口的消息,窗口过程的任务就是获取消息并且响应它。窗口过程是一个回调函数,处理完一个消息后,通常要给Windows 一个返回值。




-----------http://spaces.msn.com/members/aumstudio/
0

评论Comments