如题,我在一个按钮Button1上画了个图片,没问题,但是为什么一按鼠标图片就消失了?
procedure TForm1.Button2Click(Sender: TObject);
var
  cas:Tcanvas;
  bmp:Tbitmap;
begin
  bmp:=Tbitmap.Create;
  bmp.LoadFromFile('d:\0.bmp');
  cas:=Tcanvas.Create;
  cas.Handle :=Getdc(Button1.Handle);
  cas.StretchDraw(Button1.ClientRect,bmp);
  cas.Textout(Button1.Width div 2 -2,Button1.Height div 2-2,Button1.Caption);
  bmp.Free;
  cas.Free;
end;
我也想研究研究BitBtn的代码,不过水平太低,有点不大懂。请问我应该重载什么函数,或者截获什么事件,以便重画图片么?多谢!

解决方案 »

  1.   

    我现在也正在郁闷这个问题,基本上是无句柄的控件要响应WMPAINT,有句柄的是通过WMPAINT响应函数PAINTCONTROLS\PAINTWINDOW\PAINTHANDEL四个函数来实现。
    我现在郁闷的是,我的控件根本不响应WMPAINT!!:(
      

  2.   

    刚刚试过了WMPaint,好像也不大管用,按鼠标后图像依然消失procedure TTestButton.WMPaint(var Message: TWMPaint);
    begin
      inherited;
      PaintBitmap;//我自己的绘图函数
    end;
      

  3.   

    procedure TTestButton.WMPaint(var Message: TWMPaint);
    begin
    //  inherited;
      PaintBitmap;//我自己的绘图函数
      PaintText; //添加画文字 
    end;
      

  4.   

    补充,在WMPaint中,除了边框,按钮各种状态的表现都得你自己画,其实边框也可自己画。
      

  5.   

    多谢,不过我还是想知道为什么不应该写inherited;?我先写inherited再写我的刷新函数,应该是我的函数起效呀?!另外,我怎么应该画边框呢?(因为我想图片小于按钮,那必须自己画边框了),再次多谢!
      

  6.   

    因为Button是Windows的标准控件,VCL只不过把它包装了一下,真正画Button的代码你在VCL中是看不到的,是Windows系统绘制的。如果你想开发一个具有你自己特色的按钮,是不应该重载WM_PAINT的,应该重载他的CreateParams方法修改Button的建立参数,然后,相应CN_MEASUREITEM和CN_DRAWITEM消息。具体操作细节你可看VCL源码Buttons.pas里面的TBitbtn的实现,当然,TBitbtn画按钮的方法很复杂,你可以按你的需要简化,但是,按钮的激活、禁止、按下、弹起、鼠标滑动等等状态的确是复杂的。
      

  7.   

    maozefa(阿发伯)是这方面的专家,LZ多多学习。我就不献丑了。
      

  8.   

    procedure TImageButton.CreateParams(var Params: TCreateParams);
    begin
      inherited CreateParams(Params);
      with Params do Style := Style or BS_OWNERDRAW;
    end;
      

  9.   

    sanmaotuo(老冯)好几天不见,又在哪儿发财?
      

  10.   

    procedure TImageButton.CNMeasureItem(var Message: TWMMeasureItem);
    begin
      with Message.MeasureItemStruct^ do
      begin
        itemWidth  := Width;
        itemHeight := Height;
      end;
    end;procedure TImageButton.CNDrawItem(var Message: TWMDrawItem);
    var
      SaveIndex: Integer;
    begin
      with Message.DrawItemStruct^ do
      begin
        SaveIndex := SaveDC(hDC);
        FCanvas.Lock;
        try
          FCanvas.Handle := hDC;
          FCanvas.Font := Font;
          FCanvas.Brush := Brush;
          DrawButton(rcItem, itemState);
        finally
          FCanvas.Handle := 0;
          FCanvas.Unlock;
          RestoreDC(hDC, SaveIndex);
        end;
      end;
      Message.Result := 1;
    end;