可视元件如何处理所在窗体消息?(100分)

  • 主题发起人 laozhongcheng
  • 开始时间
L

laozhongcheng

Unregistered / Unconfirmed
GUEST, unregistred user!
请问在Delphi中如何处理可视元件所在窗体的消息。我试过使用SetWindowsLong设置消息
处理函数不行,这样会造成窗体接受消息不正常。敬请各位DFW指教。
 
事实上确实需要使用SetWindowsLong来实现窗体的子类化。新的窗口过程处理你需要处理的
消息,没有处理的还要调用久的消息处理函数。例如:
1:建立新的窗口过程
NewWndProc := MakeObjectInstance(NewWndMethod);
2:设置新的消息窗口过程并保存旧的窗口过程
OldWndProc := Pointer(SetWindowLong(Handle, gwl_WndProc,Longint(NewWndProc)));
3:新的窗口过程
Procedure TForm1.NewWndMethod(var Msg:TMessage);
begin
case Msg.Msg of
WM_XXXX1: //消息处理
WM_XXXX2: //消息处理
end;
//如果在消息在上面没有处理,则调用旧的窗体函数
Msg.Result := CallWindowProc(OldWndProc, Handle, Msg.Msg, Msg.WParam, Msg.LParam);
end;
4.记着在控件解除时释放新窗口过程的对象实例
SetWindowLong(Handle, gwl_WndProc, Longint(OldWndProc));
FreeObjectInstance(NewWndProc);
 
关键在于我在组件内部调用,在析构过程中调用
SetWindowLong(Form.Handle, GWL_WNDPROC, Longint(OldWndProc));
出现异常Access violation
 
已经解决了,对Owner遍历了一遍,获得窗体的句柄就可以了。
好奇怪的问题。谢谢tingjie。结帖了。
 
接受答案了.
 
顶部