怎样在自定义的类中做消息循环啊. ( 积分: 100 )

  • 主题发起人 主题发起人 k4-1
  • 开始时间 开始时间
K

k4-1

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样在自定义的类中做消息循环啊.
 
怎样在自定义的类中做消息循环啊.
 
你是不想得太深奥了点?
 
消息循环,由APPLICATION来实现.除非你要从头做起.
 
很简单, 下面这段代码就是消息处理循环:
var
Message: TMsg;
begin
while getmessage(Message, 0, 0, 0) do
try
TranslateMessage(Message);
DispatchMessage(Message);
except
end;
 
我的意思是,在自己定义的类中获取windows产生的消息,如果发现是需要的,就截获.
 
TMyclass = class
private
FHandle: HWnd;
procedure WndProc(var Message: TMessage);
public
constructor Create;
destructor Destroy
override;
end;
procedure TMyclass.WndProc(var Message: TMessage);
begin
try
Dispatch(Message);
except
Application.HandleException(Self);
end;
end;
constructor TMyclass.Create;
begin
FHandle := AllocateHwnd(WndProc);
end;
destructor TMyclass.Destroy
override;
begin
DeallocateHWnd(FHandle);
end;
 
那为什么
procedure MyClass.WMKEYDOWN(var Message: TMessage);message WM_KEYDOWN;
begin
if Message.wlparm = VK_D then
showmessage('D Down');
end;
没有任何现象啊.
 
自由界面和报表的完美解决方案!
http://www.anylib.com
 
从TObject下来的东西都可以Dispatch消息,看TObject的代码可以知道

TWMKey = packed record
Msg: Cardinal;
CharCode: Word;
Unused: Word;
KeyData: Longint;
Result: Longint;
end;

procedure MyClass.WMKEYDOWN(var Message: TWMKey);message WM_KEYDOWN;
begin
if Message.CharCode= VK_Return then
showmessage('回车');
end;

另外vk里面没有vk_D这个东西

Virtual key codes allow you to represent keyboard values for non-alphanumeric keys.Windows defines special constants for each key the user can press. These constants can then be used to refer to the keystroke in Windows API calls or in an OnKeyUp or OnKeyDown event handler.
 
大家能举个例子吗.比如当WM_LBUTTONDOWN时.处理Showmessage('Left Button has Down');
 
回车和鼠标是一回事


下面这个够清楚了
http://www.delphibbs.com/delphibbs/dispq.asp?LID=2308424

先看看鼠标点击消息截获:
procedure TControl.WMLButtonDown(var Message: TWMLButtonDown);
begin
SendCancelMode(Self);
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := True

if csClickEvents in ControlStyle then Include(FControlState, csClicked);
DoMouseDown(Message, mbLeft, []);
end;
调用DoMouseDown(Message, mbLeft, [])过程,再看看这个过程:
procedure TControl.DoMouseDown(var Message: TWMMouse
Button: TMouseButton;
Shift: TShiftState);
begin
if not (csNoStdEvents in ControlStyle) then
with Message do
if (Width > 32768) or (Height > 32768) then
with CalcCursorPos do
MouseDown(Button, KeysToShiftState(Keys) + Shift, X, Y)
else
MouseDown(Button, KeysToShiftState(Keys) + Shift, Message.XPos, Message.YPos);
end;
调用MouseDown事件,再往下:
procedure TControl.MouseDown(Button: TMouseButton;
Shift: TShiftState
X, Y: Integer);
begin
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);
end;
再看看事件mousedown的声明:
property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
至此,通过消息截获直到调用用户的事件就比较清楚了,
那为什么不在WMLButtonDown(var Message: TWMLButtonDown)过程中就调用用户事件
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y)
呢,那是主要考虑到继承的问题,你看mousedown过程是protect的dynamic事件,
我后面继承的控件要特殊处理这个消息,只要重写MouseDown事件就行了,
而不必截获这个事件,再做一些必要的重复的初始化工作。
哦,搞错了,你问的是Click事件,我这里分析的是mousedown事件,其实
都差不多,直接看看就清楚了。
 
这么久的问题...我竟然还没有结....实在对不住各位啊....
谢谢你们的精彩回答.....
 
多人接受答案了。
 
后退
顶部