![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
blackhard |
![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
Задача такова: Написать программу построения чертежей планиметрии "протягиванием" от выбранной точки с изображением ее промежуточного положения с возможностью обозначения точек и проведения стандартных линий в треугольнике.
Как это сделать я впринципе знаю но есть 1 проблема это работа с указателем мыши.Для начала я попытался сделать так чтобы при нажатии на изображение рисовалась линия из текущего положения курсора в положение указателя мыши procedure TForm1.Image1Click(Sender: TObject);получается чето не то линия проводится явно не к указателю мыши.Может это связано с масштабом Image1 (833x533)?подскажите.И еще какие свойства в Tmouse отвечают за нажатые кнопки мыши? |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Используй вот это событие:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Добавлено через 7 мин. Цитата Может это связано с масштабом Image1 (833x533)? Это связано с тем, что Mouse.CursorPos хранит информацию в экранных координатах (глобальных), а тебе надо клиентские. Вот работающий код через OnClick:procedure TForm1.Image1Click(Sender: TObject); |
blackhard |
![]()
Сообщение
#3
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
блин чето не получается сделать протягивание с изображением промежуточного положения.Алгоритм должен быть примерно таким: рисуем новую линию с координатами указателя мыши старую линию стираем и так до тех пор пока не нажмем кнопку.Я попробовал для начала так
думал что линия будет постоянно следовать за указателем но это никак не работает. |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Тебе надо отрисовывать не по OnClick, а по OnMouseDown "захватывать" мышь, по OnMouseMove - перемещать линию, до тех пор, пока не произойдет OnMouseUp (при котором мышь "освобождается")...
|
blackhard |
![]()
Сообщение
#5
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
|
blackhard |
![]()
Сообщение
#6
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
Надеюсь последний вопрос
![]() image1.Canvas.Handle:=0;правда честно говоря я не знаю че такое Handle поэтому и спрашиваю как правильно? |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Image1.Canvas.Brush.Color := clRed; // Здесь задаешь цвет |
blackhard |
![]()
Сообщение
#8
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
А как можно сделать чтоб при 1ом нажатии накнопку мыши линия прекращалась и от точки ее завершения сразуже тянулясь новая линия(ну это я сделал), а при двойном нажатии на кнопку линия прекращается мыш полностью от нее отвязывается и можно тянуть новую линию совершенно не связанную с предыдущей?
|
blackhard |
![]()
Сообщение
#9
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
И еще 1 вопрос как можно сделать чтобы новая линия рисовалась не поверх старой а под ней?
|
andriano |
![]()
Сообщение
#10
|
Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: ![]() ![]() ![]() |
1. Ввести состояние (см.конечные автоматы) и отслеживать двойной щелчок.
2. Рисовать ручками, проверяя, что та точка, которую ты хочешь закрасить, содержит цвет фона, а не линии. |
blackhard |
![]()
Сообщение
#11
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
|
andriano |
![]()
Сообщение
#12
|
Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: ![]() ![]() ![]() |
|
blackhard |
![]()
Сообщение
#13
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
Рисуешь линию по точкам (например, алгоритмом Брезенхема), проверяя при этом, какого цвета точка, которую ты хочешь закрасить. Если цвета фона - рисуешь, если другого цвета - пропускаешь. Эх теперь возникла новая проблема(линии я рисую по пикселям) когда я вытягиваю линию и хочу ее завершить она не остается а закрашивается белым.Почему это происходит я понимаю а вот избежать этого никак не выходит Вот тут я и двигаю линию она должна завершатся при событии Image1Click и если при этом она закрашивает линию белым значит почемуто обрабатывается и Image1MouseMove?Что подправить чтоб заработало? |
andriano |
![]()
Сообщение
#14
|
Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: ![]() ![]() ![]() |
Ты по-русски напиши, чего хочешь добиться, что для этого делаешь, что получаешь и чем то, что получаешь, отличается от того, что хочешь.
Вполне вероятно этого уже окажется достаточным для того, чтобы найти ошибку. Из того, что я вижу в коде: у тебя ВСЕГДА рисуется белым (подозреваю, так ты стираешь), но НЕ ВСЕГДА - черным. При таком способе рисования, естественно, белых линий и будет рисоваться больше, чем черных. Могу повторить свой совет: ввести дополнительную переменную состояния и сделать конечный автомат. |
blackhard |
![]()
Сообщение
#15
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
Ты по-русски напиши, чего хочешь добиться, что для этого делаешь, что получаешь и чем то, что получаешь, отличается от того, что хочешь. Вполне вероятно этого уже окажется достаточным для того, чтобы найти ошибку. Из того, что я вижу в коде: у тебя ВСЕГДА рисуется белым (подозреваю, так ты стираешь), но НЕ ВСЕГДА - черным. При таком способе рисования, естественно, белых линий и будет рисоваться больше, чем черных. Могу повторить свой совет: ввести дополнительную переменную состояния и сделать конечный автомат. Если по русски то вот чего я хочу: кликаю мышуой по изображению(1 раз) фиксируется точка перемещаю мыш линия от этой точки тянется за указателем мыши кликаю опять по изображению (1раз) линия завершается но мыш не освобождается (те от точки завершения старой линии тянется новая) рисую очередную линию и кликаю по изображению (2раза) линия завершается и мыш освобождается полностью(те можно проводить новую линию не связанную с предыдущим изображением).Ну вот вобщем и все работает все токо ничего невидно ( линии закрашиваются белым).Я понимаю что нужно ввести новую переменную состояния но не понимаю где изменять условие ее истинности? |
andriano |
![]()
Сообщение
#16
|
Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: ![]() ![]() ![]() |
Сэр знаком с таким знаком препинания как запятая?
Очень тяжело читать. Если ты и программы так же пишешь, не удивляюсь, почему они не работают. Значит, вводим состояния: 0. Неопределенное состояние - на всякий случай: если вдруг переменная примет это значение, будем знать, что где-то эта переменная портится. 1. "свободная мышь" - нигде ничего не рисуем. 2. нажата кнопка мыши. 3. мышь "тянет линию". 4. таймаут после двойного щелчка (кто знает, сколько сообщений о нажатии/отпускании мыши мы получим во время двойного щелчка - чтобы они нам не мешали) Мышь находится в одном из приведенных состояний, в начале - "1". Мы отслеживаем сообщения: A - перемещение мыши, B - нажатие мыши, C - отпускание мыши, D - двойной щелчок. В зависимости от того, в каком состоянии мы находились, получая то или иное сообщение, мы выполняем определенное действие (в частном случае - ничего не делаем) и переходим в другое состояние. Осталось расписать таблицу переходов и записать ее на любимом ЯВУ. Например, для 1: 1A - ничего не делаем, 1B - переходим в режим 2, 1C - невозможная комбинация - сообщаем об ошибке, 1D - ничего не делаем. для 2: 2A - стираем старую линию и рисуем новую, 2B - невозможная комбинация - сообщаем об ошибке, 2C - переходим в режим 3, 2D - переходим в режим 4. для 3: 3A - стираем старую линию и рисуем новую, 3B - отрисованную линию оставляем и запоминаем точку нажаия новой линии, 3C - переходим в режим 2, 3D - переходим в режим 4. для 4: 4A - ничего не делаем, проверяем, не вышел ли таймаут, если вышел, переходим в состояние 1, 4B - ничего не делаем, проверяем, не вышел ли таймаут, если вышел, переходим в состояние 1, 4C - ничего не делаем, проверяем, не вышел ли таймаут, если вышел, переходим в состояние 1, 4D - возобновляем таймаут. PS. Писал особенно не продумывая, просто для иллюстрации. Сообщение отредактировано: andriano - 24.04.2008 19:03 |
blackhard |
![]()
Сообщение
#17
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
Сэр знаком с таким знаком препинания как запятая? Очень тяжело читать. Если ты и программы так же пишешь, не удивляюсь, почему они не работают. Значит, вводим состояния: 0. Неопределенное состояние - на всякий случай: если вдруг переменная примет это значение, будем знать, что где-то эта переменная портится. 1. "свободная мышь" - нигде ничего не рисуем. 2. нажата кнопка мыши. 3. мышь "тянет линию". 4. таймаут после двойного щелчка (кто знает, сколько сообщений о нажатии/отпускании мыши мы получим во время двойного щелчка - чтобы они нам не мешали) Мышь находится в одном из приведенных состояний, в начале - "1". Мы отслеживаем сообщения: A - перемещение мыши, B - нажатие мыши, C - отпускание мыши, D - двойной щелчок. В зависимости от того, в каком состоянии мы находились, получая то или иное сообщение, мы выполняем определенное действие (в частном случае - ничего не делаем) и переходим в другое состояние. Осталось расписать таблицу переходов и записать ее на любимом ЯВУ. Например, для 1: 1A - ничего не делаем, 1B - переходим в режим 2, 1C - невозможная комбинация - сообщаем об ошибке, 1D - ничего не делаем. для 2: 2A - стираем старую линию и рисуем новую, 2B - невозможная комбинация - сообщаем об ошибке, 2C - переходим в режим 3, 2D - переходим в режим 4. для 3: 3A - стираем старую линию и рисуем новую, 3B - отрисованную линию оставляем и запоминаем точку нажаия новой линии, 3C - переходим в режим 2, 3D - переходим в режим 4. для 4: 4A - ничего не делаем, проверяем, не вышел ли таймаут, если вышел, переходим в состояние 1, 4B - ничего не делаем, проверяем, не вышел ли таймаут, если вышел, переходим в состояние 1, 4C - ничего не делаем, проверяем, не вышел ли таймаут, если вышел, переходим в состояние 1, 4D - возобновляем таймаут. PS. Писал особенно не продумывая, просто для иллюстрации. Спасибо огромное ![]() Так? Специальной ф.и я найти не могу. |
blackhard |
![]()
Сообщение
#18
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
Вот процедура для рисования линии по пикселям. procedure DrawLine4Connected(x1,y1,x2,y2 : Integer;col:tcolor); Я пытаюсь добится чтоб линия белого цвета не затирала линию черного цвета.Ну с алгоритмом все ясно если цвет пикселя фона отличен от цвета фона то не рисуем пиксель иначе рисуем.Таквот вся проблема в том как узнать какого цвета пиксель на фоне я попробовал так if image1.Canvas.Pixels[x, y]=clblack then{вот тут я пытаюсь узнать цвет пикселя фона (видимо не верно)} cl:=trueВидимо if image1.Canvas.Pixels[x, y]=clblack тут проверяется не цвет пикселя фона а цвет того который я нарисовал до этого?Как правильно узнать цвет пикселя на фоне? |
andriano |
![]()
Сообщение
#19
|
Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: ![]() ![]() ![]() |
Надо не узнавать цвет пикселя на фоне, а заливать фон нужным тебе цветом.
|
blackhard |
![]()
Сообщение
#20
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
|
![]() ![]() |
![]() |
Текстовая версия | 24.06.2025 8:39 |