从Way of getting control handle from TMessage问题开始,我已经创建了自己的实现,以便用我自己的实现替换Windowproc,以便在按下鼠标左键时进行一些处理。
TOverrideMessage = class
public
FControl: TWinControl;
FOldWndProc: TWndMethod;
procedure OverrideWindowProc(var Message: TMessage);
end;
实现:
procedure TOverrideMessage.OverrideWindowProc(var Message: TMessage);
begin
if Message.Msg = WM_NCLBUTTONDOWN then
begin
FOldWndProc(Message);
if FControl is TSomeCustomControl then
ShowMessage(TSomeCustomControl(FControl).Caption);//this property exists
end
else
Dispatch(Message);
end;
用我的类实例替换我想要的每个控件的windowproc:
LOverrideMessage := TOverrideMessage.Create;
LOverrideMessage.FControl := TSomeCustomControl(lControl4);
LOverrideMessage.FOldWndProc := TWinControl(lControl4).WindowProc;
TWinControl(lControl4).WindowProc := LOverrideMessage.OverrideWindowProc;
我遇到的问题是消息没有正确地进一步分配给控件,因此控件没有正确绘制等。另外,我没有在类实现中收到WM_NCLBUTTONDOWN消息。怎么了?
答案 0 :(得分:4)
您的主要问题是未能拨打FOldWndProc
。你需要调用它而不是Dispatch
。当您致电Dispatch
时,您将获得基本TObject
处理,但不执行任何操作。
procedure TOverrideMessage.OverrideWindowProc(var Message: TMessage);
begin
FOldWndProc(Message);
if Message.Msg = WM_NCLBUTTONDOWN then
if FControl is TSomeCustomControl then
ShowMessage(TSomeCustomControl(FControl).Caption);//this property exists
end;
如果WM_NCLBUTTONDOWN
未到达,则邮件不会发送给您的控件。
我担心你的演员。当你写:
LOverrideMessage.FControl := TSomeCustomControl(lControl4);
LOverrideMessage.FOldWndProc := TWinControl(lControl4).WindowProc;
TWinControl(lControl4).WindowProc := LOverrideMessage.OverrideWindowProc;
为什么你需要这些演员阵容?如果lControl4
来自TWinControl
,则您不需要这些演员表。如果lControl4
具有较少派生的编译时类型,则至少包括is
项检查。