Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 обнаружелась такая же фигня.

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

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



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

Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.033 c
1-1086674669
Yurec66
2004-06-08 10:04
2004.06.20
Дата сервера Netware


3-1085643265
Kraw
2004-05-27 11:34
2004.06.20
Программирование TDBGrid


3-1085648929
CrazyMan
2004-05-27 13:08
2004.06.20
Как справиться с "" в селекте InterBase


3-1085777892
.Net
2004-05-29 00:58
2004.06.20
Прорисовка DBGrida?


14-1086182913
XYZ
2004-06-02 17:28
2004.06.20
Работа со сканером штрих-кодов





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