Форум: "Прочее";
Текущий архив: 2009.11.01;
Скачать: [xml.tar.bz2];
ВнизКомпонент Линия Найти похожие ветки
← →
Kolan © (2009-08-31 14:45) [0]Здравствуйте!
Где бы взять такой компонент, который бы позволял рисовать линии на формах? Просто прямые, как в графическом редакторе.
← →
test © (2009-08-31 14:47) [1]TCanvas рисуй что хочешь.
← →
Kolan © (2009-08-31 14:48) [2]Рисовать хочется в дизайнере.
← →
test © (2009-08-31 14:50) [3]Kolan © (31.08.09 14:48) [2]
Напиши, будет тебе дизайнер или используйте то что есть Paint, GIMP, Photoshop.
← →
Игорь Шевченко © (2009-08-31 14:53) [4]TShape ?
← →
Kolan © (2009-08-31 15:05) [5]А как TShape рисовать линию? Диагональные линии тоже нужны.
← →
Kolan © (2009-08-31 15:07) [6]Ладно, сделал свой.
unit KUILine;
interface
uses
SysUtils, Classes, Controls, Graphics;
type
TUILine = class(TGraphicControl)
private
function GetPen: TPen;
procedure SetPen(const Value: TPen);
protected
procedure Paint; override;
published
property Pen: TPen read GetPen write SetPen;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("KSoftWare", [TUILine]);
end;
{ TUILine }
function TUILine.GetPen: TPen;
begin
Result := Canvas.Pen;
end;
procedure TUILine.Paint;
begin
Canvas.LineTo(Left, Top);
Canvas.MoveTo(Left+Width, Top+Height);
end;
procedure TUILine.SetPen(const Value: TPen);
begin
Canvas.Pen.Assign(Value);
end;
end.
Когда таскаешь по форме — линия пропадает, почему?
← →
Медвежонок Пятачок © (2009-08-31 15:09) [7]потому что не перерисовывается
← →
Kolan © (2009-08-31 15:14) [8]А где правильно сделать перерисовку?
← →
Ega23 © (2009-08-31 15:25) [9]
> А где правильно сделать перерисовку?
Есть канва. Есть список объектов, которые каким-то образом отображаются на канве (и, кстати, во вполне определённом порядке).
Вот и перерисовываешь всё это дело.
← →
Kolan © (2009-08-31 15:27) [10]А, я забыл, что координаты внутри контроля нужно использовать.
procedure TUILine.Paint;
begin
Canvas.LineTo(0, 0);
Canvas.MoveTo(Width, Height);
end;
Заодно вопрос для общего развития.
Зачем вTShape
объявлены своиTPen
иTBrush
, а не используется конва?
← →
KSergey © (2009-08-31 15:27) [11]Если сравнить с исходниками TShape, то думаю причина вот в чем:
procedure TShape.Paint;
begin
with Canvas do
begin
Pen := FPen;
Brush := FBrush;
И только после этого рисуем.
А устанавливать свойства канвы в "левом" методе procedure TUILine.SetPen видимо бессмысленно.
← →
Kolan © (2009-08-31 15:29) [12]KSergey, нет, причина того, что не перерисовывалось была в неверных координатах.
← →
Ega23 © (2009-08-31 15:31) [13]
procedure TUILine.Paint;
begin
Canvas.LineTo(0, 0);
Canvas.MoveTo(Width, Height);
end;
Может наоборот?
← →
Kolan © (2009-08-31 15:32) [14]Да, Ega23, когда писал никак не мог вспомнить что для чего.
Вспомнил так: Начать линию в координатах (LineTo) и протянуть до координат (MoveTo) :)
← →
Anatoly Podgoretsky © (2009-08-31 15:35) [15]
> procedure TUILine.Paint;
> begin
> Canvas.LineTo(0, 0);
> Canvas.MoveTo(Width, Height);
> end;
А это что за гадость еще, лишь бы что ни будь нарисовать, если получится.
← →
Anatoly Podgoretsky © (2009-08-31 15:38) [16]> Kolan (31.08.2009 15:29:12) [12]
И в Pen/Brush тоже, тебе пока везет, а как получишь белое на белом, то куда ты побежишь?
← →
Ega23 © (2009-08-31 15:40) [17]Нет. Есть Canvas, у него есть Pen. У него есть текущие координаты (какие-то).
MoveTo(X, Y) - смена текущих координат в точку с координатами (X, Y)
LineTo(X, Y) - провести линию из текущих координат в точку (X,Y)
Соответственно, кодwith Canvas.Pen do
begin
MoveTo(100, 100);
LineTo(200, 200);
end;
нарисует диагональную линию из точки (100,100) в точку (200, 200) относительно данногой канвы.
При этом, текущей координатой "карандаша" останется точка (200, 200).
← →
Kolan © (2009-08-31 15:49) [18]Ega23, я понял, я исправил, спасибо. Это я по запарке.
Анатолий, про ручку с кисточкой расскажите как надо сделать (видимо как в TShape) и, главное, почему?
← →
Anatoly Podgoretsky © (2009-08-31 15:55) [19]Затем, что ты можешь захотеть рисовать линию любым цветом, аналогично по Brush
← →
Ega23 © (2009-08-31 15:57) [20]
> про ручку с кисточкой расскажите как надо сделать (видимо
> как в TShape) и, главное, почему?
Есть TCanvas. У него всегда есть Pen (ручка) и Brush (это, скорее, "заливка").
Также есть Font (для надписей).
Основные методы:
TCanvas.MoveTo - передвигает координаты ручки
TCanvas.LineTo - рисует линию (в соответствии с текущем стилем ручки)
TCanvas.Rectangle - рисует прямоугольник (края - как стиль ручки, заливка - стилем Brush)
TCanvas.Ellipse - рисует эллипс
TCanvas.Arc - рисует дугу
ну и т.д.
← →
Игорь Шевченко © (2009-08-31 16:00) [21]умный человек качает готовый компонент и не парит мозг окружающим :)
← →
Ega23 © (2009-08-31 16:04) [22]
> умный человек качает готовый компонент и не парит мозг окружающим :)
Ага, "кАмпАнент" TMSPaint... :)
← →
Kolan © (2009-08-31 16:05) [23]Ega23, да самые простые основы я знаю, я не могу понять, зачем борландовцы создали в TShape свой TPen и TBrush. И еще не понятно, что имел в виду Анатолий.
Вдруг это важно.
← →
Суслик_ (2009-08-31 16:10) [24]>Kolan © (31.08.09 16:05) [23]
>И еще не понятно, что имел в виду Анатолий.
>Вдруг это важно.
Конечно важно, иначе как ты также научишься также окружающих подкалывать.
)
← →
Eraser © (2009-08-31 16:12) [25]> [22] Ega23 © (31.08.09 16:04)
> TMSPaint
TOLEContainer )
← →
KSergey © (2009-08-31 16:17) [26]У меня есть какое-то воспоминание, что свойства Canvas надо устанавливать непосредственно перед рисования.
сейчас еще посмотрел исодники - оно вот почему.
Нет как такогово объекта "канва" у каждого компонента. Это лишь обертка над виндовых device context. Который один на всех. И его поочереди всем отдают, чтобы на нем порисовать. И каждый, понятно, перенастраивает его так, чтобы порисовать как надо.
И по исходникам видно, что объект канвы никаких свойсв по сути не хранит. Вернее он их хранит, но только чтобы потом было что прочитать из них. А вот самой канве (девайс контексту) это свойства не устанавливает "просто так"procedure TGraphicControl.WMPaint(var Message: TWMPaint);
begin
if Message.DC <> 0 then
begin
Canvas.Lock;
try
Canvas.Handle := Message.DC;
try
Paint;
finally
Canvas.Handle := 0;
end;
finally
Canvas.Unlock;
end;
end;
end;
Видно, что мы привязали DC к нашему объекту канвы (почле чего вызовется Pinnt), но никакие свойства у DC не установили, т.е. рисоваться будет неизвестно чем. И настроить параметры отрисовки надо в самом начале метода Paint. (В методе TCanvas.SetHandle немного действий выполняется, но только по установке места "карандаша" в предыдущее, где он закончил рисовать для этого объекта, на сколько я понимаю)
← →
Игорь Шевченко © (2009-08-31 16:23) [27]
> Видно, что мы привязали DC к нашему объекту канвы (почле
> чего вызовется Pinnt), но никакие свойства у DC не установили
рисоваться будет тем, что выбрано в текущем DC. Выбрать нечто (кисть, шрифт и еще кучу объектов) в текущем DC вполне можно в методе TGraphicControl.Paint, что, собственно говоря, и делается в стандартных наследниках TGraphicControl
← →
clickmaker © (2009-08-31 16:23) [28]> зачем борландовцы создали в TShape свой TPen и TBrush
в дизайнере нельзя задавать параметры канвы. Но можно пен и браш
← →
Kolan © (2009-08-31 16:28) [29]clickmaker, видите как я в [6] поступил, так что как бы можно.
Благодарю, KSergey, теперь понятно, что параметры ручки и кисточки нужно сохранять в полях для того, чтобы применить их непосредственно перед рисованием, иначе они могут быть испорчены.
← →
Ega23 © (2009-08-31 16:32) [30]
> я не могу понять, зачем борландовцы создали в TShape свой
> TPen и TBrush.
"Свой TPen и TBrush" есть у каждого TCanvas.
Просто сам TCanvas открывать в published - бессмысленно. А вот его конкретные свойства - why not?
Тебя же не смущает свойство Font у TEdit. А это не что иное, как TEdit.Canvas.Font
← →
Kolan © (2009-08-31 16:40) [31]
> А вот его конкретные свойства - why not?
Ну так они же не открыли их, а заместо этого сделали:TShape = class(TGraphicControl)
private
FPen: TPen;
FBrush: TBrush;
...
а потомprocedure TShape.Paint;
var
X, Y, W, H, S: Integer;
begin
with Canvas do
begin
Pen := FPen;
Brush := FBrush;
...
Вот я и переживаю :)
← →
Игорь Шевченко © (2009-08-31 16:44) [32]
>
> Вот я и переживаю :)
Непонятны переживания. У TEdit собственный Canvas, у TShape - Canvas родительского контрола. Понятное дело, что открыть свойства Canvas родителського контрола и положить на него пару TShape, то они друг с другом могут вступать в забавные отношения посредством общего Canvas. Поэтому свойства Pen и Brush у TShape используются для рисования только в определенные период времени, а хранятся так, как им удобно - в виде классов TPen и TBrush для установки их свойств.
← →
Kolan © (2009-08-31 16:46) [33]Теперь понял, Игорь.
Благодарю.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.11.01;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.007 c