![]() |
|
Модераторы: gambit, Partizan |
![]()
|
|
| 4ybaka |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 28.4.2007 Репутация: нет Всего: нет |
нужно выводить подряд неск битмапов,но само собой смещенных на какое то расстояние друг от друга.проблема в след-ем:
при рисовалке след битмапа предидущий не стирается,а значит получаем размазанную картинку.нужно это както исправить. ЗУ: 1)функция рисования находится в отдельном файле,те не в классе формы. 2)тупая зарисовка фона не подходит - тогда не видно будет,что было за картинкой(она же не простой квадрат 3)каждый раз вызывать Paint для формы не подходит - оч много объектов. Это сообщение отредактировал(а) 4ybaka - 21.5.2007, 21:13 -------------------- "То,что вы понимаете - это все,что вы понимаете." Брайн Керниган |
|||
|
||||
| archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 9 Всего: 27 |
Рисовать все в Bitmap, а потом выводить на форму. Можно организовать несколько Bitmap`ов - в виде буфферa. Например перед отрисовкой картинки во второй Bitmap, копировать содержимое в первый а потом рисовать картинку. Таким образом мы получаем первый Bitmap, в котором нарисовано все, кроме картинки. И благодаря ему можно сделать "откат" на состояние без картинки и нарисовать уже новую, смещенную....
Если я правльно понял, что нужно Это сообщение отредактировал(а) archeg - 22.5.2007, 00:15 -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 11 Всего: 170 |
archeg, в буфере хранить не надо. Ты же видишь,
К тому же, при каждом новом битмапе, как я понял, старые нужно не прорисовывать, а стирать. 4ybaka, ты при рисовании битмапов запоминай где-нибудь их Rectangle (по отношению к контролу, на котором рисуешь), а потом, в нужный момент вызывай Control.Invalidate (Rectangle). -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 9 Всего: 27 |
Дык я ж не предлагаю их рисовать каждый раз заново. Я предлагаю сделать еффект переднего и заднего плана. То есть на заднем плане у нас то что нужно чтобы было всегда - мы его не прорисовываем каждый раз, мы его прорисовали один раз. Вот на нем и рисуется куча объектов. А на переднем плане мы производим анимацию - перерисовываем все, каждый раз. Потом мы соединяем передний и задний план и отрисовываем на PictreBox - эта операция не зависит от количества объектов, она растровая. -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: 1 Всего: 62 |
Это называется спрайтовая анимация. Есть полно готовых движков на codeproject.com
|
|||
|
||||
| 4ybaka |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 28.4.2007 Репутация: нет Всего: нет |
tol05, Control.Invalidate (Rectangle) просто добавляет к области обновления данный квадрат,а само обновление происходит когда получится?а Update() это делает сразу?и нужно ли блокировать форму при многопоточном вызове Control.Invalidate (Rectangle)?и вообще,какие методы можно вызывать без блокировки(при многопоточном вызовах)?......
-------------------- "То,что вы понимаете - это все,что вы понимаете." Брайн Керниган |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 11 Всего: 170 |
Контролы позволяют с собой работать только в основном потоке, в котором они созданы. Это уже много раз обсуждалось... и все равно продолжает обсуждаться
Так что в многопоточном формате у тебя просто не получиться вызвать хоть какой-нибудь член класса формы. Нужно через Invoke(). И поскольку вся работа с формой будет производиться в создающем ее потоке, ничего блокировать тебе не прийдется. Сколько бы потоков не просило бы форсу перерисоваться, эти запросы будут накапливаться в очереди запросов потока формы, а она будет их обрабатывать по мере своих возможностей, последовательно. Методы: Invalidate, Refresh, Update. Почитай о них в MSDN, чесное слово, там нормально написано. Я указал Invalidate просто потому что я им привык еще с плюсов пользоваться. И использую его почти всегда без Update. Некоторые уважают Refresh, все это - дело вкуса и конкретной задачи, ИМХО. -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
В обработчике события Paint или перекрытом методе OnPaint. Не сразу, а ставит в очередь виндошных сообщений. Сразу перерисовывает Refresh, но перерисовывает всё. Для вызова перерисовки из другого потока надо вызывать метод Refresh или Update не напрямую а через Invoke:
-------------------- ![]() |
||||
|
|||||
| 4ybaka |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 28.4.2007 Репутация: нет Всего: нет |
я вот вызывал Invalidate из другого потока,а он нормально,ничего не ругался,даже вроде работает...
это как объяснить? -------------------- "То,что вы понимаете - это все,что вы понимаете." Брайн Керниган |
||||||
|
|||||||
| tol05 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 11 Всего: 170 |
Бдительность проверяешь?
Ну а объясняется просто: Invalidate отправляет форме только сообщение с просьбой, когда будет возможно, перерисовать (если не трудно) А Refresh и Update - методы прямого действия, и
Вот тебе тест. Попробуй раскоментировать любой из методов (одного достаточно) и получишь эксепшен.
-------------------- На хорошей работе и сны хорошие снятся. |
||||
|
|||||
| 4ybaka |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 28.4.2007 Репутация: нет Всего: нет |
а то! вот еще один вопрос возник:при перерисовке области окна у нас перерисовываются только контролы,входящие в область перерисовки(если не ошибаюсь).а если на форме на фоне рисуется битмап,то он же не перерисовывается?(только если надо всю форму перерисовать,а это долго...)так вот как можно сделать так,чтобы перерисовывалась и та часть битмапа,кот входит в указанную область? -------------------- "То,что вы понимаете - это все,что вы понимаете." Брайн Керниган |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 11 Всего: 170 |
Что за сложности на ровном месте? 4ybaka, попрактикуйся ты с функциями, параметрами, чем терять время на сомнения и предположения. Кому ты даешь задание перерисоваться? Форме или конкретному контролу? Форма - это тоже Control, так что для нее также действует Control.Invalidate(Rectangle), она перерисовывается сама и дает коменду перерисоваться контролам, это уже их головняк. Rectangle - это область, которую ты объявляешь недействительной. Вот ты свернул форму в трей - вся область недействительна, перекрыл ее (сбоку наполовину) другим окном - значит та половина недействительна. И контролы на ней перерисуются не все, а только те, что в инвалид-область попали... Но это поведение сама форма себе обеспечивает. А в твоей ситуации форму никто не трогает, никто не сворачивает, не перекрывает, она себе и спит спокойно. А ты Control.Invalidate(Rectangle) сообщаешь ей:"Эй, тебя перекрыли на 20%, давай перерисовывайся". И еще важный момент. Ты рисуешь в OnPaint. Контролы на форме сами должны прорисоваться, а ты еще два матюка ручками нарисовать хочешь. Матюки ты написать сумеешь (я почему-то в этом не сомневаюсь Некоторые на это дело забивают, потом долго жалуются по непонятным траблам... -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| 4ybaka |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 28.4.2007 Репутация: нет Всего: нет |
форме.
просто добавляешь свой контрол(юзер или какой там нашел) в список контролов формы как: this.Controls.Add(),и все,дальше они сами пусть себя рисуют,только вот ворос то в другом был -------------------- "То,что вы понимаете - это все,что вы понимаете." Брайн Керниган |
||||
|
|||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |