Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1270824697
aalleexxaa
2010-04-09 18:51
2010.08.27
записать все содержимое базы данных Access в массивы


10-1167226388
Priest
2006-12-27 16:33
2010.08.27
Собственная реализация IDispatch


4-1235851954
Тыщ
2009-02-28 23:12
2010.08.27
Запустил раз — включилось, запустил второй — выключилось


2-1267694499
DenProx
2010-03-04 12:21
2010.08.27
Фильтрация связаных таблиц


2-1265658323
Константин
2010-02-08 22:45
2010.08.27
Назначение процедур для динамически создаваемых контролов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский