![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скопировать регион [D7]
RUNaum © (2006-05-18 09:36:00)Как можно скопировать регион (круг к примеру или любая другая форма) с канвы одного компонента на канву другого, при этом чтобы, понятное дело, под кругом осталась ранее видимая область.
parovoZZ (2006-05-29 19:46:00) [1]Так а в память его можно "записать"? У меня что-то не получилось. Да и в справке написано, что регион можно вызвать не более одного раза.
MBo (2006-05-29 08:21:00) [2]>parovoZZ
Мой пост с ExtCreateRgn относится к долговременному сохранению региона(например, на винт)
Для временного хранения достаточно того, что Игорь посоветовал
parovoZZ (2006-05-28 11:45:00) [3]
> и там, видимо, через canvas.pixels[] работа идет... мой
> телепатор прав?
НЕТ. Там всё идёт через HDC. Так как я обожаю WinApi, то собственно ни о каких канвасах речи и быть не может. Мой скринмэйт вместе с картинками весит 40 кило.
Меня смущает последний параметр ExtCreateRegion - просят константу. А у меня там переменная. Хотя в справке написано, что ExtCreateRegion работает совместно с GetRegionData. И что за структура XFORM? Попробовал подставить nil - результат тоже нулевой. Вроде в RGNDT что-то пишется, но не изымается.
Может есть у кого рабочий примерчик?
antonn (2006-05-28 07:18:00) [4]parovoZZ © (27.05.06 23:37) [13]
//Пара строчек по созданию региона на основе картинки
и там, видимо, через canvas.pixels[] работа идет... мой телепатор прав?
parovoZZ (2006-05-27 23:37:00) [5]Попробовал...
В result готовый регион:
function CreateRgn (index : byte) : HRGN;
var
x : integer;
Rgn : HRGN;
RgnDt : RGNDATA;
form : xForm;
begin
result := CreateRectRgn (0, 0, Width, Height);
....
//Пара строчек по созданию региона на основе картинки
GetRegionData (result, SizeOf (RgnDT), @RgnDt);
result := ExtCreateRegion (@form, SizeOf (RgnDt), RgnDt)
end;
На выходе имеем 0.
parovoZZ (2006-05-27 23:12:00) [6]Ну вообщем я ленивый, поэтому объясню ситуацию.
У меня есть скринмэйт, который активно машет крыльями. Первое, что приходит в голову, это при вызове следующей картинки обрабатывать её и вырезать регионом всё лишнее. Просто, но очень сильно загружает процессор. Второе, что приходит на ум - это создать массив и туда залить все регионы для всех картинок. НО! При последующем вызове региона из массива мы получаем всё, что угодно, но только не регион. Я пошёл по другому пути. В результате нагрузка процессора не более 10 %, без обработки картинки, но вызываем каждый раз CombineRgn. А вот GetRgnData и ExtCreateRgn действительно позволяют решить задачу?
parovoZZ (2006-05-20 21:00:00) [7]Хм, будем попробовать
MBo (2006-05-19 06:48:00) [8]>регион нельзя запомнить
GetRgnData
ExtCreateRgn
parovoZZ (2006-05-18 23:08:00) [9]Да ну. У меня есть 10 картинок. Создаю CombineRgn столько же регионов (допустим, в массиве). Но как только делаю SetWindowRgn предыдущий регион уходит в небытие.
Игорь Шевченко (2006-05-18 21:12:00) [10]
> Что самое дерьмовое, регион нельзя запомнить. :)
Создаешь регион, копируешь нужный туда CombineRgn или CopyRgn и запоминаешь. Проблем нету. Заодно и выражения выбираешь при отправке постов.
parovoZZ (2006-05-18 21:09:00) [11]Что самое дерьмовое, регион нельзя запомнить. :)
RUNaum (2006-05-18 13:13:00) [12]wal © (18.05.06 13:00) [5]
Огромное спасибо вам и MBo, все получилось!
wal (2006-05-18 13:00:00) [13]
> [4] RUNaum © (18.05.06 12:55)
SetWindowRgn
RUNaum (2006-05-18 12:55:00) [14]Угу, понял.
Вопросец еще. Может так проще будет:
Можно ли придать панели круглую форму? Т.е. есть некая подложка, на ней висит круглая "панель", на канве которой отрисовывается полноценно изображение по размеру описывающего круг прямоугольника, но за счет того что сама панель задана регионом (кругом) излишки "обрезаются".
Прошу подтоклнуть на мысль... В WinAPI не силен (
Я прошу прощение за формулировку, не знаю как проще пояснить ) но думаю более менее понятно.
MBo (2006-05-18 12:36:00) [15]В приемном контексте установить SelectClipRgn (круглый по нужным размерам CreateEllipticRgn)
RUNaum (2006-05-18 10:47:00) [16]Плохо пояснил ) Прошу прощение.
Давайте разберем на примере. Есть "панель", на ее канве (по всей панели) что-то отрисовано. Есть другая "панель", с канвы которой нужно скопировать круг на первую, расположив его в центре и чтобы не затерлось то что виднеется за пределами круга.
Вроде лучше.
MBo (2006-05-18 09:57:00) [17]>при этом чтобы, понятное дело, под кругом осталась ранее видимая область.
Вот это дело не вполне понятное ;)