Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблема при написании компонента


Автор: vitalio 23.3.2010, 19:44
Привет всем!!!
Я уже две недели мучаюсь с одной проблемой, пытался написать компонент (кнопку) на основе TCustomControl: 
Код
unit VTSButton;

interface

uses
  SysUtils, Classes, Controls,
  Windows, Graphics;

type
  TVTSButton = class(TCustomControl)
  private
    FBack: TBitMap;
    FLeaveImg: TBitMap;
    procedure LoadImg(Value: TBitMap);
  protected
  public
    constructor Create(AOWner: TComponent); override;
    destructor Destroy; override;
    procedure Paint; override;
  published
    property Image: TBitMap read FBack write LoadImg;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('VTSComponents', [TVTSButton]);
end;

{ TVTSButton }

constructor TVTSButton.Create(AOWner: TComponent);
begin
  inherited Create(AOWner);
  ControlStyle := ControlStyle - [csOpaque];
  Width := 100;
  Height := 20;
  FBack := TBitMap.Create;
  FLeaveImg := TBitMap.Create;
end;

destructor TVTSButton.Destroy;
begin
  FBack.Destroy;
  FLeaveImg.Destroy;
  inherited;
end;

procedure TVTSButton.LoadImg(Value: TBitMap);
begin
  FBack.Width := Value.Width;
  FBack.Height := Value.Height;
  BitBlt(FBack.Canvas.Handle, 0, 0, Value.Width, Value.Height,
         Value.Canvas.Handle, 0, 0, SRCCOPY);

  Width := FBack.Width;
  Height := FBack.Height;

  FLeaveImg.Width := FBack.Width;
  FLeaveImg.Height := FBack.Height;
  BitBlt(FLeaveImg.Canvas.Handle, 0, 0, FBack.Width, FBack.Height,
         FBack.Canvas.Handle, 0, 0, SRCCOPY);
end;

procedure TVTSButton.Paint;
begin
  inherited;
  BitBlt(Canvas.Handle, 0, 0, Width, Height, FBack.Canvas.Handle,
         0, 0, SRCCOPY);
end;

end.

этот исходник работает, но если в процедуре Paint попробовать вывести FleaveImg 
Код
procedure TVTSButton.Paint;
begin
  inherited;
  BitBlt(Canvas.Handle, 0, 0, Width, Height, FLeaveImg.Canvas.Handle,
         0, 0, SRCCOPY);
end;

то при запуске программы cavas моего компонента пустой, почему?
как решить данную проблему?

Автор: vitalio 26.3.2010, 12:27
кто-нибудь сталкивался с такой проблемой?

Автор: dvamaster 29.3.2010, 12:40
Код

  BitBlt(FBack.Canvas.Handle, 0, 0, Value.Width, Value.Height,
         Value.Canvas.Handle, 0, 0, SRCCOPY);


и

Код

  BitBlt(FLeaveImg.Canvas.Handle, 0, 0, FBack.Width, FBack.Height,
         FBack.Canvas.Handle, 0, 0, SRCCOPY);


попробуй заменить на

Код

  FBack.Assign(Value);


и

Код

  FLeaveImg.Assign(FBack);

Автор: vitalio 30.3.2010, 14:30
я так пробовал, эффекта ноль

Автор: dvamaster 31.3.2010, 09:19
тогда попробуй не API функциями, а функциями Canvas отрисовать

Автор: vitalio 31.3.2010, 20:48
пробовал не чего не получилось 

Автор: RomanEEP 31.3.2010, 21:11
Лучше за базовый класс взять TGraphicControl, посмотри на примере TShape

Автор: Cumshot 7.4.2010, 14:47
Компонент в рантайме создаешь? Попробуй ему пэрента указать VtsButton.Parent:=Form1;

Автор: Mikel 7.4.2010, 16:31
Сохрани в LoadImg свой FLeaveImg в файл и посмотри что там есть. Попробуй задать им PixelFormat.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)