|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Отрисовка элемента в Image
Доброго времени суток всем. Необходимо по нажатию кнопки в Image получить координаты и отрисовать окружность с
центром в точке нажатия. Координаты нажатия у меня получается получить так: Код:
var foo: TPoint; x,y: integer; begin GetCursorPos(foo); x:=foo.X; y:=foo.Y; Далее пытаюсь нарисовать окружность с помощью Код:
Image1.Canvas.Rectangle(foo.X,foo.Y,foo.X+10,foo.Y+10); Подскажите, как сделать так, чтобы окружность нарисовалась в необходимом месте компонента. |
#2
|
||||
|
||||
GetCursorPos возвращает экранные координаты, а тебе нужны координаты имиджа.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
Да и еще:
Код:
Image1.Canvas.Rectangle(foo.X,foo.Y,foo.X+10,foo.Y+10){ - ЭТО КВАДРАТ или ПРЯМОУГОЛЬНИК} Код:
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Image1.Canvas.Ellipse(X,Y,X+10,Y+10) end; |
#4
|
|||
|
|||
Можно с помощью битмапа:
Код:
... var BM: TBitMap; // глобальная ... BM := TBitMap.Create; //где-то в коде но перед выполнением нажатий BM.Width := Image1.Width; BM.Height := Image1.Height; BM.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height) ... procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin BM.Canvas.Ellipse(X - 5, y - 5, x + 5, y + 5); Image1.Picture.Assign(BM); end; Так и мерцать не будет Код:
procedure UnleassFor(i: int64) UnleassFor(i + 1); ... UnleassFor(0); |
#5
|
||||
|
||||
Подытожив всё вышесказанное, можно добавить: рисовать на TImage - изврат, можно, но это не лучший вариант. В данном случае, лучше использовать TPaintBox.
|
#6
|
||||
|
||||
Цитата:
|
#7
|
||||
|
||||
Выводы сделаны уже давно и не мной (не только мной). TImage позволяет рисовать, так как имеет холст, но это его второстепенная задача, TPaintBox - ориентирован только для этого.
|
#8
|
||||
|
||||
ну не знаю.... всю жизнь рисовал на имидже ни каких проблем не испытывал. На нем нарисовал и забыл, не надо заботиться о том, что у тебя что-то перезатерется. Ну это одни из поправимых мелочей...
ИМХО, использовать PaintBox или Image это дело привычки, я не думаю что это ПРЯМ принципиальная разница. |
#9
|
||||
|
||||
Абсолютно согласен, всё зависит от поставленной задачи. Но разница довольно серъёзная, в данной задаче хватит и TImage, да и во многих других тоже, но когда будет критична скорость, а посторонние компоненты использовать нельзя, то тут только TPaintBox может спасти.
|
#10
|
||||
|
||||
Цитата:
Не знаю на счет скорости, не замерял. (надо будет устроить бой Image VS PaintBox ) Вообще я думаю, что PaintBox, это контрол, который можно запихать в любое место формы, у которого есть своя канва.. и......... и больше не хрена он создан для того, чтобы на нем только рисовали, в этом ты прав. З.Ы.Быструю попиксельную отрисовку через свойство канвы Pixels не сделать ни в одном известном мне компоненте, в отличие от SkanLine , которого в PainBox не найдешь |
#11
|
|||
|
|||
ScanLine и в TImage нету
Это метод битмапа |
#12
|
||||
|
||||
Цитата:
|
#13
|
||||
|
||||
Цитата:
Ну почему же? GetPixel, SetPixel никто не отменял, тем более Pixels всего лишь их эмуляция. P.S. Да и наверное пора закругляться, иначе администратор побъёт. |
#14
|
||||
|
||||
Цитата:
это функции, а через ScanLine Вы получаете бесплатный указатель на массив данных!!! и поэтому чтение/запись происходит в разы быстрее, тут к гадалке не ходи |
#15
|
||||
|
||||
Очередная эмуляция функции GetObject, а другого и быть не может.
|