用createwindow()函数建的edit控件,如何为它加上keydown事件 (100分)

  • 主题发起人 主题发起人 fjx_jwf
  • 开始时间 开始时间
F

fjx_jwf

Unregistered / Unconfirmed
GUEST, unregistred user!
我建了一个控件h,继承自twincontrol然后又用createwindow()函数建的edit控件,父句柄为h,现在是如何为这个edit加上keydown事件
 
比如:
eHandle:=CreateWindow('Edit',Nil,WS_CHILD or WS_VISIBLE or WS_BORDER,0,0,120,20,Self.Handle,0,hInstance,Nil);
OldWndProc:=Pointer(GetWindowLong(eHandle,GWL_WNDPROC));
SetWindowLong(eHandle,GWL_WNDPROC,LongInt(@EditWndProc));

function EditWndProc(hwnd: HWnd; Msg: Cardinal; wParam, lParam: Integer): Integer; stdcall;
begin
if Msg = WM_KEYDOWN then
begin
ShowMessage('123');
end;
Result := CallWindowProc(OldWndProc,hwnd,Msg,wParam,lParam);
end;
 
非常感谢,我马上试
 
to pihome:我试了一下:
function EditWndProc(hwnd: HWnd; Msg: Cardinal; wParam, lParam: Integer): Integer; stdcall;
begin
if Msg = WM_KEYDOWN then
begin
ShowMessage('123');
end;
Result := CallWindowProc(OldWndProc,hwnd,Msg,wParam,lParam);//执行这句时要报错,不知为什么,你的邮箱是多少我把错误提示发给你,麻烦你帮我瞧一下
end;
 
你这样试试吧
var
OldWndProc: Pointer;

function EditWndProc(hwnd: HWnd; Msg: Cardinal; wParam, lParam: Integer): Integer; stdcall;
begin
if Msg = WM_KEYDOWN then
begin
ShowMessage('123');
end;
Result := CallWindowProc(OldWndProc,hwnd,Msg,wParam,lParam);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
eHandle: HWND;
begin
eHandle:=CreateWindow('Edit',Nil,WS_CHILD or WS_VISIBLE or WS_BORDER,0,0,120,20,Self.Handle,0,hInstance,Nil);
OldWndProc:=Pointer(GetWindowLong(eHandle,GWL_WNDPROC));
SetWindowLong(eHandle,GWL_WNDPROC,LongInt(@EditWndProc));
end;
 
我新建一个工程加入你的代码,运行没问题
可是将一移入我的控件中就要报错了
 
比较奇怪,TWinControl派生的控件都有键盘事件的啊。
 
我也知道,可是我是直接用createwindow建立edit输入控件,没用vcl,我把这个edit放在一个twincontrol继承过来的面板上,面板的keydown事件我已经写好了,但是一旦焦点落入edit后面板的keydown事件就得不到响应了
 
那样比较麻烦啊,你的Edit输入控件要自己处理消息啊。

pihome的方法应该可行的,你也可以试试MakeObjectInstance和FreeObjectInstance函数,它可以将一个对象方法作为窗口过程使用。具体的实例可以参考TCustomComboBox中对消息的处理。
 
to pihome:能告诉我邮箱吗,我把源程序发给你,你帮我瞧一下
 
to thx1180:谢谢,我试一下
 
pihome@pihome.net
 
to pihome:我已经发到你的邮箱了
 
并未收到 [:(]
 
接受答案了.
 
后退
顶部