Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.031 c
1-79817
Edik86
2004-02-13 22:25
2004.02.25
Программа дала сбой


14-80111
able
2004-02-05 14:54
2004.02.25
SATA???


1-79813
siriusP
2004-02-10 19:22
2004.02.25
Как вставить в ImageList прозрачную картинку?


14-80274
iNew
2004-02-04 04:57
2004.02.25
Автоматическое подключение сетевых дисков.


14-80193
Штурмовик
2004-01-30 23:20
2004.02.25
Помогите студенту





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