X
xiangding
Unregistered / Unconfirmed
GUEST, unregistred user!
1.请问这个FinControl函数是怎么实现查找子控件的?
是如何在父控件上查找子控件的? 参数只传了一个父控件的Handle,却能返回正在处理的子控件对象。。
怎么找的呢?
能不能帮我解释一下每一条语句的功能和作用。。谢谢
function FindControl(Handle: HWnd): TWinControl;
var OwningProcess: DWORD;
begin
if (Handle <> 0) and (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and
(OwningProcess = GetCurrentProcessId) then
if GlobalFindAtom(PChar(ControlAtomString)) = ControlAtom then
Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)))
else
Result := ObjectFromHWnd(Handle) ;
end;
2.function DoControlMsg(ControlHandle: HWnd; var Message): Boolean;
var
Control: TWinControl;
begin
DoControlMsg := False;
Control := FindControl(ControlHandle);
if Control <> nil then
with TMessage(Message) do
begin
Result := Control.Perform(Msg + CN_BASE, WParam, LParam); DoControlMsg := True;
end;
end;
请问Control.Perform(Msg + CN_BASE, WParam, LParam)中的Msg为何还要加上CN_Base
,我知道CN_Base是表是VCL的自定义消息的基地址,
我想Msg本身就已经是一个加了CN_BASE的消息参数了吧。为何还要加呢?
是如何在父控件上查找子控件的? 参数只传了一个父控件的Handle,却能返回正在处理的子控件对象。。
怎么找的呢?
能不能帮我解释一下每一条语句的功能和作用。。谢谢
function FindControl(Handle: HWnd): TWinControl;
var OwningProcess: DWORD;
begin
if (Handle <> 0) and (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and
(OwningProcess = GetCurrentProcessId) then
if GlobalFindAtom(PChar(ControlAtomString)) = ControlAtom then
Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)))
else
Result := ObjectFromHWnd(Handle) ;
end;
2.function DoControlMsg(ControlHandle: HWnd; var Message): Boolean;
var
Control: TWinControl;
begin
DoControlMsg := False;
Control := FindControl(ControlHandle);
if Control <> nil then
with TMessage(Message) do
begin
Result := Control.Perform(Msg + CN_BASE, WParam, LParam); DoControlMsg := True;
end;
end;
请问Control.Perform(Msg + CN_BASE, WParam, LParam)中的Msg为何还要加上CN_Base
,我知道CN_Base是表是VCL的自定义消息的基地址,
我想Msg本身就已经是一个加了CN_BASE的消息参数了吧。为何还要加呢?