Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизИзображение на канве Найти похожие ветки
← →
Вася (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.161 c