为什么我的的自己做的控件不能获得焦点啊?我快急死了!高手指教啊!(在线给分)(55分)

  • 主题发起人 主题发起人 曾阿牛
  • 开始时间 开始时间

曾阿牛

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的是继承TCustomcontrol父类,但是无论我在如何定义消息,
如:
procedure WMSetFocus (var Message: TWMSetFocus); message WM_SETFOCUS;
procedure wmkillfocus(var msg:twmkillfocus);message wm_killfocus;
还有CM_enter,CM_exit都不能触发该消息!这是为什么!!!
一部分代码在此!这是为什么!高手指教啊!
unit XpButton;

interface

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

type
TXpButton = class(TCustomcontrol)
private
FIsDown:Boolean;
FFoucus:Boolean;
FEnter:Boolean;
FCaption:String;
// Procedure Writecaption;
procedure WMSetFocus (var Message: TWMSetFocus); message WM_SETFOCUS;
procedure wmkillfocus(var msg:twmkillfocus);message wm_killfocus;
procedure cmMouseLeave(var msg: TMessage); message cm_MouseLeave;
procedure cmMouseEnter(var msg: TMessage); message cm_MouseEnter;
Procedure BorderColor;
Procedure IsDownColor;
{ Private declarations }
protected
procedure Paint;override;
// procedure Click; override;
procedure MouseUp(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); override;
procedure MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); override;
{ Protected declarations }
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
{ Public declarations }
published
property Caption;
Property Font;
Property TabOrder;
ProPerty TabStop;

{ Published declarations }
end;
 
to :曾阿牛:

我猜想是你的控件根本不能接收那些消息。
你的父类我想可能太低了,它还没有实现的消息的接受机制。
建议从一个较高一点的父类进行继承.

控件编写我只写过几个,遇到的问题不少,经验不足,权是给你提前吧
 
从TControl来继承!
 
create中加上下面两句:
ControlStyle := [csAcceptsControls, // 如果你希望你的控件上能放其他控件就加上
csCaptureMouse,
csClickEvents,
csDoubleClicks,
csReplicatable];
TabStop := True; // 如果你希望用Tab键也能获得焦点
 
重载WndProc方法!
TXpButton = class(TCustomcontrol)
..............................
procedure WndProc(var Message: TMessage); override;
.....................
end;



procedure TXpButton.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
if not (csDesigning in ComponentState) and not Focused then
begin
Windows.SetFocus(Handle);
if not Focused then Exit;
end;
end;
inherited WndProc(Message);
end;
 
to Pearl:

TabStop=False也一样可以获得焦点,只是不能用Tab键来获得焦点.
 
不明白,你干嘛要从TCustomControl继承,
 
to 唐太宗:
那你说从哪个类继承比较好呢???
TGraphicControl又无法获得焦点!
如果从Tcontrol又没有canvas属性,又无法画图!
请指教!
 
基本上没有可以有Canvas而又可以自动得到焦点的类,TCustomEdit和TButtonControl可以得到焦点,但是没有Canvas。
 
那我就觉得奇怪了,那为什么xp按钮能够得到焦点呢,又能自画呢????请指教!
 
这有什么其怪的?基本上没有可以有Canvas而又可以自动得到焦点的类,但并不代表可以自己做这样的类麻.
我的主页上就有一个带源码的:
www.aidelphi.com
13、一个可改变颜色的Bitbtn控件(源码) Download!

在TButton上继承下来并重载 procedure DrawItem(const DrawItemStruct: TDrawItemStruct);方法就可以自绘按钮了.
你也可以看TBitbtn的源码!
 
另外别忘了重载
procedure CreateParams(var Params: TCreateParams); override;
加上:

procedure TBitBtn.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do Style := Style or BS_OWNERDRAW;
end;
 
呵呵,我用BCB做了一个BUTTON好像可以啊,也是从CustomControl继承的。
Azib,你那个Button控件能不能改进一下,只能变变颜色,不是太好看。
 
喝喝,其实继承那段代码很简单,稍加修改就可以加上图片,甚至可以做成其他形状的BTN,我想对大家来说应该不难,我的主页的东东大多数都很简单,进行一些演示页已.
 
试试
procedure WmSetFocus(msg:tmessage);message WM_SetFocus;
 
多人接受答案了。
 
后退
顶部