在新年里,首先祝大家新春快乐,然后请大家帮我解答一下这两个问题,感激涕零。。(40分)

  • 主题发起人 主题发起人 xiangding
  • 开始时间 开始时间
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的消息参数了吧。为何还要加呢?
 
第二个问题我已经知道了,请大家帮我答第一个问题。
第二个问题的答案是:
CN_的通知自定义消息都=CN_Base + WM_控件消息
而在此,只有CN_的消息可以处理,所以要转换, 不知道对不对,呵,大概如此吧。
 
现在我中要知道这部分的意思就行了,
if (Handle <> 0) and (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and
(OwningProcess = GetCurrentProcessId) then
if GlobalFindAtom(PChar(ControlAtomString)) = ControlAtom then
Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)))

请大家帮忙
 
我从字面上理解一下:请楼下的指正。
如果容器handle<>0 AND 该容器ID(该容器类已经注册(就有ID))<>0 and 该容器处于活动状态,那么....有点不对劲了?我怎么看着不像是找CHILD啊。。。连循环都没有。费解。请楼下的看看。
 
是不是回调呢,我是瞎说的
 
后退
顶部