自定义类中的 wndporc消息无法拦截!!!请高手指教!!!(共300分)(200分)

  • 主题发起人 主题发起人 yourwcd
  • 开始时间 开始时间
Y

yourwcd

Unregistered / Unconfirmed
GUEST, unregistred user!
unit PopMenuunit;
interface
uses
Windows, Messages, Graphics, SysUtils, Classes, Controls, ExtCtrls,Menus,dialogs;

type
TPopMenu=class(TCustomControl)
public
procedure WndProc(var Message: TMessage); override;
end;

新创建了以上类,在主窗体上创建该类并做执行其他操作(类里面的其他方法),但WndProc中自定义的事件在设置断点调试时根本就不执行,不知道是什么原因呀。
 
实现呢?怎么写的?也许你拦截的代码错了呢?
 
function CreatePopMenu:HMENU;//创建菜单
在这个方法中加上一句代码.
FHWnd := AllocateHWnd(WndProc);
FHWnd是自己接收自己消息的句柄。
发送消息时,用此句柄!
 
function CreatePopMenu
方法名不是Create
创建这个类的实例时请用CreatePopMenu,如果还不行,请把function CreatePopMenu换成
constructor Create
 
你想拦截什么消息?哈哈,群里没有人解决,你贴到这上拉了?
 
TPopMenu=class(TCustomControl)
这句改改,从TWinControl继承
 
以上办法都不能够解决,还有谁有办法吗?有办法本题共有300分,我还有一个问题,分也加在这里了。
 
FHWnd := AllocateHWnd(WndProc);
这句有些多余,TCustomControl本身就具有一个窗口句柄。
type
TPopMenu=class(TCustomControl)
public
procedure WndProc(var Message: TMessage);override;
end;

{ TPopMenu }

procedure TPopMenu.WndProc(var Message: TMessage);
begin
if Message.Msg=WM_USER+1 then
ShowMessage('Ok');
inherited;
end;

//测试
procedure TForm1.Button1Click(Sender: TObject);
begin
with TPopMenu.Create(Self) do
try
Parent:=Self;
SendMessage(Handle,WM_USER+1,0,0);
finally
Free;
end;
end;

end;
 
楼主是想做什么,拦截系统消息?还是自定义消息?
如果是自定义消息,那下面的代码是正确的,我已经测试过了。D7+WIN2000
unit Unit2;

interface
uses
Windows, Messages, Graphics, SysUtils, Classes, Controls, ExtCtrls,Menus,dialogs;

const
PWM_GOTCOMMDATA=WM_USER+1;

type
TPopMenu=class(TCustomControl)
private


public

FHWnd : Thandle;
constructor Create;
destructor destroy();override;
procedure WndProc(var Message: TMessage); override;
Procedure sendmessage;
end;

implementation

constructor TPopMenu.Create;
begin
FHWnd := AllocateHWnd(WndProc);

end;

procedure TPopMenu.WndProc(var Message: TMessage);
begin
case Message.Msg of
PWM_GOTCOMMDATA:showmessage('received');
end;
end;

destructor TPopMenu.destroy();
begin
DeallocateHWnd(FHwnd);
FHwnd:=0;
end;


Procedure TPopMenu.sendmessage;
begin
PostMessage(FHWnd,PWM_GOTCOMMDATA,0,0);
end;

end.
 
我终于明白了代码为什么不执行了,我虽然继承的是TCustomControl,但正如我类名一样,我实际定义的是一个弹出菜单,所以弹出事件拦截不到WndProc,我修改了一下,该为一个TWinControl的控件,WndProc就可以拦截到了,这是什么原因?
我的目的是创建一个弹出菜单类,但TPopupMenu没有WndProc,所以我就继承了TWinControl或TCustomControl,是我搞错了吗?我应当怎么继承才可以?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部