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

Вниз

Линия, преследующая курсор   Найти похожие ветки 

 
jack128 ©   (2004-06-05 19:21) [0]

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

procedure TFrame2.PaintBox1Paint(Sender: TObject);
var
 p: TPoint;
begin
 with TPaintBox(Sender), Canvas do
 begin
   MoveTo(0, 0);
   GetCursorPos(p);
   p := TControl(Sender).ScreenToClient(p);
   LineTo(p.x, p.y)
 end;
end;  

procedure TFrame2.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState;
 X, Y: Integer);
begin
 PaintBox1.Invalidate;
end;


Только вот проблема в том, что если у Frame2 поставить DoubleBuffered в True, то конец линии начинает весьма сильно отставать от курсора(видимо копирования Bitmap"а весьма долго происходит), а если DoubleBuffered := False, то, естественно, начинают мигать все графические объекты на фрейме.. Как бы так сделать, чтоб и линия от курсора не отставала, и фрейм не мигал..


 
default ©   (2004-06-05 19:47) [1]

у меня ничё не отстаёт...специально на форму несколько картинок кинул...


 
jack128 ©   (2004-06-05 20:06) [2]

я вот сейчас перегрузился, тоже нормально выглядит.. Но у мя Duron800/256МБ а пользователя может быть конфигурация и похуже. Если уж у меня так подтормаживает, то что у него будет? Может, кто нить радикальное решение проблемы предложит, а то предётся буфферизацию отключать..


 
GuAV ©   (2004-06-05 20:17) [3]


>  PaintBox1.Invalidate;

А может лучше в этой ситуации Repaint ?


 
jack128 ©   (2004-06-05 20:27) [4]


> А может лучше в этой ситуации Repaint ?
<>Мда, это идея. Правда это может вызвать сильные тормаза - нужно проводить эксперементы на слабых машинах. Спасибо..


 
GuAV ©   (2004-06-05 20:29) [5]


> Правда это может вызвать сильные тормаза

Хм, так ты хочеш рисовать линию без отставания или нет - ? :)


 
jack128 ©   (2004-06-05 23:11) [6]

мда. Сейчас вот достаточно замучил систему, чтобы начались тормоза, Repaint не помогает. В принципе можно было догадаться, но что то я недопёр.. Ладно, какие еще будут предложения? От буфферезации ОЧЕНЬ неохота отказываться ;-(


 
GuAV ©   (2004-06-05 23:19) [7]

а как кстаит рисуется прямоугольник выбора, когда выбирают много объектов? может это оно?

> Repaint не помогает

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


 
GuAV ©   (2004-06-05 23:21) [8]

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


 
jack128 ©   (2004-06-05 23:32) [9]


> можно попробовать вставить фрейм и отключить дв буф тока
> для него...
сейчас так и сделано.  Вообще этот фрейм - это графический редактор электр сетей. На фрейме лежит PaintBox, на котором собственно я и рисую.. При отключенной буфферизации все жутко мерцает, не хочу я её отключать..

> а как кстаит рисуется прямоугольник выбора, когда выбирают
> много объектов? может это оно?
DrawFocusRect - нет не оно ;-)


 
GuAV ©   (2004-06-05 23:38) [10]

а может рисовать срествами апи прямо в mousemove?


 
GuAV ©   (2004-06-05 23:40) [11]

а кстати что Paint делает?
сначала SetCapure, а потом... ?


 
jack128 ©   (2004-06-05 23:48) [12]


> а кстати что Paint делает?
> сначала SetCapure, а потом... ?
Как SetCupture?? Ты что, нафиг? в OnPaint, что я делаю - см [0], если же тя инетересует, что происходит в недрах VCL, то можешь и сам глянуть в исходники - там все прозрачно...


> а может рисовать срествами апи прямо в mousemove?
ОЧЕНЬ вероятны глюки, при таком походе.. Рисовать нужно всегда по приходу сообщения WM_PAINT, а не когда бог на душу положит ;-)


 
GuAV ©   (2004-06-05 23:52) [13]

> а кстати что Paint делает?
LOL
я имел ввиду MSPaint


 
Gero ©   (2004-06-05 23:54) [14]

А нафиг его весь перерисовывать?
Обновляй только так, где линия была.


 
GuAV ©   (2004-06-05 23:59) [15]

кстати в дельфи в папке демос есть хелловорлд называется
program GraphEx;


 
default ©   (2004-06-06 00:01) [16]

под обновлением понимается вырисовывание линии в режиме xor
для её стирания по старым координатам и рисование новой линии по новым координатам


 
GuAV ©   (2004-06-06 00:02) [17]

GuAV ©   (05.06.04 23:59) [15]
имхо, оно!


 
GEN++ ©   (2004-06-06 00:08) [18]

Есть такая программа Базис-Мебельщик 5.0 точно знаю написана на Delphi. курсор в виде перекрестья через весь экран, демка на сайте есть. Может чем поможет.


 
jack128 ©   (2004-06-06 00:14) [19]


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

> кстати в дельфи в папке демос есть хелловорлд называется
> program GraphEx;
начиная с какой версии? в пятерке я не вижу..


 
GuAV ©   (2004-06-06 00:14) [20]

зачем качать - вот уже демка:
C:\Program Files\Borland\Delphi7\Demos\Doc\Graphex\


 
GuAV ©   (2004-06-06 00:16) [21]


> начиная с какой версии? в пятерке я не вижу..

Д7. могу на мыло уверен в пятерке пойдет.


 
GuAV ©   (2004-06-06 00:20) [22]

6 кБ архив рар давай мыло, если надо.


 
default ©   (2004-06-06 00:22) [23]

в 6-ой точно есть


 
GuAV ©   (2004-06-06 00:26) [24]

В 4й есть!


 
GuAV ©   (2004-06-06 00:30) [25]


> В 4й есть!

и по сути практически никаких отличий


 
jack128 ©   (2004-06-06 00:34) [26]

Угу, сенкс, нашел -). О результатах доложу завтра - сейчас спать пора :-)


 
GuAV ©   (2004-06-06 00:39) [27]


> jack128 ©   (06.06.04 00:34) [26]
> Угу, сенкс, нашел -). О результатах доложу завтра - сейчас
> спать пора :-)

Имхо, сегодня :) по крайней мере по Москве


 
Думкин ©   (2004-06-06 07:50) [28]

Эта тема поднималась в Медиа недавно - 2 или 3 ветки было.
Например:
http://delphimaster.net/view/8-1082133384/


 
jack128 ©   (2004-06-06 09:52) [29]


> Думкин ©   (06.06.04 07:50)
угу, посмотрел - по сути буфферезация и дает такой же эффект отстования (в твоем примере - отстованеи вершины прямоугольника) от курсора..

По поводу демки - она как раз отлично выглидит, но я не могу понять почему ;-(
В Image просто рисование идет на канве "виртуального" битмапа, а потом все это копируется на "реальную" канву(ту на которой мы должны рисовать для вывода на экран).. Все это до жути напоминает все тот же DoubleBuffered := True. Люди, объясните в чем принципиальное отличие, не дайте помереть неучем!!!


 
GuAV ©   (2004-06-06 11:48) [30]


> По поводу демки - она как раз отлично выглидит, но я не
> могу понять почему ;-(

Насколко я понял эу демку, она использует TImage, а не TPaintBox.
причём линию рисует pmNotXor, и возвращает назад так же, при рисовании таким способом нужно возвращать назад.


 
GuAV ©   (2004-06-06 12:21) [31]

ЗЫ - если кот-нибуть разберется, как этот пример работот, то имхо нужно будет это в faq запузырить, чтобы потом не повторять измышления и ошибки


 
jack128 ©   (2004-06-06 12:58) [32]


> Насколко я понял эу демку, она использует TImage, а не TPaintBox.
> причём линию рисует pmNotXor, и возвращает назад так же,
> при рисовании таким способом нужно возвращать назад.
это понятно, но в результате все равно все сводиться к Invalidate всего Image"a и копированию его конву, так же как и при DoubleBuffered := True..


 
GuAV ©   (2004-06-06 13:03) [33]

Кстати, можешь ту же технику что в примере попорбовать не на имаге а на самом фрейме? просто интересно...


 
jack128 ©   (2004-06-06 13:13) [34]


> Кстати, можешь ту же технику что в примере попорбовать не
> на имаге а на самом фрейме? просто интересно...
Знаешь - мне уже нечего не интересно..Вторые сутки над этой проблемой бьюсь и никак не могу понять в чем дело..:-(

Вообще, что на фрейме рисовать, что на PaintBox"е - принципиальной разницы нету, для винды, то все равно PaintBox"a не существует..


 
GuAV ©   (2004-06-06 13:14) [35]

в любом случае, а если [33] получится, то тем более, TPaintBox видимо дейсвительно только для того, чтобы в OnPaint статичную картину рисовать :(


 
jack128 ©   (2004-06-06 13:15) [36]

Кстати, в ходе эксперементов написал прикольный проэкт с офигенным глюком - обработчик события назначен в дезин тайм, но не срабатывает в ран тайм ;-)
Если кто хочет могу выслать..


 
GuAV ©   (2004-06-06 13:17) [37]


> Если кто хочет могу выслать..

Вышли. А я вышлю свой глюк - форма таскаемая по моей вкладке свойсв в проводник


 
GuAV ©   (2004-06-06 13:58) [38]


> Знаешь - мне уже нечего не интересно..Вторые сутки над этой
> проблемой бьюсь и никак не могу понять в чем дело..:-(

я не понял проблему. есть рабочий пример - так копировать вставить и всё


 
jack128 ©   (2004-06-06 15:05) [39]

Млин, я дурак.  Не фига демка не работает. Если в конструкторе выставить размеры картинки побольше (у мя 800*500) и рисовать достаточно большую линию (пикселей в 400) то все очень даже заметно :-(  С другой стороны утешает то, что MS Paint"e обнаружелась такая же фигня. В случае чего на Билли буду пенять :-)  В общем по результатам иследований: вывод - "стандартными"  методами эту проблему не решить...


 
GuAV ©   (2004-06-06 15:22) [40]


> что MS Paint"e обнаружелась такая же фигня.

Что и следовало ожидать. Курсор-то крысы апаратный, но если пригрузить тои его перемещение тормозит.

********
Есть идея такая-скрыть нафиг курсор. рисовать самому курсор вместе с линеей и юзер нифига не заподозрит.


 
jack128 ©   (2004-06-06 15:32) [41]


> Есть идея такая-скрыть нафиг курсор. рисовать самому курсор
> вместе с линеей и юзер нифига не заподозрит.
Слушай - я тебя боюсь ;-)) С такими приколами юзер у тя инфаркт может схватить..


 
GuAV ©   (2004-06-06 16:06) [42]


>эту проблему не решить...

... т.к. она видимо связана с задержкой отправки и обработки WMMouseMove...


> Слушай - я тебя боюсь ;-)) С такими приколами юзер у тя
> инфаркт может схватить..

А что не так ;-) Крыса стандартная не видна, видна твоя, она отстаёт немонго от перемещения миши по коврику ну дык это уже тармaза ОСи ;-)
и вообще, повесь своё событие на interrupt 33h ;-)


 
тот же   (2004-06-06 20:31) [43]

Что-то не соображу как сохранить в INI файле дату из DateTimePicker1 и как её прочитать?
Сохранял так
INI.WriteString("DrawCell","Data", DateToStr(Form4.DateTimePicker1.DateTime));
а прочитать не могу


 
GuAV ©   (2004-06-06 21:32) [44]

тот же   (06.06.04 20:31) [43]
А какого в нашу ветку лезешь, создай совю!



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

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

Наверх




Память: 0.58 MB
Время: 0.033 c
1-1086457803
DJ DIZzY
2004-06-05 21:50
2004.06.20
StringGrid


3-1085629459
Victor_A
2004-05-27 07:44
2004.06.20
Вопрос По Fastreport V.2.52


1-1086378897
rrew
2004-06-04 23:54
2004.06.20
mytexteditor.exe textfile.txt


3-1085571485
den_777
2004-05-26 15:38
2004.06.20
Уникальные индексы и констрейнты


1-1086766518
dimon_programmer
2004-06-09 11:35
2004.06.20
Почему пакет не инсталит .dcu-файл