好像不行吧。
还是换Bitbtn之类的控件吧。不然,delphi为什么要提供这个控件?

解决方案 »

  1.   

    SpeedButton很容易,TButton好象不行。
    Glyph是TBitbtn和SpeedButton本身的属性。
      

  2.   

    我不是说了吗??是TButton!!也就是那些没有canvas的控件怎么换图片!!!
      

  3.   

    除非你自己增加TButton的属性(把在TBitBtn的Glyph属性搬到TButton中,然后重新注册TButton控件
      

  4.   

    有没有其他办法呢?我是要给任意按钮添加图片,bitbtn,speedbutton很容易实现,但碰到TButton就没法了,谁能帮帮我!!
      

  5.   

    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.
      

  6.   

    非常感谢pipai但是有一个问题,在点击TButton时要出现闪烁怎么解决这个问题?
      

  7.   

    下面改进的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;
      

  8.   

    为什么非用TButton呢?
    不明白!我就乐意费事!?
      

  9.   

    我要这样做的目的是做一个换form上的控件的背景的控件,我没办法保证别人不放Tbutton之类的控件呀,C_hk明白了吗?
      

  10.   

    按Win32帮助的说明,通过设置button的style为bs_ownerdraw并接管WM_MEASUREITEM和WM_DRAWITEM消息,应该可以自画button,但我通过试验,发现只有在创建窗口时,就已经是bs_ownerdraw风格的button才能自画(如TBitbtn,它就是从TButton派生的),对于已创建的TButton的窗口,通过修改style,似乎不起作用,也就是说,似乎bs_ownerdraw只在创建窗口时有效(WIN32帮助中没指明),如果是这样的话,可能只有上述方法才能达到你的目的