控件焦点问题????(50分)

  • 主题发起人 wiseinfo
  • 开始时间
W

wiseinfo

Unregistered / Unconfirmed
GUEST, unregistred user!
控件焦点问题????
=================
我在TBIBTN的派生一个新控件,我想做到让这个控件有个属性是否获得焦点!!!AUTOFOCUS
IF AUTOFOCUS THEN
//获得焦点
ELSE
BEGIN
//不获得焦点 ,象SPEEDBUTTON一样!或象TOOLBARBUTTON一样!
//我用禁止消息处理,可以做到这个按钮不得到焦点,但是有个小小的问题是,但原来活动控件
表现去失去焦点,而且看不动光标! 有没有办法??不让原来的控件不失去焦点!!
END



 
可能要具体点,你的意图是什么?
 
简单的方法: 截获WM_SETFOCUS消息。 如果是禁止焦点时, 那么判断WParam是否为0, 为0则调用KillFocus杀掉自己的焦点。 如果不为0那么用SetFocus重新激活传进来的那个Handle
 
另有一个方法不知道是否可以:
想禁止焦点时:
1、设置TabStop := false; (阻断通过键盘选中的情况)
2、截获WM_MOUSEACTIVATE消息然后返回MA_NOACTIVATEANDEAT如果想接着收到MouseClick消息的话就返回MA_NOACTIVATE ( 防治鼠标激活它, 不知道是否会收到这个消息)
 
你用什么办法获得他的焦点的?
你用TWMDrawItem和DrawItemStruc了吗?
如果用了
应该
FCanvas.Handle := Msg.DrawItemStruct^.hDC;
Rect := ClientRect;
ith Msg.DrawItemStruct^ do
begin
OdsDown := ItemState and ODS_SELECTED <> 0;//按下
OdsFocus := ItemState and ODS_FOCUS <> 0;//焦点
ActionFocus := ItemAction = ODA_FOCUS;//激活焦点
end;
 
各位大侠,因为我好写个按钮控件,能够兼容XP效果和自定义的效果,而且与DELPHI能够
保持接近,以防DELPHI升级的痛苦!
我现在做法是把BUTTONS.PAS复制出来,把TBItBTN和TSPEEDBUTTON这些类名重命名!
如TBITBTN 重命名为TMXBitBtn
再改写TMXBitBtn.DrawItem 方法!
Another_eYes 我不太可能做一个全局的WM_SETFOCUS,只能写这个控件的:
procedure TMXBitBtn.WMSetFocus(var Msg: TWMSetFocus);
??? 我怎样禁止他! 我已经用消息的方法禁止了
得到焦点,现在没解决的是原来位置的控件表现出失出焦点的样子!!


chuguozhen,我不知道下面的东东是否只影响绘画的效果!
OdsFocus := ItemState and ODS_FOCUS <> 0;//焦点
ActionFocus := ItemAction = ODA_FOCUS;//激活焦点
而且我不知道把上面的代码放到那里,总不行的!
能够放到TMXBitBtn.DrawItem 里面吗???








Another_eYes,
 
procedure TMXBitBtn.WMSetFocus(var Msg: TWMSetFocus);
begin
if 禁止激活时 then
begin
Msg.Result := 0;
Windows.SetFocus(Msg.FocusWnd)
end
else inherited;
end;
 
Another_eYes: 谢谢,还需你关照!!
用TMXBitBtn.WMSetFocus()可以禁止当前控件得到焦点!!而且原来控件的焦点没有表现失去状态!!
但是按钮没有按下等状态了!!!

我用的方法已经实现了按钮禁止,而且按下等状态表现正常,关键是原来控件表现失出焦点!!
我在家里实现的,这里记不清具体方法!!!
能够把你的表现和我的表现结合就好了!!我回家试试!!现在公司!


 
你参考一下www.playicq.com里面的ColorButton吧
 
试试这个:
代码:
type
 ....
  procedure WMMouseActivate(var Msg: TWMMouseActivate); message WM_MOSUEACTIVATE;

procedure TMXBitBtn.WMMouseActivate(var Msg: TWMMouseActivate);
begin
  if 禁止激活时 then
    Msg.Result := MA_NOACTIVATE
  else
    inherited;
end;
 
Another_eYes:
你提供的方法不行!!你再试试!如果想不出也没关系,我计划不用这玩意也可以!!!
THANK YOU !!!
用下面的方法
procedure TMXBitBtn.WMSetFocus(var Msg: TWMSetFocus);
begin
if 禁止激活时 then
begin
Msg.Result := 0;
// Windows.SetFocus(Msg.FocusWnd) 这条不能用!!
end
else inherited;
end; 如果这样就禁止不住获得焦点
但在
procedure WndProc(var Message: TMessage); override;
IF MESSAGE.MSG=WMSetFocus THEN
Msg.Result := 0; 就可以!!

 
DELPHI6 中这样声明好象不行!
procedure WndProc(var Message: TMessage); override;

DELPHI7 可以!
 
chuguozhen, 我已经实现了COLOREBUTTON的全部功能!!
而且更先进!!
那个可是不支持图片的!!
 
我要给分了!!
Another_eYes 你要多少啊/??
 
呵呵, 随便吧。 一般这类控件我写的话不会继承标准windows控件来写的。 那样做要加自己的特效限制太多, 而且一般你需要一个OWNERDRAW的Style, 并且要截获一大堆事件才能达到你的要求(有时还不能完全达到)。
我会直接继承TWinControl或TControl(对继承自TControl的不过是给它另外生成一个windows的Handle来接受键盘消息和处理焦点而已)来做。 这样只要截获WM_PAINT消息, 在那里想怎么画就怎么画。 灵活方便多了。
 
Another_eYes 我把分全给你了!!!
谢谢你!!
其实我没能力写控件为专业,而且也不希望那样,毕竟花绿绿的控满网都是!!
我这个按钮控件没有从TWinControl或TControl继承,因为考虑到与DELPHI的接近,与DELPHI
升级保持很好的兼容,XP兼容等,从TWinControl或TControl实现一个很多效果的按钮,图片按钮,
等等,那是很麻烦的事情!我并不想维护代码!!
以前有个按钮控件,我是PDJ_BUTTON改过来的!加了一些自己的效果!!现在发现如果DELPHI升
级,就象兼容XP,改变那里面的东东是真的很麻烦的!!
如果有空就看看这个http://www.delphibbs.com/delphibbs/dispq.asp?lid=1468519

 
如果谁解决了,我会别开贴给分!
 
顶部