*******窗体获得焦点得问题********(100分)

  • 主题发起人 主题发起人 SINGLBOY
  • 开始时间 开始时间
S

SINGLBOY

Unregistered / Unconfirmed
GUEST, unregistred user!
我要在我的窗体获得焦点时,也就是窗体的标题栏由灰色变成蓝色时要做一件事;
我用过WM_SETFOCUS,CM_MOUSEENTER,但在窗体上有控件时控件也会响应消息
我该怎么办?[:(][:(][:(]
 
在窗体的OnActive事件里写代码
 
>>教父
; OnActive不行
 
应该来说OnActive事件行啦?你是什么控件?能不能说一下你的大致过程?
 
onactive可以呀
我建了两个form,在form1切换到form2时就触发了,你说怎么不行了?
 
我已经说的很清楚啦!
不管窗体上有什么控件,也不是调用hide,show
只是在[red]两个程序的窗口间[/red]用mouse或别的方法使窗体成为当前的窗口
就是在窗体的标题栏由灰色变成蓝色时我要调用一个函数![:(]
 
在FORM的OnActivate事件中写代码就行了
你所说的不行是没有执行这个事件里的代码吗?
实在不行你就把代码贴出来吧。
 
unit Unit1;

interface

uses
; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
; TForm1 = class(TForm)
; ; procedure FormActivate(Sender: TObject);
; private
; ; { Private declarations }
; public
; ; { Public declarations }
; end;

var
; Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormActivate(Sender: TObject);
begin
; ShowMessage('Form Activate');
end;

end.
将你的mouse在别的窗体上电一下,再电一下本窗体,你会发现没有反应!!!!!![:(]
;
 
我也说得很清楚了!
不管你是用什么方法,只要是窗体的标题栏由灰色变成蓝色时就会触发OnActive事件,你要想
调用那个函数,就在OnActive事件里头调用就行了!
 
呵呵, 明白你的意思了, 你是在MainForm上写的代码
这样的话,你点别的窗体再点回本窗体时激活的是Application.OnActivate,此
时MainForm的OnActivate时不会触发的。
如果你是在本程序内的两个不同窗体间是不会有这种情况出现的。
因此,你要在两个地方写代码,一是Application.OnActivate, 一是Form.OnActivate
 
to SINGLBOY 我刚才试了一下。
用form的paint事件可以达到你的需要,你试一下好吗?
 
是这样的,同一个进程中,窗口之间的切换会触发OnActive事件,但不同的进程之间不行。
OnPaint不行,只要窗口显示范围变化就会激发,无论此时它有没有被激活!

我帮你研究一下,再回答。
 
xianjun说的是
 
给你试了一下午才试出来,原来active的消息是Windows自定义的是b000就是45056
看看我的代码 ; [:D][:D][:D]


unit Unit1;

interface

uses
; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
; StdCtrls;

type
; TForm1 = class(TForm)
; ; Button1: TButton;
; ; Memo1: TMemo;
; ; procedure FormCreate(Sender: TObject);
; private
; ; { Private declarations }
; public
; ; procedure MyProcessMsg( var Msg: TMsg; var Handled: boolean );
; ; { Public declarations }
; end;

var
; Form1: TForm1;

implementation

{$R *.DFM}


procedure TForm1.MyProcessMsg(var Msg: TMsg; var Handled: boolean);
begin
; if msg.message=45056 then
; ; ShowMessage('Form Activate');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
; application.onmessage:= MyProcessMsg;
end;

end.
 
多谢各位大侠的指点,小虾米深受启发。看过大家的答案后我看了Messages单原,
有个消息同样可以实现WM_ACTIVATEAPP
; TForm1 = class(TForm)
; ; Edit1: TEdit;
; private
; ; { Private declarations }
; public
; ; procedure MyProcessMsg( var message:TWMACTIVATEAPP); message WM_ACTIVATEAPP;
; end;

var
; Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.MyProcessMsg(var message: TWMACTIVATEAPP);
begin
; if Message.Active then
; ; ShowMessage('Form Active');
end;

再次表示感谢!!![:D][:D][:D][:D]
分啦!
 
后退
顶部