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

Вниз

как перетащить текст   Найти похожие ветки 

 
rexti   (2007-04-10 15:53) [0]

на Canvase выведен текст (textout()). как мышкой его переместить в другое место Canvasa?


 
Сергей М. ©   (2007-04-10 16:14) [1]

Никак.


 
Fredy314 ©   (2007-04-10 17:11) [2]

ПОчему никак
Если это своя программа можно стирать и рисовать заново. только зачем?


 
Belorus ©   (2007-04-11 01:28) [3]

Мышкой никак... Нужно докупать отдельное устройство по переноске GDIшных текстов... К сожалению крепление текста к поверхности монитора настолько прочное что стандартные средства просто бессильны....


 
homm ©   (2007-04-11 09:41) [4]

> К сожалению крепление текста к поверхности монитора настолько
> прочное что стандартные средства просто бессильны....

Текст к поверхности монитора не крепится. Опять начинаешь ахинею нести?


 
rexti   (2007-04-11 10:46) [5]

огромное чувство юмора. тогда поставим вопрос так: когда на canvace нарисован какой-то объект (линия, многоугольник polyline, lineto, и тд) я могу его перетаскивать мышкой через свойство pen.mode те при наведении мышки на объект onmousedown, onmousemove, onmouseup (с перерисовкой). а как быть в этом случае с текстом ?


 
Сергей М. ©   (2007-04-11 10:57) [6]


> могу его перетаскивать мышкой через свойство pen.mode


Покажи код, где ты умудряешься это делать)


 
rexti   (2007-04-11 11:15) [7]

завтра покажу он на другом компе. а алгоритм такой: подводим мышку к объекту (левая кнопка ), по граничным координатам считаем что он выбран, сбрасываем координаты обекта во временный массив, меняем свойство pen.mode, при перемещении мышки каждый раз перерисовываем объект с новыми координатами (старые + дельта) и стираем там где он был раньше (старые координаты), при отпускании левой кнопки мышки рисуем еще раз и возвращаем старый pen.mode.


 
homm ©   (2007-04-11 11:18) [8]

> завтра покажу он на другом компе. а алгоритм такой: подводим
> мышку к объекту (левая кнопка ), по граничным координатам
> считаем что он выбран, сбрасываем координаты обекта во временный
> массив, меняем свойство pen.mode, при перемещении мышки
> каждый раз перерисовываем объект с новыми координатами (старые
> + дельта) и стираем там где он был раньше (старые координаты)
> , при отпускании левой кнопки мышки рисуем еще раз и возвращаем
> старый pen.mode.

И в чем проблема? Все то-же самое для текста слабо?


 
antonn ©   (2007-04-11 11:24) [9]

текст - тот же самый прямоугольник


 
rexti   (2007-04-11 11:27) [10]

а как мне стереть текст по старым координатам? font.color:=clWhite ? а если перемещение идет на сложном фоне?


 
homm ©   (2007-04-11 11:28) [11]

> а если перемещение идет на сложном фоне?

А если перемещение линии идет на сложном фоне, у тебя нет вопросов как стереть? В чем принципиальная разница то?


 
homm ©   (2007-04-11 11:29) [12]

Подсказка: При движении мышы с нажатой кнопкой, нкжно посылать Invalidate, а уже в процедуре рисования отображать изменения.


 
rexti   (2007-04-11 11:30) [13]

линию я рисую карандашем у которого и меняю свойство mode, а у фонта такого свойства нет


 
rexti   (2007-04-11 11:33) [14]

если можно про Invalidate в коде


 
homm ©   (2007-04-11 11:36) [15]

Давай я тебе скажу то что ты должен был сказать мне:
Ты рисуешь карандашем со стилем XOR, и при повторном рисовании линии фон востанавливается. Теперь тебе нужно двигать текст, и ты хочешь вывести текст методом XOR, что у тебя не получается.

Что, сложно было вопрос так задать? Проще же спросить как мышкой текст двигать...

В общем не помню можно ли так текст выводить непосредственно. но точно можно извратится с получением региона нарисованого текста, залить этот регион по хору, либо воспользоватся способом в [11].


 
homm ©   (2007-04-11 11:38) [16]

> если можно про Invalidate в коде

procedure Image1.OnMouseMove()
begin
if Mousedown = TRUE then begin
 Image1.Invalidate();
end;
end;


 
Сергей М. ©   (2007-04-11 11:42) [17]


> rexti


По-моему ты занялся ерундой.


 
rexti   (2007-04-11 11:46) [18]

переместить и двигать это разные вещи?
а что если я пишу так :
procedure Image1.OnMouseMove()
begin
 if Mousedown then Image1.Canvas.TextOut("ddd");
end;
это не вызывает немедленной перерисовки Image1 ?


 
homm ©   (2007-04-11 11:49) [19]

> это не вызывает немедленной перерисовки Image1 ?

А с чего ты взял что должно?


> переместить и двигать это разные вещи?

В чем суть различий?


 
rexti   (2007-04-11 11:57) [20]

почему ерундой? стоит конкретная задача оформления геолого-геофизических данных


 
rexti   (2007-04-11 12:03) [21]

так ты хочешь сказать что
Image1.Canvas.LineTo(x,y);
Image1.Invalidate();
будет рисоваться, а
Image1.Canvas.LineTo(x,y);
нет ?


 
homm ©   (2007-04-11 12:11) [22]

Нет. В приведеном варианте как раз наоборот :)

Image1.Canvas.LineTo(x,y);
нарисует линию
Image1.Invalidate();
перерисует весь имейдж, и этой линии уже не будет.

Сходи почитай умных книжек. у тебя нет никакого понимания того как выводится графика на экран в оконных приложениях.


 
rexti   (2007-04-11 12:23) [23]

если для тебя мой вопрос о графике такой простой чтож ответить нормально на него не можешь


 
Сергей М. ©   (2007-04-11 12:30) [24]


> почему ерундой? стоит конкретная задача оформления геолого-
> геофизических данных


Да хоть арбузо-литейных данных))) .. Суть-то не в задаче)

Потому и ерундой, что объект должен рисовать себя сам.

Все что при этом от тебя требуется - определить св-ва каждого из объектов (в т.ч его положение на холсте) и последовательность рендеринга этих объектов.

Тогда для рендеринга всей "сцены" при изменении позиции любого из объектов достаточно скомандовать объектам отрисовать (каждый сам себя) в указанной последовательности.


 
homm ©   (2007-04-11 12:32) [25]

> если для тебя мой вопрос о графике такой простой чтож ответить
> нормально на него не можешь

Потому что твой подход в принцепе не верен, и ответ на него много сложнее твоего простого вопроса.
Я могу ответить, но мне хочется наставить на путь истенный :) Но вцелом достаточно прсто все описал Сергей М.


 
rexti   (2007-04-11 12:42) [26]

спасибо за информацию. кое-что понял. буду пробывать.


 
Fenik ©   (2007-04-11 20:51) [27]

Надо в памяти битмап с фоном держать и из него обновлять измененную область.


 
Vovan The One   (2007-04-11 22:38) [28]

2 homm:

>Image1.Canvas.LineTo(x,y);
нарисует линию
Image1.Invalidate();
перерисует весь имейдж, и этой линии уже не будет.


Что за бред?

>Сходи почитай умных книжек. у тебя нет никакого понимания того как выводится графика на экран в оконных приложениях.

И ты тоже.


 
homm ©   (2007-04-12 00:31) [29]

> [28] Vovan The One   (11.04.07 22:38)

«Иногда лучше жевать» ©


 
homm ©   (2007-04-12 01:09) [30]

Прошу прощения, действительно оказался не прав, т.к. конретно TImage создает конкретно для себя буферную картинку, и именно ее канва, а не канва самого конролла предлагается для рисования. Для всех остальных оконных и графических контроллов, кроме TImage все нарисованное на них не в событии OnPaint стирается при первой-же перерисовке, вне зависимости от причины по которой происходит перерисовка, будь то вызов Inavlidate() или затирания другим окном.



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

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

Наверх




Память: 0.54 MB
Время: 0.024 c
15-1201722950
Марсер
2008-01-30 22:55
2008.03.09
Бесплатный прокси-сервер для обеспечения ноутбука Инетом


15-1202106974
Ega23
2008-02-04 09:36
2008.03.09
DLL vs BPL и RegisterClass


2-1202659042
Strate
2008-02-10 18:57
2008.03.09
Скрыть вкладки в TPageControl


15-1201767728
Григорьев Антон
2008-01-31 11:22
2008.03.09
Глюк vs2005? Никто не сталкивался?


3-1192988935
Николай Валуев
2007-10-21 21:48
2008.03.09
обновление данных