Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.ru

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Заливка области изображением. [C#]


KilkennyCat ©   (12.02.16 22:17

Есть рамка, красивая, у которой может изменятся ширина и высота.
Рамка построена из 8-и изображений: все углы, верхняя, нижняя, левая и правая планки.
нашел три варианта, как закрашивать планки (углы не масштабируются при изменении размеров рамки):
1) самый простой. сохраняем заведомо большие по размеру картинки планок, при отрисовке ненужное отсечется. Недостаток - храним много лишнего.
2) создаем текстурную кисть из изображения шириной (высотой) в 1 пиксел, заливаем область. Недостаток: начала координат областей планок должны быть кратны высоте (ширине) кисти, иначе происходит сдвиг картинки внутри кисти (надеюсь, понятно высказался).
3) те же картинки из 2) отрисовываем через DrawImage(image, x, y, width, height). Однако, тут тоже недостаток: интерполяция. Установка режима NearestNeighbor работает очень забавно, впечатление, что сначала все равно градиент, как опорный, а потом огрубляется. Результат: заливка примерно до середины области. Избавление:  DrawImage(image, x, y, width * 2, height) (для горизонта).

Мне сие кажется странным.
Я чего-то недопонял, или это единственные варианты?

есть, конечно и четвертый вариант, накидать боксов с фоном, задать им док, будут сами растягиваться и смещаться :)


Наиль ©   (13.02.16 19:12[1]

Я, в своё время, обошёлся хранением только углов. Получалось очень красиво. Но я генерировал кнопки, поэтому центральная область тоже заливалась. В качестве основы мог использовать всё, что угодно: фотографии металлических шариков, скриншоты кнопок из "Сокровища Монтесумы" и стандартных контролы винды: кнопки, радио и чекбоксы. У получившейся кнопки ограничение было только на минимальный размер, а максимальный мог быть любым.
К сожалению, это всё где-то в древних бэкапах.
Из твоих вариантов я бы выбрал второй, только с промежуточным шагом.
Т.е. заливал бы кратную область, которая чуть больше, той которая есть, на вспомогательном холсте, а потом копировал бы с масштабированием на положенное место.

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

А правильный вариант, это использование векторной графики, так как это делает ворд для декоративных рамок страницы.


KilkennyCat ©   (13.02.16 19:55[2]


> Наиль ©   (13.02.16 19:12) [1]

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

второй вариант с промежуточным шагом - это вариант... пусть будет нумер 2(б).
Но это тоже с "хитростью".
неужто BackGroundImageLayout у стандартных контролов тож через какой-то маневр сделан?


Наиль ©   (14.02.16 11:17[3]

Ни когда не видел стандартных контролов с периодичной заливкой сторон. Поэтому всегда хватает хранения только углов рамки. А заливка сторон делается с шагом 1 пиксель, поэтому нет необходимости в дополнительном шаге для масштабирования.

Я ковырял тему Luna комплекта Windows XP программой Restorator. Там всё как на ладони. Но подробностей не помню, давно это было.


KilkennyCat ©   (14.02.16 11:38[4]


> не видел стандартных контролов с периодичной заливкой сторон

сторон - нет. весь заливается.
и в этом моя тупость :) - сделав из сначала из контрола сторону, потом удивлялся "странному" поведению варианта 2.

Спасибо, Наиль.


имя   (21.04.16 15:03[5]

Удалено модератором


ЯЧтсия   (09.01.17 14:49[6]

Удалено модератором


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо