Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Изображение на канве   Найти похожие ветки 

 
Вася   (2010-03-11 15:03) [0]

Уважаемые Мастера!

В run-time создаю потомок TPanel (у потомка Canvas, естественно, в public) и вывожу на канву некую картинку. Получается плохо. Не выводится. Что еще нужно учесть у потомка при его создании кроме FullRepaint:=false?


 
Демо ©   (2010-03-11 15:14) [1]


> В run-time создаю потомок TPanel (у потомка Canvas, естественно,
>  в public) и вывожу на канву некую картинку. Получается
> плохо. Не выводится.


Как создаёшь? Как выводишь?
Код где?


 
Вася   (2010-03-11 16:07) [2]


 TFPanel = class(TPanel)
 private
 ...
 protected
    procedure Paint; override;
 public
   property Canvas;
 ...
 
 var
   FPanel: TFPanel;

 ...

 FPanel:=TChip.Create(nil);
 FPanel.Left:=648;
 FPanel.Top:=440;
 FPanel.Width:=65;
 FPanel.Height:=65;
 FPanel.Visible:=true;
 FPanel.FullRepaint:=false;
 FPanel.Parent:=Form1;

// кидаем на канву FPanel битмап из Skin: TBitmap

 FPanel.Canvas.CopyRect(Bounds(0, 0, 10, 10), Skin.Canvas, Bounds(0, 0, 10, 10));


Результат: панелька успешно появляется на форме, но без отрисованной канвы. Скорее всего, происходит Refresh и результат стирается.


 
Вася   (2010-03-11 16:08) [3]

Пардон, конечно

FPanel:=TFPanel.Create(nil);


 
Демо ©   (2010-03-11 17:07) [4]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, JPEG;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Panel1: TPanel;
   procedure Button1Click(Sender: TObject);
   procedure FormPaint(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 TPN=class(TPanel)
 private
   FBM: TBitmap;
 public
   procedure Paint; override;
   constructor Create(aParent: TWinControl); reintroduce;
   destructor Destroy; override;
 end;

var
 Form1: TForm1;
 pn: TPN=nil;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 pn := TPN.Create(Self);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 if Assigned(pn) then pn.Paint;
end;

{ TPN }

constructor TPN.Create(aParent: TWinControl);
var
 JI: TJpegImage;
begin
 inherited Create(nil);
 Left := 100;
 Top := 100;
 Width := 300;
 Height := 300;
 Parent := aParent;
 FBM := nil;
 FBM := TBitmap.Create;
 JI := TJpegImage.Create;
 try
   JI.LoadFromFile("d:\projects\1.jpg");
   FBM.Assign(JI);
 finally
   JI.Free;
 end;

 Visible := True;

 Parent.Repaint;
 Paint;
end;

destructor TPN.Destroy;
begin
 FBM.Free;
 inherited;
end;

procedure TPN.Paint;
begin
 inherited;
   SetStretchBltMode(Canvas.Handle, HALFTONE);
   StretchBlt(
     Canvas.Handle,
     0,0,Width,Height,FBM.Canvas.Handle,0,0,FBM.Width,FBM.Height,SRCCopy);
end;

end.


 
Вася   (2010-03-11 17:08) [5]

Спасибо, буду разбираться.


 
Омлет ©   (2010-03-12 08:58) [6]

Панелька - не имэйдж, она не запоминает то, что ты на ней нарисовал.


 
KSergey ©   (2010-03-12 10:27) [7]

> Омлет ©   (12.03.10 08:58) [6]
> Панелька не запоминает

Дело даже не в панельке
Canvas - это объект, на котором надо рисовать в совершенно правильно перекрытом вами методе procedure Paint; override;
Заметьте, этот метод вызывается каждый раз, когда панельку надо нарисовать: например свернули/развернули окно, перекрыли (возможно частично) другим окном ваше приложение, а потом отодвинули его. Это стандартный механизм работы отрисовки в Windows.

Если вам нужна на форме (панельке) просто статичная картинка - проще положить на нее TImage (т.е. назначить ему parent"ом панельку) и загрузить в TImage картинку (ну или нарисовать ее на TImage). TImage ее запомнит (он для этого и нужен собственно) и будет каждый раз корректно отрисовывать без дополнительных усилий.


 
Б   (2010-03-12 10:38) [8]

В дополнение.
Можно и не создавать потомка TPanel.

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1367


 
Amir   (2010-03-12 11:57) [9]

"Классовый" подход тут и нафиг не нужен. Решение тривиально и ясно изложено в 7 (второй абзац)



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.161 c
15-1267353578
Andy BitOff
2010-02-28 13:39
2010.08.27
Использование Linux приравняли к пиратству


15-1265037576
TStas
2010-02-01 18:19
2010.08.27
Что за файлы с расширением GID?


15-1269740773
Незнайка на Луне
2010-03-28 05:46
2010.08.27
Подскажите название книги


2-1274513044
timekiller
2010-05-22 11:24
2010.08.27
TWebBrowser, Просмотр кода, Access Violation


2-1275097955
DROWSY
2010-05-29 05:52
2010.08.27
"Логический" тип данных Firebird 1.5 в компонентах.