Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

работа с TCanvas

3.4K
04 марта 2003 года
docent
4 / / 04.03.2003
Люди, у меня есть проблема с использованием TImage->Canvas. Если открыть окно, на котором есть Image, то после ресайза прорисовка происходит только на той части канваса, которая была открыта в первый момент, все остальное пространство не используется. Каким образом это исправить.
И еще один вопрос: в 6 билдере возникла проблема с рисованием на канвасе мышкой, я не вызываю команды прорисовки всей канвы, а рисую только в определенных местах, но канва начинает страшно мерцать, как будто она постоянно вся прорисовывается, хотя свойство OnPaint не обрабатывается вообще, может быть поэтому?
317
05 марта 2003 года
Relax
573 / / 20.09.2000
по первому вопросу - у объекта TImage должно стоять свойство Align = alClient - если объект растягивается на всю форму. Если не на всю, то тогда надо привязать его ко всем четырем углам с помощью свойства Anchors.

по второму вопросу - расскажи как рисуешь?
3.4K
05 марта 2003 года
docent
4 / / 04.03.2003
Цитата:
Originally posted by Relax
по первому вопросу - у объекта TImage должно стоять свойство Align = alClient - если объект растягивается на всю форму. Если не на всю, то тогда надо привязать его ко всем четырем углам с помощью свойства Anchors.

по второму вопросу - расскажи как рисуешь?


Обрабатываю событие OnMouseMove, в нем рисую прямоугольник на канве, размерыего зависяыт от полодения мыши, ну самое обычное выделение. Так почему-то Канва начинает все время прорисовываться, хотя в 5 билдере такого не было, очень раздражает, а как от этого избавиться - не знаю.

317
05 марта 2003 года
Relax
573 / / 20.09.2000
погоди, погоди... ты говоришь, что рисуешь прямоугольник.
стандартно это делается так:
1. отловил событие
2. нарисовал прямоугольник по размеру области рисования, чтобы затереть старый
3. нарисовал прямоугольник, который рисуется мышой
и т.д. в цикле... если ты делаешь так, то мерцание естественно, на до использовать буфер, т.е. все то же самое делать, но не на экране, а в памяти, а потом копировать из памяти на экран, тогда мерцания не будет.

есть другой вариант, для твоего случая более подходящий:
1. отловил событие
2. нарисовал прямоугольник по старым координатам мыши в режиме XOR, таким образом он сотрется
3. нарисовал новый прямоугольник
и т.д. в цикле...

а по первому вопросу - получилось?
317
05 марта 2003 года
Relax
573 / / 20.09.2000
вот, на всякий случай, пример...
3.4K
05 марта 2003 года
docent
4 / / 04.03.2003
Делаю так:
1. Отлавливаю событие мыши
2. Рисую прямоугольник (пока без стирания старого, просто хотя бы посмотреть)

и оно все мерцает, когда двигается мышь, как будто вся канва перерисовывается заново.

А как использовать буфер для вывода?

По поводу первого - я использую привязку к клиентской области, разворачиваю на весь экран, но если, допустим, вытащить одну и toolbar, то размер канвы увеличивается, но так как на ней уже что-то нарисовано, то она не хочет использовать дополнительно открывшуюся область, это какой-то старый глюк с канвой, я в одной книге видел как от этого избаляться, но это не помогло. Там было что-то, связанное с ClipRect
317
05 марта 2003 года
Relax
573 / / 20.09.2000
вот еще примерчик
2.9K
05 марта 2003 года
corneo
6 / / 05.03.2003
Цитата:
Originally posted by Relax
вот еще примерчик


Как все-таки использовать буфер?

317
05 марта 2003 года
Relax
573 / / 20.09.2000
опишу словами - пример неохота делать :)
сначала суть проблемы:
когда нужно рисовать что-то динамическое на канве, например, ползущий по экрану прямоугольник, то если просто рисовать его изменяя координаты, то за ним поползет шлейф предыдущих прорисовок - это плохо :( решение естественно - надо сначала затереть старую картинку и нарисовать все заново, но! - есть такой момент, когда пространство картинки представляет собой просто прямоугольник заполненный цветом фона - этот момент короткий, но изображение из-за этого мерцает, т.е. последлвательносьт такая: картинкас прямоугольником, пустая картинка, картинка с прямоугольником по новым координатам. выход такой - делать все это манипуляции в памяти, а не на экране, а на экран выводить только результат. тогда получится: картинка с прямоугольником, картинка с прямоугольником по новым координатам и мерцания не будет :)
обласьт памяти или буфер в которую производится рисование представляет собой объект класса TBitmap, хотя конечно можно юзать API, но это более трудоемко, хотя и менее ресурсоемко...

есть один пример - мой курсовой по компьютерной графике - там правильные многогранники (Тела Платона) движутся по прямолинейным траекториям, отталкиваясь от стен объемного куба. вот ссылка - посмотрите, если кому понравится, могу выслать полные (!) исходники.
1.9K
06 марта 2003 года
XilefNori
34 / / 28.02.2003
Цитата:
Originally posted by Relax
вот ссылка - посмотрите, если кому понравится, могу выслать полные (!) исходники.



Если не затруднит, пошли на [email]post_office@pochtamt.ru[/email].
(Надеюсь написано на С++)
Заранее спасибо.

317
06 марта 2003 года
Relax
573 / / 20.09.2000
отослал
написано на С++ в среде ВСВ 6.0 :)
(Паскаль я не люблю за кривизну синтаксиса)
507
06 марта 2003 года
PASS
45 / / 20.09.2000
А можно мне тоже исходники?
Мой e-mail: [email]pasechnikk@mail.ru[/email]
2.9K
06 марта 2003 года
corneo
6 / / 05.03.2003
Мне тоже, если можно. :)
317
07 марта 2003 года
Relax
573 / / 20.09.2000
Цитата:
Originally posted by corneo
Мне тоже, если можно. :)


а адрес у тебя какой?

ну ладно - уговорили :) - выложу на сайт...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог