我改写了image控件,加一个label,但label显示不出来 ( 积分: 90 )

  • 主题发起人 主题发起人 duanbukui
  • 开始时间 开始时间
D

duanbukui

Unregistered / Unconfirmed
GUEST, unregistred user!
整个单元是这样的:
unit ImgBtn;

interface

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

type
TImgBtn = class(TImage)
private
CLabel : TLabel;
FGetCaption: TCaption;
procedure MouseIn(var MSG : TMessage); message CM_MOUSEENTER;
procedure MouseOut(var MSG : TMessage); message CM_MOUSELEAVE;
procedure SetCaption(const Value: TCaption);
protected
{ Protected declarations }
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
published
property Caption : TCaption read FGetCaption write SetCaption;
property OnClick ; //继承点击事件
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Dpider', [TImgBtn]);
end;

{ TChangeImage }

constructor TImgBtn.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
//组件部分=======================
Caption := '';
Width := 32 ;
Height := 32 ;
ShowHint := True ;
Stretch := True ;
Transparent := True ;

//标签部分=======================
if CLabel = nil then
CLabel := TLabel.Create(nil);
CLabel.Parent := TWinControl(self) ;

CLabel.Left := Left - ((CLabel.Width-Width) div 2) ;
CLabel.Top := Top +Height+5 ;
CLabel.Visible := True ;
CLabel.Transparent := True ;
CLabel.ShowHint := True ;
CLabel.Hint := Hint ;
CLabel.Font.Size := 9;
CLabel.Font.Color := clBlack;
CLabel.Font.Name := '宋体';
CLabel.Font.Charset := GB2312_CHARSET;
CLabel.AutoSize := True;
CLabel.Caption := FGetCaption;
end;

destructor TImgBtn.Destroy;
begin
inherited Destroy;
if CLabel<>nil then CLabel.Hide ;
end;

procedure TImgBtn.MouseIn(var MSG: TMessage);
begin
if CLabel<>nil then
begin
CLabel.Font.Color := clBlue;
CLabel.Font.Style := CLabel.Font.Style+[fsUnderline] ;
Screen.Cursor := crHandPoint ;
end ;
end;

procedure TImgBtn.MouseOut(var MSG: TMessage);
begin
if CLabel <> nil then
begin
CLabel.Font.Color := clBlack;
CLabel.Font.Style := CLabel.Font.Style-[fsUnderline] ;
Screen.Cursor := crDefault ;
end ;
end;

procedure TImgBtn.SetCaption(const Value: TCaption);
begin
FGetCaption := Value;
if CLabel <> nil then
CLabel.Caption := FGetCaption;
end;

end.
 
可能是你的label在图下面呆着呢。其实你有更好的办法做到label这样效果。就是你继承TImage控件的paint事件,在里面自己用drawtext函数画上去,可能效果更多,更好
 
TImage控件 没paint事件啊,大哥,能说详细点么?
 
Image有Paint方法,你可以继承一个Image,然后override这个Paint,在里面写
begin
inherited;
//下面的代码是把文本Draw上去
DrawTextOnImage;
end;
即可。
 
怎么一直不停的闪啊
大哥,我qq 122789881,直接向您请教吧
 
TImage是从TGraphicControl继承过来的,所以你创建的Label.Parent根本就是无效。
楼主的意思就是响应鼠标的进出,直接从TGraphicControl继承就可以了。

procedure TImgBtn.MouseIn(var MSG: TMessage);
begin
Canvas.Font.Color := clBlue;
Canvas.Font.Style := Canvas.Font.Style+[fsUnderline] ;
Screen.Cursor := crHandPoint ; Invalidate: //重绘
end;

procedure TImgBtn.MouseOut(var MSG: TMessage);
begin
Canvas.Font.Color := clBlue;
Canvas.Font.Style := Canvas.Font.Style-[fsUnderline] ;
Screen.Cursor := crDefault ; Invalidate; //重绘
end;

procedure TImageBtn.Paint;
begin
Canvas.TextOut(0, 0, FText);
end;
end;
 
还是会不停的闪动啊
而且textout的字怎么去掉背景色让它透明啊?
 
SetBKMode(Canvas.Handle, TransParent);
 
procedure TImgBtn.Paint;
begin
inherited;
Canvas.TextOut(10,10,FGetCaption) ;
SetBKMode(Canvas.Handle,TransParent) ; //此行有误
end;

[Error] ImgBtn.pas(73): Incompatible types: 'Integer' and 'Boolean'
 
procedure TImgBtn.Paint;
begin
inherited;
SetBKMode(Canvas.Handle,Windows.TransParent) ;
Canvas.TextOut(10,10,FGetCaption) ;
end;
 
[:I]太感谢了,还有就是image不停地闪,怎么解决啊
 
呵呵,绘制区域比较大时,为避免闪烁需要使用很多技巧。
比如上面我使用了Invalidate而不是调用Paint方法。Invalidate把Paint消息放到队列里,如果有多个Paint消息时,系统会压缩,绘制一次就完成了。
另一个就是双缓冲。
 
CLabel.Parent := TWinControl(self) ;
//老兄,你的组件继承自TImage,就算你把它强制转化成TWincontrol,它也是不能做parent的
 
v还是会不停的闪动啊
而且textout的字怎么去掉背景色让它透明啊?

canvas.brush.style:=slClear;//这样就透明了。
Canvas.textout(10,10,'Your Text');
 
或许你可以参考一下 TLabeledEdit
 
接受答案了.
 
后退
顶部