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

Вниз

Canvas, Shape, стирание того, что нарисовал   Найти похожие ветки 

 
Zheks ©   (2004-02-11 12:02) [0]

Я рисую на Shape точки и соединяю их линиями. Как по нажатию(неважн. чего) убрать последнюю точку и соединяющую линию оставив фон без изменения?

Canvas.Ellipse(X+Shape1.Left-3, Y+Shape1.Top-3, X+Shape1.Left+3, Y+Shape1.Top+3); //так я кисую точки.

Canvas.LineTo(X+Shape1.Left, Y+Shape1.Top); //так я рисую линии

кто сталкивался с такой задачей помогите, плз.


 
Zheks ©   (2004-02-11 12:34) [1]

вы не в курсе или это не реально?


 
Amoeba ©   (2004-02-11 12:44) [2]

А разве Canvas у TShape public св-во?


 
Zheks ©   (2004-02-11 12:48) [3]

Амеобочка, я не в курсе, но мне ТАК нужно знать, как это делается...

помогите, кто чем может...


 
Zheks ©   (2004-02-11 12:50) [4]

Амеобочка, я не в курсе, но мне ТАК нужно знать, как это делается...

помогите, кто чем может...


 
Семен Сорокин ©   (2004-02-11 12:54) [5]

может задание Canvas.Pen.Mode поможет?


 
Babay ©   (2004-02-11 12:59) [6]

ИМХО: Нарисовать их снова но цветом фона


 
olookin ©   (2004-02-11 13:00) [7]

Хранить координаты точек в массиве. И прорисовывать все точки и линии минус последнюю при нажатии чего угодно. Благо если точек не больше 1000 (а ведь не больше?) то потери времени на прорисовку всего массива не будет видно.


 
Zheks ©   (2004-02-11 13:06) [8]

to [4]: спасибо, добрый человек. Примерчика малюсенького у Вас нету? может совет? или ссылочка соответствующая в кладовке есть?


 
Zheks ©   (2004-02-11 13:19) [9]

to [6]: фон не однородный, поэтому не катит ;((

to [7]: тоже не пойдёт, т.к. там, именно, нужно видеть правильно ли поставленна последняя точка и если не правильно быстро это дело исправить.

ценю вашу помощь... у вас есть другие варианты?


 
Zheks ©   (2004-02-11 13:19) [10]

to [6]: фон не однородный, поэтому не катит ;((

to [7]: тоже не пойдёт, т.к. там, именно, нужно видеть правильно ли поставленна последняя точка и если не правильно быстро это дело исправить.

ценю вашу помощь... у вас есть другие варианты?


 
Zheks ©   (2004-02-11 13:24) [11]

to [6]: фон не однородный, поэтому не катит ;((

to [7]: тоже не пойдёт, т.к. там, именно, нужно видеть правильно ли поставленна последняя точка и если не правильно быстро это дело исправить.

ценю вашу помощь... у вас есть другие варианты?


 
NAlexey ©   (2004-02-11 13:30) [12]

Canvas.Ellipse - нарисовал и забыл, теперь если ты сделаешь
InvalidateRect ты сотрешь то что ты нарисовал. Разве не так?


 
SPIRIT ©   (2004-02-11 13:30) [13]


> Canvas.Ellipse(X+Shape1.Left-3, Y+Shape1.Top-3, X+Shape1.Left+3,
> Y+Shape1.Top+3); //так я Кисую точки.


Х и У ?????????? откуда ??


 
Sandman25 ©   (2004-02-11 13:30) [14]

Zheks

Логически мысля, после прорисовки линии цвет пикселей под ней потерян. Поэтому есть всего 2 варианта:
первый был описан в [7], намек на второй дали в [5] (смотреть pmXor) - снчала рисовать через Xor, и только после подтверждения перерисовывать pmCopy, при отмене рисовать через pmXor еще раз.


 
Barbarian five   (2004-02-11 13:34) [15]

а еще можно пользоваться буфером.


 
olookin ©   (2004-02-11 13:35) [16]

[9] Zheks © (11.02.04 13:19)
to [7]: тоже не пойдёт, т.к. там, именно, нужно видеть правильно ли поставленна последняя точка и если не правильно быстро это дело исправить.

Не вижу проблем в испоьзовании массива точек. Например, точки формируются нажатием мышой на форму, а удаляются нажатием Esc. Храните точки в массиве, каждый раз на новый клик мышки добавляете точку в массив. Каждый раз при нажатии на Esc удаляете последнюю точку из массива и прорисовываете все оставшиеся точки и линии заново. Если уж надо удалять точку которая поставлена ранее, то определяйте ее положение относительно курсора мышки (что совсем несложно) и удаляйте из массива ту точку, которая имеет максимально близкие (или совпадающие с заданной точностью, скажем до 3-х пикселов) координаты к курсору. В общем использование массива запомненных точек в данном случае ПОМОГАЕТ решить проблему. Или формулируйте проблему точнее и со всеми ограничениями.


 
Zheks ©   (2004-02-11 13:54) [17]

все ваши варианты правильные, но они мне к сожалению не подходят, т.к. нужно видеть правильно ли поставленна последняя точка, и если нет, то убрать её и поставить заново + нельзя затирать(изменять) фон под точкой и линией.

А в идеале(теперь даже и мечтать не могу об этом) должно быть так: на рисунке я проставляю ломаную кривую, которую я потом смог бы править хватаясь за точки и оттягивая их на ту позицию которая меня больше всего устраивает.

неужели это не реальная затея?


 
Семен Сорокин ©   (2004-02-11 14:05) [18]

Canvas.Pen.Mode = pmXor тебе поможет.
дважды проведенная линия (по тем же координатам) с этим условием вернет тебе твой фон в целости и сохранности.


 
Barbarian five   (2004-02-11 14:08) [19]

[18] а в каком она будет непотребном виде? :)


 
KADAN   (2004-02-11 14:14) [20]

А если перед тем как рисовать линию скопировать в буфер прямоугольничек под линией, и при отмене нарисовать его заместо линии. Просто и сердито.


 
Семен Сорокин ©   (2004-02-11 14:14) [21]

Barbarian five (11.02.04 14:08) [19]
[18] а в каком она будет непотребном виде? :)


Про "потребность вида" речи не было :)


 
Семен Сорокин ©   (2004-02-11 14:15) [22]

2Zheks
еще вариант - рисовать все в памяти на битмапе.


 
SPIRIT ©   (2004-02-11 14:18) [23]

зачем ее убирать ... меняешь координаты у текущей точки и перерисовываешь все...


 
Zheks ©   (2004-02-11 14:23) [24]

to [18]: отлично, спас...

точки лупит отлично, а вот линии нет, буду экспериментировать с Canvas.Pen.Mode. Не подскажешь, как вместе с точками и линии убирать с восстановлением фона?

Спасибо


 
NAlexey ©   (2004-02-11 14:25) [25]

Вообще, если по хорошему - то лучше создать класс, который умеет себя рисовать, обрабатывать события мыши и проч. При постановке точки, создавать экземпляр класса, и в список его. Например даже можно было бы так:


TPointClass = class(TObject)
protected
FWnd: THandle;
procedure WndProc(var Msg: TMessage);
public
constructor Create;
destructor Destroy; override;
end;

var
HandleWindowClass: TWndClass = (
style: 0;
lpfnWndProc: @DefWindowProc;
cbClsExtra: 0;
cbWndExtra: 0;
hInstance: 0;
hIcon: 0;
hCursor: 0;
hbrBackground: 0;
lpszMenuName: nil;
lpszClassName: "TPointClass");

procedure CreateHandleWnd (WndProc: TWndMethod; var Wnd : THandle);
var
TempClass: TWndClass;
ClassRegistered: Boolean;
begin
HandleWindowClass.hInstance := HInstance;
ClassRegistered := GetClassInfo(HInstance, HandleWindowClass.lpszClassName,
TempClass);
if not ClassRegistered then
Windows.RegisterClass(HandleWindowClass);
Wnd := CreateWindowEx(WS_EX_TOPMOST, HandleWindowClass.lpszClassName,
"", WS_POPUP, 0, 0, 1, 1, 0, 0, HInstance, nil);
SetWindowLong(wnd, GWL_WNDPROC, Longint(Classes.MakeObjectInstance(WndProc)));
SetWindowLong(wnd, GWL_STYLE, WS_CHILD);
end;

constructor TPointClass.Create;
begin
inherited Create;
CreateHandleWnd (WndProc, fwnd);
end;

destructor TPointClass.Destroy;
begin
Forms.DeallocateHWnd(fWnd);
inherited Destroy;
end;

procedure TPointClass.WndProc(var Msg: TMessage);
begin
with Msg do
begin
Result := 0;
case Msg of
WM_LBUTTONDOWN:
MouseDown(mbLeft, KeysToShiftState(wParam),
SMALLINT(LOWORD(lPAram)), SMALLINT(HIWORD(lPAram)));
WM_RBUTTONDOWN:
MouseDown(mbRight, KeysToShiftState(wParam),
SMALLINT(LOWORD(lPAram)), SMALLINT(HIWORD(lPAram)));
WM_LBUTTONUP:
MouseUp (mbLeft, KeysToShiftState(wParam),
SMALLINT(LOWORD(lPAram)), SMALLINT(HIWORD(lPAram)));
WM_RBUTTONUP:
MouseUp (mbRight, KeysToShiftState(wParam),
SMALLINT(LOWORD(lPAram)), SMALLINT(HIWORD(lPAram)));
WM_MOUSEMOVE:
MouseMove(KeysToShiftState(wParam),
SMALLINT(LOWORD(lPAram)), SMALLINT(HIWORD(lPAram)));
WM_SETCURSOR:
SetCursor(Screen.Cursors[crDefault]);
WM_ERASEBKGND:
Result := 0;
WM_PAINT:
Paint;
else
Result := CallWindowProc(@DefWindowProc, FWnd, Msg, WParam, LParam);
end;
end;
end;


 
olookin ©   (2004-02-11 14:38) [26]

[17] Zheks © (11.02.04 13:54)

Более чем реальная. Но надо потрудится. Плюс так или иначе прорисовывать все изменения заново на канвасе.



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

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

Наверх




Память: 0.53 MB
Время: 0.026 c
1-79872
ЧимбаБумба
2004-02-13 20:38
2004.02.25
ShellListView


6-80058
Bless
2003-12-18 17:30
2004.02.25
Ассинхронные прием/передача данных в консольном приложении


3-79652
Настенька
2004-01-31 11:14
2004.02.25
Разноцветные строки DBGrida


1-79817
Edik86
2004-02-13 22:25
2004.02.25
Программа дала сбой


3-79678
Polevi
2004-01-30 10:31
2004.02.25
Запрос