Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Вниз

Canvas для TPanel   Найти похожие ветки 

 
Fast   (2003-12-18 12:26) [0]

Уважаемые мастера! Возможно ли использовать канвас вот такми образом

unit Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
const sss = "AAAAAA SSSSSS DDDDDDD FFFFFFF aaaaa bbbbbb cccccccc";

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

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var R : TRect;
L,T,W,H : integer;
begin
Panel2 := TPanel2.Create(self);
with Panel2 do begin
L := 10; T := 10; W := 300; H := 280;
SetBounds(L-5, T-5, W-3, H);
Color := clWhite;
Parent := Panel1;
R := Rect(0,0,Width,Height);
Canvas.Rectangle(R.Left-8, R.Top-8, R.Right+8, R.Bottom+8);

Canvas.Font.Color := clred;
Canvas.Font.Size := 8;
Canvas.TextOut(10,10,SSS);
// DrawText(Canvas.Handle,PChar(SSS), -1, R, dt_WordBreak or dt_Center);
// Canvas.TextRect(R,10,10,SSS);
end;
end;

end.

Ни в одном из вариантов ничего не рисуется, м.б. быстро проскакивает. Заранее благодарен.


 
Skier   (2003-12-18 12:28) [1]

У ты уверен что у TPanel есть канва ?
Всё не так просто...


 
Fast   (2003-12-18 12:29) [2]

см. выше

type
TPanel2 = class(TPanel)
public
property Canvas;
end;


 
Skier   (2003-12-18 12:31) [3]

Угу. Сорри. Моя ошибка...


 
Тимохов   (2003-12-18 12:32) [4]

Даже если и есть канва (не помню), то все равно рисовать надо в специальном событии, отвечающем за прорисовку.

В данном примере ИМХО надо использовать TPaintBox и делать прорисовку в OnPaint


 
Fast   (2003-12-18 12:33) [5]

Хотелось бы мою ошибку ...


 
Fast   (2003-12-18 12:35) [6]

В одной книжке сказано , что можно и так.
<В данном примере ИМХО надо использовать TPaintBox и делать прорисовку в OnPaint>
Если возможно, то подробности ...


 
Тимохов   (2003-12-18 12:36) [7]

Fast (18.12.03 12:33) [5]
Ну типа, нельзя рисовать так - надо делать это в спец. методах или событиях.

Например можешь перекрыть procedure Paint; override; у панели.


 
Тимохов   (2003-12-18 12:38) [8]


> Fast (18.12.03 12:35) [6]
> В одной книжке сказано , что можно и так.
> <В данном примере ИМХО надо использовать TPaintBox и делать
> прорисовку в OnPaint>
> Если возможно, то подробности ...


1. Думаю эту книжку надо постранично использовать для определенных нужнд
2. Подробнее: пишешь OnPaint, нажимаешь f1, из предложненного списка выбираешь TPaintBox, смотришь примеры их там целых два.


 
Тимохов   (2003-12-18 12:43) [9]

Типа один из примеров.
Обрати внимание на фразу will not be persistent

When you do custom drawing, such as shown in the code for the Button"s OnClick event handler below, this drawing will not be persistent and will be "erased" the first time the PaintBox component needs to repaint.

procedure Form1.Button1Click(Sender: TObject);
begin
PaintBox1.Canvas.Brush.Color := clRed;
PaintBox1.Canvas.FillRect(PaintBox1.Canvas.ClipRect);
PaintBox1.Canvas.Ellipse(0,0,100,100);
end;

In order for the drawing to be persistent, you need to also include an OnPaint event handler that tells the PaintBox how to redraw itself when it needs to. In the code below, an ellipse will be drawn everytime the PaintBox renders itself, but the PaintBox will only paint the client area of the control red after the Button is clicked. This client area will only stay red until it is invalidated, but the ellipse will persist. This behavior is different from the TImage component, because the TImage component maintains an internal bitmap that stores this drawing information for you.

procedure Form1.PaintBox1Paint(Sender: TObject);
begin
PaintBox1.Canvas.Ellipse(0,0,100,100);
end;


 
Skier   (2003-12-18 12:50) [10]

Fast (18.12.03 12:35) [6]
А что требуется сделать ?
Подробности можно узнать ?


 
serge   (2003-12-18 12:55) [11]

Для своей панели просто перепиши OnPaint;

TPanel2 = class(TPanel)
Procedure Paint; Override;
public
property Canvas;
end;

.....

procedure TPanel2.Paint;
var R : TRect;
begin
inherited;
With Self.Canvas do
begin
Color := clLime;
R := Rect(0,0,Width,Height);
Canvas.Rectangle(R.Left-8, R.Top-8, R.Right+8, R.Bottom+8);
Canvas.Rectangle(8, 8, 38, 38);
Canvas.Font.Color := clred;
Canvas.Font.Size := 8;
Drawtext(handle, PChar("123456"), 6, R,DT_LEFT);
// Canvas.TextOut(10,10,"234234234234234");
// DrawText(Canvas.Handle,PChar(SSS), -1, R, dt_WordBreak or dt_Center);
// Canvas.TextRect(R,10,10,SSS);
end;

end;

Надеюсь поможет!
Удачи.


 
Fast   (2003-12-18 14:35) [12]

Skier © (18.12.03 12:50) [10]
Очень хочется сделать RichEdit.Preview.
serge (18.12.03 12:55) [11]
Сейчас посмотрю. Заранее спасибо.


 
Fast   (2003-12-18 16:40) [13]

Возможно ли использовать метафайл для вывода окна пред.осмотра Мемо.
Весь текст залетает в одну строку.

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

type
TPanel2 = class(TPanel)
public
procedure Paint; override;
property Canvas;
end;
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
hp : HDC;
Printer : TPrinter;
Panel2 : TPanel2;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TPanel2.Paint;
var R : TRect;
i : integer;
ss : string;
MetaFile : TMetaFile;
begin
inherited;
with Self.Canvas, Form1 do begin
Color := clWhite;
R := Rect(0, 0, Self.Width, Self.Height);
Canvas.Rectangle(R.Left-8, R.Top-8, R.Right+8, R.Bottom+8);
Canvas.Font.Color := clBlue;
// Canvas.Font.Size := 8;
// создаем метафайл, используя дескриптор принтера в качестве устройства
MetaFile := TMetaFile.Create;
with TMetafileCanvas.Create(Metafile, hp) do
try
//выводим то, что предназначено для печати на канву этого метафайла,
//как на канву принтера
for i:=0 to Memo1.Lines.Count - 1 do begin
ss:= PChar(Memo1.Lines.Strings[i]);
DrawText(Panel2.Canvas.Handle, PChar(ss), -1, R, dt_WordBreak or dt_Left);
end;
finally
Free;
end;
// выводим содержимое метафайла на экран
Form1.Canvas.Draw(0,0,Metafile);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var R : TRect;
L,T,W,H : integer;
begin
Panel1.Left := Memo1.Left; Panel1.Top := Memo1.Top;
Panel1.Width := Memo1.Width; Panel1.Height := Memo1.Height;
Panel2 := TPanel2.Create(self);
Memo1.Visible := False;
with Panel2 do begin
Panel2.Left := 250; Panel2.Top := 50;
Panel2.Width := 120; Panel2.Height := 200;
SetBounds(Panel2.Left-5, Panel2.Top-5, Panel2.Width-3, Panel2.Height);
BevelOuter := bvNone;
Color := clWhite;
Parent := Panel1;
Canvas.Rectangle(R.Left-2, R.Top-2, R.Right+2, R.Bottom+2);
Canvas.Font.Size := 8;
end;
Paint;
end;


 
Amoeba   (2003-12-18 16:45) [14]


> for i:=0 to Memo1.Lines.Count - 1 do begin
> ss:= PChar(Memo1.Lines.Strings[i]);
> DrawText(Panel2.Canvas.Handle, PChar(ss), -1, R,
> dt_WordBreak or dt_Left);
> end;

А с какой стати у тебя вывод текста сам должен перемещаться на "новую строку"?


 
Fast   (2003-12-18 16:53) [15]

<А с какой стати у тебя вывод текста сам должен перемещаться на "новую строку"?>
Хотелось считать, указатель на принтер за меня это сделает.
Потому и спрашиваю, что не знаю...


 
Amoeba   (2003-12-18 16:57) [16]

Так ведь R у тебя все время один и тот же, т.е. начальная позиция вывода не меняется, а ей бы следовало с каждой итерацией смещаться вниз.



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

Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.013 c
3-11834
Марат
2003-12-08 07:24
2004.01.05
DBComboBox


4-12193
volser
2003-11-05 00:22
2004.01.05
DllEntryPoint


1-11960
Ил_204
2003-12-19 15:33
2004.01.05
Работа с потоками. Остановка потока.


14-12033
Dimka Maslov
2003-12-16 09:00
2004.01.05
SPY++


8-11997
Goga
2003-09-03 21:54
2004.01.05
как синхронизировать потоки данных?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский