极菜问题!TButton怎样改变背景图片? 好像不行吧。还是换Bitbtn之类的控件吧。不然,delphi为什么要提供这个控件? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SpeedButton很容易,TButton好象不行。Glyph是TBitbtn和SpeedButton本身的属性。 我不是说了吗??是TButton!!也就是那些没有canvas的控件怎么换图片!!! 除非你自己增加TButton的属性(把在TBitBtn的Glyph属性搬到TButton中,然后重新注册TButton控件 有没有其他办法呢?我是要给任意按钮添加图片,bitbtn,speedbutton很容易实现,但碰到TButton就没法了,谁能帮帮我!! 1、如果你只是想让普通的按钮只显示图像,可如下: SetWindowLong( Button1.Handle, GWL_STYLE, GetWindowLong( Button1.Handle, GWL_STYLE ) Or BS_BITMAP ); //bmp是TBitmap类型,且已装入一副图,具体装入不再详述,在不需要时,应释放bmp SendMessage( Button1.Handle, BM_SETIMAGE, IMAGE_BITMAP, bmp.Handle );2、如想任意改观,参见如下的实现,调试通过:unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); private { Private declarations } oldBtnProc : TWndMethod; Procedure MyBtnWndProc( Var msg : TMessage ); public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);Var pic : TPicture;begin oldBtnProc := Button1.WindowProc; Button1.WindowProc := MyBtnWndProc;end;Procedure TForm1.MyBtnWndProc( Var msg : TMessage );Var hdcBtn : HDC; btnCanvas : TCanvas; bmp : TPicture;Begin OldBtnProc( msg ); If (msg.Msg = BM_SETSTATE) Or (msg.Msg = WM_PAINT) Or (msg.Msg = WM_NCPAINT) Then Begin hdcBtn := GetWindowDC( Button1.Handle ); btnCanvas := TCanvas.Create; bmp := TPicture.Create; Try btnCanvas.Handle := hdcBtn; bmp.LoadFromFile( 'c:\win95\tiles.bmp' ); btnCanvas.Draw(0,0, bmp.Graphic ); Finally btnCanvas.Free; ReleaseDC( Button1.Handle, hdcBtn ); End; End;End;end. 非常感谢pipai但是有一个问题,在点击TButton时要出现闪烁怎么解决这个问题? 下面改进的button的WndProc可使文字不被图片挡住,但仍有闪烁(这种方法没法避免,除非全部自己画 --> 设置button为BS_OWNERDRAW,然后由Form处理WM_MEASUREITEM和WM_DRAWITEM消息,则可完全避免,但缺点是繁琐,你必须自己画Button各种状态的情况):Procedure TForm1.MyBtnWndProc( Var msg : TMessage );Var hdcBtn : HDC; btnCanvas : TCanvas; pic : TBitmap; bmp : TBitmap;Begin OldBtnProc( msg ); If (msg.Msg = BM_SETSTATE) Or (msg.Msg = WM_PAINT) Then Begin hdcBtn := GetDC( Button1.Handle ); btnCanvas := TCanvas.Create; pic := TBitmap.Create; bmp := TBitmap.Create; bmp.Width := Button1.Width; bmp.Height := Button1.Height; Try btnCanvas.Handle := hdcBtn; BitBlt( bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, btnCanvas.Handle, 0, 0, SRCCOPY ); bmp.TransparentColor := GetSysColor(COLOR_BTNFACE); bmp.Transparent := True; pic.LoadFromFile( 'c:\win95\sandstone.bmp' ); btnCanvas.Draw(0,0, pic ); btnCanvas.Draw(0,0,bmp ); Finally bmp.Free; pic.Free; btnCanvas.Free; ReleaseDC( Button1.Handle, hdcBtn ); End; End;End; 为什么非用TButton呢?不明白!我就乐意费事!? 我要这样做的目的是做一个换form上的控件的背景的控件,我没办法保证别人不放Tbutton之类的控件呀,C_hk明白了吗? 按Win32帮助的说明,通过设置button的style为bs_ownerdraw并接管WM_MEASUREITEM和WM_DRAWITEM消息,应该可以自画button,但我通过试验,发现只有在创建窗口时,就已经是bs_ownerdraw风格的button才能自画(如TBitbtn,它就是从TButton派生的),对于已创建的TButton的窗口,通过修改style,似乎不起作用,也就是说,似乎bs_ownerdraw只在创建窗口时有效(WIN32帮助中没指明),如果是这样的话,可能只有上述方法才能达到你的目的 无语 ADO错误:“找不到要更新的资料列,最后读取的值已经变更” 巨难,少了可以再加!用delphi如何实现.net的那种拖拽风格? 极简单问题,先来者得分! 如何显示数据库中的数据?? 元老们帮帮我! 如何改变ListView失去焦点后选中节点的颜色? 又一个delphi论坛成立了: http://www.91delphi.com 吔!! 如何使窗体出现不规则的形状 基于internet的编程用哪套控件好? 我操!在delphi中調用vb的mscomm控件要我注冊(??) 请教高手.为什么帮助文件中无法查到TDEVICEMODE 之类的控件说明.
Glyph是TBitbtn和SpeedButton本身的属性。
SetWindowLong( Button1.Handle, GWL_STYLE, GetWindowLong( Button1.Handle, GWL_STYLE ) Or BS_BITMAP );
//bmp是TBitmap类型,且已装入一副图,具体装入不再详述,在不需要时,应释放bmp
SendMessage( Button1.Handle, BM_SETIMAGE, IMAGE_BITMAP, bmp.Handle );2、如想任意改观,参见如下的实现,调试通过:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
oldBtnProc : TWndMethod;
Procedure MyBtnWndProc( Var msg : TMessage );
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
Var pic : TPicture;
begin
oldBtnProc := Button1.WindowProc;
Button1.WindowProc := MyBtnWndProc;
end;Procedure TForm1.MyBtnWndProc( Var msg : TMessage );
Var hdcBtn : HDC;
btnCanvas : TCanvas;
bmp : TPicture;
Begin
OldBtnProc( msg );
If (msg.Msg = BM_SETSTATE) Or (msg.Msg = WM_PAINT) Or (msg.Msg = WM_NCPAINT) Then
Begin
hdcBtn := GetWindowDC( Button1.Handle );
btnCanvas := TCanvas.Create;
bmp := TPicture.Create;
Try
btnCanvas.Handle := hdcBtn;
bmp.LoadFromFile( 'c:\win95\tiles.bmp' );
btnCanvas.Draw(0,0, bmp.Graphic );
Finally
btnCanvas.Free;
ReleaseDC( Button1.Handle, hdcBtn );
End;
End;
End;end.
Procedure TForm1.MyBtnWndProc( Var msg : TMessage );
Var hdcBtn : HDC;
btnCanvas : TCanvas;
pic : TBitmap;
bmp : TBitmap;
Begin
OldBtnProc( msg );
If (msg.Msg = BM_SETSTATE) Or (msg.Msg = WM_PAINT) Then
Begin
hdcBtn := GetDC( Button1.Handle );
btnCanvas := TCanvas.Create;
pic := TBitmap.Create;
bmp := TBitmap.Create;
bmp.Width := Button1.Width;
bmp.Height := Button1.Height;
Try
btnCanvas.Handle := hdcBtn;
BitBlt( bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, btnCanvas.Handle, 0, 0, SRCCOPY );
bmp.TransparentColor := GetSysColor(COLOR_BTNFACE);
bmp.Transparent := True;
pic.LoadFromFile( 'c:\win95\sandstone.bmp' );
btnCanvas.Draw(0,0, pic );
btnCanvas.Draw(0,0,bmp );
Finally
bmp.Free;
pic.Free;
btnCanvas.Free;
ReleaseDC( Button1.Handle, hdcBtn );
End;
End;
End;
不明白!我就乐意费事!?