下面的程序不知道能否实现,SetGlyph()和GetGlyph()方法是从TSpeedButton类中抄过来的,但是下面的程序编译时提示无法识别TButtonGlyph类,但是我Use了Buttons单元,为什么??如果您知道怎么实现这个功能请您赐教!unit ButtonPanel;interfaceuses
  Windows, Messages, SysUtils, Classes, Controls,ExtCtrls,Buttons;type
  TButtonPanel = class(Tpanel)
  private
    FDown:Boolean;
    FGlyph: Pointer;
    Procedure  SetDown(Value:Boolean);
    function GetGlyph: TBitmap;
    procedure SetGlyph(Value: TBitmap);
    procedure GlyphChanged(Sender: TObject);
  protected
    { Protected declarations }
  public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
  published
    Property  Down:Boolean Read FDown Write SetDown;
    property  Glyph: TBitmap read GetGlyph write SetGlyph;
  end;procedure Register;implementationprocedure Register;
begin
  RegisterComponents('SelfCom', [TButtonPanel]);
end;{ TButtonPanel }constructor TButtonPanel.Create(AOwner: TComponent);
begin
  FGlyph := TButtonGlyph.Create;
  TButtonGlyph(FGlyph).OnChange:=GlyphChanged;
  inherited;
  FDown :=True;
  Width :=50;
  Height:=40;
  BevelInner:= bvRaised;
  BevelOuter:= bvRaised;
  Caption:='ButtonPanel1';
end;function TButtonPanel.GetGlyph: TBitmap;
begin
  Result := TButtonGlyph(FGlyph).Glyph;
end;
    
procedure TButtonPanel.SetGlyph(Value: TBitmap);
begin
  TButtonGlyph(FGlyph).Glyph := Value;
  Invalidate;
end;procedure TButtonPanel.SetDown(Value:Boolean);
begin
   if Value then  begin
      BevelInner:= bvRaised;
      BevelOuter:= bvRaised;
   end
   else begin
      BevelInner:= bvLowered;
      BevelOuter:= bvLowered;
   end;
   FDown:=Value ;
end;
procedure TButtonPanel.GlyphChanged(Sender: TObject);
begin
    Invalidate;
end;destructor TButtonPanel.Destroy;
begin
  TButtonGlyph(FGlyph).Free;
  inherited;
end;end.

解决方案 »

  1.   

    TButtonGlyph类是在Buttons单元中定义了的。
      

  2.   

    如何改造Panel,使他能够加入图像啊!!!!!!!!!
      

  3.   

    要Tpanel能画图不难
    因为她没有Canvas,所以要创建一个TControlCanvas()对象
    这个对象的Control:=Tpanel
    然后就可以直接在这个你创建的画布上面画图了画完就会在Tpanel上看到
      

  4.   

    TButtonGlyph在Buttons的implementation之下,是访问不到了;可以试着改Buttons,或者把那些东西都加到你的TButtonPanel中,想是比较麻烦的;可用楼上的Canvas方法试试
      

  5.   

    谢谢各位,其实用Panel和Image融合在一起应该可以实现,但是,我做的还是不对,大家想想看怎么做。请给出源程序。
      

  6.   

    //正好有个简单的 看看是不是满足你的要求
    unit uImagePanel;interfaceuses
      SysUtils, Classes, Controls, ExtCtrls,Windows,Graphics,Messages;type
      TImagePanel = class(TPanel)
      private
        { Private declarations }
        FBitmap:TBitmap;
        FBmpFileName: string;
        FStreatch: Boolean;
        FDisplayImageFileName: Boolean;
        procedure SetBmpFileName(const Value: string);
        procedure SetStreatch(const Value: Boolean);
        procedure SetDisplayImageFileName(const Value: Boolean);
      protected
        { Protected declarations }
        procedure Paint;override;
            procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
      public
        { Public declarations }
      published
        { Published declarations }
        property BmpFileName:string read FBmpFileName write SetBmpFileName;
        property Streatch:Boolean read FStreatch write SetStreatch default False;
        property DisplayImageFileName:Boolean read FDisplayImageFileName write SetDisplayImageFileName default True;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Report', [TImagePanel]);
    end;{ TImagePanel }procedure TImagePanel.SetBmpFileName(const Value: string);
    begin
      FBmpFileName := Value;
      if FileExists(FBmpFileName) then
      begin
        if not Assigned(FBitMap) then
          FBitmap:=TBitmap.Create;
        FBitmap.LoadFromFile(FBmpFileName);
        Paint;
      end
      else
      begin
        FBitmap.Free;
        FBitmap:=nil;
        Paint;
      end;end;procedure TImagePanel.Paint;
    var
      Rect:TRect;
    begin
      //  if not Assigned(FBitmap) then
      begin
        inherited;
        Canvas.TextOut(0,0,'无图像');
        Exit;
      end;  Canvas.Lock;
      try    inherited;
        if FStreatch then
        begin      Rect.Left:=0;
          Rect.Top:=0;
          Rect.Bottom:=Height+Top;
          Rect.Right:=Width+Left;      //拉伸
          Canvas.StretchDraw(Rect,FBitmap);
        end
        else
        begin
          //不拉伸
          Canvas.Draw(0,0,FBitmap);
        end;
        if csDesigning in ComponentState then
        with Canvas do
        begin
          Canvas.Pen.Color:=clRed;
          if FDisplayImageFileName then
            Canvas.TextOut(0,0,PChar(FBmpFileName));
        end else
        begin
          if FDisplayImageFileName then
          Canvas.TextOut(0,0,PChar(FBmpFileName)) ;
        end;
      finally
        Canvas.Unlock;
      end;end;procedure TImagePanel.WMEraseBkgnd(var Message: TWmEraseBkgnd);
    begin
      //强制重绘
      Paint;
      //由系统重绘
      //UpdateWindow(Handle);
    end;procedure TImagePanel.SetStreatch(const Value: Boolean);
    begin
      if FStreatch<> Value then
      begin
        FStreatch := Value;
        Paint;
      end;
    end;procedure TImagePanel.SetDisplayImageFileName(const Value: Boolean);
    begin
      if FDisplayImageFileName<> Value then
      begin
        FDisplayImageFileName := Value;
        Paint;
      end;
    end;end.