delphi自定义窗口消息

假设你的消息这样定义:

Const

WM_YOURMSG=WM_USER+100;

你的过程定义可以这样:

procedure YourProc(var MSG:TMessage);message WM_YOURMSG;

这样,当你的窗口收到该消息时,将调用这个过程。

例如:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;

Const

WM_MINE=WM_USER+100;

type

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

procedure Mine(var msg:TMessage);message WM_MINE;

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Mine(var msg: TMessage);

begin

Showmessage('OK');

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Sendmessage(handle,WM_MINE,0,0);

end;

end.

这个单元定义了一个消息,当按下按钮时,向自己窗口发送这个消息(当然,不一定发送到自己的窗口,处理消息的过程也可以在其他地方),然后弹出个对话框。这当然是多此一举,不过,只是为了说明使用方法。

至于想处理MOUSECLICK时的MOUSE位置和状态,你可以不处理ONCLICK事件,而在ONMOUSEDOWN事件里处理。这个事件提供的参数分别告诉了你

Sender:那一个按钮接收这个鼠标事件:

Shift:当前鼠标的按钮状态是什么样,其他键盘状态是什么样,我们一般用

if Shift=[ssleft]来判断是否鼠标左键点击,有关方括号里的值,你可以查询DELPHI的在线帮助,关键字:TShiftState

Button:表明那一个鼠标键被按下,

X,Y:鼠标在接收这个鼠标事件时的位置,如果你需要的是屏幕的位置可以这样做:

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

CurrentPos:TPoint;

begin

if shift=[ssRight] then begin

CurrentPos:=TButton(Sender).clientToScreen(point(x,y));

{或者,GetcursorPos(CurrentPos)}

Showmessage(format('X:%d,Y:%d',[CurrentPos.x,CurrentPos.y]));

end;

//这个过程将使你鼠标在按钮上点下时弹出对话框,标明当前的位置。

end;

;

这样CurrentPos的X,Y就是当前屏幕的坐标。