Страница: 1 | 2 | 3 |
Вопрос: WinAPI ExtFloodFill
Добавлено: 14.03.09 13:39
Автор вопроса: diplay
Ответы
Всего ответов: 45
Номер ответа: 31
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #31
Добавлено: 19.03.09 13:40
Заметь, что твоя задача в посте #16 в корне отличается от первоначальной постановки вопроса. Конечно же, предложенные тебе советы не подойдут для решения новой постановки задачи. По-моему все ты можешь сделать гораздо проще. Открою секрет: у bitmap не бывает прозрачного цвета - прозрачным ты можешь назначить любой цвет картинки, зная скажем координаты точки с этим цветом или просто решив, что едко-розовый будем считать прозрачным. Дальше так. На контроле, который ты заливаешь нужным цветом и на который накладываешь (рисованием) сетку, сверху укладываешь оконный контрол с картинкой, в котором один из цветов (ты знаешь, какой именно) делаешь прозрачным. Это делается при помощи функции SetLayeredWindowAttributes с ключом LMA_COLORKEY.
Номер ответа: 32
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #32
Добавлено: 19.03.09 13:42
Открою секрет: у bitmap не бывает прозрачного цвета
в net класс Bitmap поддерживает alpha-канал.
Номер ответа: 33
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #33
Добавлено: 19.03.09 14:57
Bitmap Bitmap'у рознь. Я ошибочно предполагал структуру данных Bitmap в gdi32. Имхо, нечего в системе, работающей на GDIplus использовать gdi32 API, т.к. в gdi32 не была реализована нормальная работа с альфа-каналом. Может быть ExtFloodFill залазит на область с альфа == 0x00h и перекрашивает и ее. Я не знаток FW, но вроде там встроенных средств хватит с лихвой, делать это по .NET'овски.
Номер ответа: 34
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #34
Добавлено: 19.03.09 15:46
Я не знаток FW, но вроде там встроенных средств хватит с лихвой, делать это по .NET'овски.
да, на самом деле там достаточно всяких средств, но не в этом случае.. Ему,по сути, надо реализовать заливку произвольного участка изображения ограниченную контуром определенным цветом. Этого функционала в net не предусмотрено AFAIK. Поэтому он вынужден извращаться с api.. Я тоже не сторонник этого метода,но у него нет выхода. Единственный вариант что он может сделать чтобы не дергать api, это написать свой алгоритм (к примеру волной) определения области заливки исходя из заданного цвета начального пиксела. Но скорость,сам понимаешь, будет невысокой..
Номер ответа: 35
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #35
Добавлено: 19.03.09 19:48
Есть алго создающий комбайнрегион по указанному цвету битмапа.
Не сверхбыстрый конечно, на апи и вб6.
По комбайнрегиону можно былобы солидбрашем.
Господа автор явно и не расчитывает на настоящую прозрачность 32х бит.
Номер ответа: 36
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #36
Добавлено: 19.03.09 20:23
http://www.codeproject.com/KB/GDI-plus/floodfillincsharp.aspx
Номер ответа: 37
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #37
Добавлено: 19.03.09 21:54
Медитируем на http://www.codeproject.com/KB/GDI-plus/QuickFillNET.aspx
"к примеру волной" не покатит потому что получите переполнение стека на картинке, которая больше чем ноготь.
Номер ответа: 38
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #38
Добавлено: 19.03.09 22:10
я так понимаю из-за рекурсии? а реализация циклом возможно слишком много воды будет переливать.
Номер ответа: 39
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #39
Добавлено: 19.03.09 22:43
Да, из-за рекурсии.
По указанной ссылке можно рассмотреть пример решения данной задачи.
Номер ответа: 40
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #40
Добавлено: 19.03.09 22:58
Медитируем на http://www.codeproject.com/KB/GDI-plus/QuickFillNET.aspx
ты видимо пошутил?
Во первых он осилит код на С++, а во вторых, если я ничего не путаю, VB не поодерживает указатели
Номер ответа: 41
Автор ответа:
diplay
Вопросов: 4
Ответов: 69
Профиль | | #41
Добавлено: 21.03.09 22:26
я пробовал сделать рекурсивную заливку своими руками, но чё-то перемудрил и ничего толкового не вышло, да еще и тормозило ппц. В общем, спасибо всем за советы, но я все-таки остановлюсь на своем варианте - хоть и неправильно с точки зрения таких крутых программистов, как вы, но зато дает желаемый результат.
PS
Я как раз на днях начал потихоньку учить С++. Скачал книгу С++ для чайников и читаю на досуге. Автор все пишет предельно просто, так что даже мозг включать не приходится - читаешь как худежественную литературу. Когда добью, прочитаю что-нибудь по-серьезней.
Номер ответа: 42
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #42
Добавлено: 22.03.09 00:20
diplay, да, С++ штука еще та, затягивает сильно.
У меня знакомый на С++ так подсел что от дотнета даже отказался, уже не верю что он когда-нибудь вернется на .NET
Номер ответа: 43
Автор ответа:
diplay
Вопросов: 4
Ответов: 69
Профиль | | #43
Добавлено: 22.03.09 14:05
я от дотнета не откажусь. Как-никак я ведь с него начинал еще когда учился во втором классе, так что он мне как родной.
Номер ответа: 44
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #44
Добавлено: 22.03.09 23:29
diplay, а что тебя уже в третий класс перевели? o_O
Номер ответа: 45
Автор ответа:
diplay
Вопросов: 4
Ответов: 69
Профиль | | #45
Добавлено: 24.03.09 19:01
нет, в девятый)