Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.032 c