你要是像设置WS_EX_NOACTIVATE 样式这么干,就不用子类化edit了。要批量设置的话可以这样procedure TForm1.FormCreate(Sender: TObject); var i: Integer; edit: TEdit; begin for i := 0 to ControlCount - 1 do begin if Controls[i] is TEdit then begin edit := Controls[i] as TEdit; SetWindowLong(edit.Handle, GWL_STYLE, GetWindowLong(edit.Handle, GWL_STYLE) or WS_EX_NOACTIVATE); end; end; end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
edt1: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
OldWndProc: TWndMethod;
procedure NewWndProc(var m: TMessage);
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.NewWndProc(var m: TMessage);
begin
// 滤掉 WM_SETFOCUS 消息
if m.Msg <> WM_SETFOCUS then
OldWndProc(m);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
// 接管 edt1 的窗口过程
OldWndProc := edt1.WindowProc;
edt1.WindowProc := NewWndProc;
end;end.
光标是没有了,但是焦点还在,
如何让edit只起lable的作用?
已经是True了,但是还有焦点;
procedure TForm1.FormCreate(Sender: TObject);
begin
// 加一句
SetWindowLong(edt1.Handle, GWL_STYLE,
GetWindowLong(edt1.Handle, GWL_STYLE) or WS_EX_NOACTIVATE);
// 接管 edt1 的窗口过程
OldWndProc := edt1.WindowProc;
edt1.WindowProc := NewWndProc;
end;
感谢,问题基本解决,不过有个问题,
我有20个edit,每个都要这么干?
有简单批量的方法?
var
i: Integer;
edit: TEdit;
begin
for i := 0 to ControlCount - 1 do
begin
if Controls[i] is TEdit then
begin
edit := Controls[i] as TEdit;
SetWindowLong(edit.Handle, GWL_STYLE,
GetWindowLong(edit.Handle, GWL_STYLE) or WS_EX_NOACTIVATE);
end;
end;
end;
非常感谢sololie 大侠。。