控件 获得焦点,如何知道上一次获得焦点的控件是哪个控件?

如何知道上一次获得焦点的控件是哪个控件? - 故障解答 - 电脑教程网

如何知道上一次获得焦点的控件是哪个控件?

日期:2006-07-10   荐:
如何知道上一次获得焦点的控件是哪个控件?假设窗体上有三个列表框,一个按钮,那么单击按钮的时候,如何知道单击之前是哪个列表框有焦点??我觉得应该要设一个变量要记录现实问题是总共有3个列表框,N个按钮,其中有一个按钮是“删除”。想实现的功能是:1、只有在列表框获得焦点然后又点击“删除”的情况下才判断到底先前是那个列表框,然后把那个列表框中选中的条目删除。2、如果是其他按钮获得焦点然后点击了“删除”,那么什么事也不发生。所以说如果设置变量来判断的话就要在每个按钮的单击响应函数里都写上一行代码,似乎比较繁琐,因为按钮太多,而且以后也有可能增加其他能获得焦点的控件,总不能挨个都写上一行代码吧?有没有直接可以判断的那种API函数?设置一个变量TListBox *LastBox;在每个ListBox的OnExit事件中写LastBox = (TListBox *)Sender;这就知道哪个是最后失去焦点的ListBox了updingTo: samchoy(SamChoy)还是不行吧,假设那个ListBox失去焦点是因为点击了除了“删除”以外的其他按钮,那么这时候再点击“删除”,虽然那个变量记录着那个ListBox,可是其实前一个控件并不是那个ListBox哦,而是那个被点的按钮,这样就满足不了我说的那第二种情况了。判断前一个控件有点儿困难;但是可以反过来做:判断焦点离开这三个列表框后,是否点击了按钮。方法:在三个列表框的OnExit事件里(三个列表框可以共享一个OnExit事件处理函数),判断Form的ActiveControl属性是否为按钮(假设Name为Button1):if (ActiveControl == Button1) //焦点离开列表框后,点击了Button1{ ...//这里就可以用Sender来判断单击Button1之前,是哪个列表框有焦点}因为按钮太多,没法用samchoy(SamChoy)的办法,所以用了Libran()的办法,也是变相解决了,呵呵。不过现在还有个问题,用 Libran()的方法,在判断了ActiveControl是我需要的“删除”并且进行了一些操作之后,我发现整个程序处在鼠标在“删除”按钮上面按下但是没有松开的状态,因为这时把鼠标移动到“删除”上,按钮就会陷下去……而单击其他控件时必须点两次才有反应,这样虽然不影响使用但是让人感觉有Bug :(。是不是操作之后还要写什么辅助语句?给“删除”发送一个MouseUp消息?发现我不会用Perform(),不知道那些所谓的Msg, WParam, LParam都是做什么用的,从哪里查的。郁闷 :( 。在列表框的OnExit事件里只做下一个有焦点的是否为“删除”按钮的判断;而其他的操作还是要放在删除按钮的OnClick事件里处理。这是因为如果使用Tab键来切换焦点,同样会引发列表框的OnExit事件;而此时即使焦点移到了删除按钮上,但执行点击(包括敲空格或回车键)之前,是不需要进行判断处理的。代码示例如下:int ListBoxID = -1; //声明外部变量ListBoxID,并赋初始值,解释见后列表框OnExit函数:{ if (ActiveControl == Button1) //焦点离开列表框后,焦点移至Button1上 { //这里用Sender来判断焦点移到Button1上之前,是哪个列表框有焦点; //再用外部变量ListBoxID标示 if (((TListBox *)Sender)->Name == "ListBox1") ListBoxID = 1; else if (((TListBox *)Sender)->Name == "ListBox2") ListBoxID = 2; else if (((TListBox *)Sender)->Name == "ListBox3") ListBoxID = 3; } else ListBoxID = -1; //标示为-1,表示离开列表框后,焦点不在Button1上}Button1的OnClick函数:{ switch (ListBoxID) { case 1: //点击Button1前,有焦点的是ListBox1 break; case 2: //点击Button1前,有焦点的是ListBox2 break; case 3: //点击Button1前,有焦点的是ListBox3 break; default: //点击Button1前,有焦点的是其他控件 return; //什么都不做,返回 }}补充一下:还应该在Button1的OnExit事件里,赋ListBoxID = -1。(避免用Tab键将焦点从Button1切换出、再切换回来,而中间未经过列表框,造成判断错误)
标签: