谁能让它get focus? (200分先付一半)(100分)

  • 主题发起人 主题发起人 Another_eYes
  • 开始时间 开始时间
A

Another_eYes

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMyEdit = class(TEdit)
protected
procedure createparams(var params: Tcreateparams); override;
end;

var
Form1: TForm1;
temp: tmyEdit;

implementation

{$R *.DFM}
procedure TMyEdit.createparams(var params: Tcreateparams);
begin
inherited createparams(params);
params.exstyle := params.exstyle or WS_EX_TOOLWINDOW;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not assigned(temp) then
begin
temp := tmyEdit.create(application);
Temp.ParentWindow := getdesktopwindow;
Temp.Text := 'Test Text';
// temp.enabled := true; 无效
// temp.visible := true; 无效
setwindowpos(temp.handle, HWND_TOP, 50, 50, temp.width,
temp.height, SWP_SHOWWINDOW or SWP_NOCOPYBITS);
end;
end;

运行时按button1 会在screen左上位置出现一个edit. 但是我想尽办法
都无法使它获得输入焦点.
如果没有WS_EX_TOOLWINDOW的话, 任务栏上会出现一个button,
点击这个button能使edit获得输入焦点.

谁能在WS_EX_TOOLWINDOW状态下击活该edit, 不管是程序实现
还是其他手段, 只要能达到要求(告诉我把form1作为parent的不算, 一定
要在desktop上), 就可以得到 200 分
先付一半.
 
setwindowpos后面加一句
sendMessage(temp.handle,WM_SETFOCUS,0,0);
 
;h:HWND;

h:=Createwindow('edit',nil,ws_child or ws_visible or ws_border or
WS_EX_TOOLWINDOW,10,10,200,20,getdesktopwindow,
hmenu(-1),hinstance,nil);

嘻嘻,这个就可以,不过丑了一点,先将就着吧。
明天再改进。
 
;if not assigned(temp) then
begin
temp := TmyEdit.create(nil);
temp.Parent:=nil;
Temp.ParentWindow := getdesktopwindow;
Temp.Text := 'Test Text';
temp.enabled := true; // 无效
temp.visible := true; // 无效
setwindowpos(temp.handle, HWND_TOP, 50, 50, temp.width,
temp.height, SWP_SHOWWINDOW );
//temp.setfocus;
if SendMessage(form1.Handle,wm_killfocus,form1.Handle,0)<>0 then
ShowMessage('error 1');
if SendMessage(temp.Handle,wm_setfocus,temp.Handle,0)<>0 then
ShowMessage('error 2');
//显示error 2 but can setfocus, can select but can not
input ,delete ????
 
urus继续努力.
 
我想只有把一些TForm处理消息的方法移植到TMyEdit上才行。
 
hehe, 想知道答案的举手.
问题解决了. 另一半只好给eYes了.

这一半分了吧? 给谁呢?
 
me want to know
 
另一半分的问题如下:
tmp获得焦点之后当前的form deactive了, 如何使之能继续保持active?
 
eyes: 我感觉你是不是在研究那个"popmenu+edit"啊?
 
to amo, 不是.
第二个问题我也解决了. 看来要送分也送不成了.

解决方法如下:
1. 使myedit有焦点:
TMyEdit.Createparams(.......);
begin
inherited Createparams(params);
with params do
begin
style := style or WS_POPUP;
exstyle := exstyle or WS_EX_TOOLWINDOW;
end;
end;

2. 使myedit有焦点时form仍然activate(实际已经deactivate了, 只是titlebar
仍然显示成activate状态).
TForm1 = class(TForm);
....
private
procedure WMNCActivate(var Message: TMessage); message WM_NCACTIVATE;
....
end;

procedure TForm1.WMNCActivate(var Message: TMessage);
begin
message.result := 1;
end;
 
多人接受答案了。
 
后退
顶部