· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› HRGN

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Дек 25, 2003 14:54:41

Функции
CreatePolyPolygonRgn
CreatePolygonRgn
Строят HRGN по точкам (грубо) можно ли получить этот HRGN из монохроматической картинки программно


Дата: Дек 25, 2003 17:49:02

По моему придется самому сканировать картинку и описывать её как множество прямоугольников, а потом вызвать функцию ExtCreateRegion:
rgn dd 32,0,n,0
    dd 0,0,0,0
rect1 dd ?,?,?,?
....
rectn dd ?,?,?,?   

invoke ExtCreateRegion,0,32+n*16,rgn

В win9x сделать регион из более чем 4094 прямоугольников не получится(так написано в MSDN).


Дата: Дек 27, 2003 13:39:24

Пожалуйсто можно ли по подробней про
ExtCreateRegion
И про первую и третью структуры (XFORM и RGNDATA).


Дата: Дек 27, 2003 14:32:46 · Поправил: Black_mirror

_evil
Насколько я понял первая структура описывает преобразование для региона(поворот, перенос и сжатие). А вот RGNDATA содержит заголовок и следом за ним N прямоугольников описывающих регион(только почему они описаны как char[1]?!). В заголовке присутствует его длина(32 байта), тип региона(пока может быть только RDH_RECTANGLES), количество прямоугольников в регионе, размер памяти для региона N*sizeof(RECT) (возможно еще нужно длину заголовка прибавить), и прямоугольник ограничивающий регион(похоже что он игнорируется). Точка считается принадлежащей региону если она попадает хотя бы в один из прямоугольников.
Самый простой метод получения региона из картинки это пройтись по всем строкам и каждую группу подряд идущих пикселей входящих в регион описать отдельным прямоугольником. Прямоугольники записать в массив, не забыв поместить перед ним заголовок. А затем вызвать ExtCreateRgn.


Дата: Дек 27, 2003 15:34:09

_evil
Программно можно, но это подразумевает вручную. Ты сам должен написать алгоритм сканирования. Я видел где-то готовое решение со сканированием контура картинки, но уже не припоминаю где именно.

Black_mirror
А почему именно из прямоугольников? Ведь можно построить его по заданным точкам (т.е. в виде произвольного многоугольника).


Дата: Дек 27, 2003 16:29:09

Toxic
Тяжело будет картинку превратить во множество полигонов. С прямоугольниками как-то проще.


Дата: Дек 27, 2003 17:13:19

Black_mirror
Да нет, я не это имел в виду. Картику можно превратить в один полигон, задав сразу все его вершины. Задача сканирования как раз и заключается в нахождении всех вершин полигона.
Представь, что тебе надо нарисовать пятиконечную звезду. С помощью CreatePolygonRgn, задав ей 10 точек(вершин), ты решаешь поставленную задачу. А как такое сделать через прямоугольники?


Дата: Дек 28, 2003 03:18:26 · Поправил: Black_mirror

Toxic
Если я точно знаю, что окошко представляет из себя пятиконечную звезду, то конечно я воспользуюсь функцией CreatePolygonRgn. Ну а если это кусок сыра с дырками, а рядом с ним несколько крошек, то как его превратить в ОДИН полигон?


Дата: Дек 28, 2003 03:58:31

Black_mirror
то как его превратить в ОДИН полигон?
В один - никак. Я имел в виду одну(замкнутую) фигуру.

Ну а если это кусок сыра с дырками, а рядом с ним несколько крошек
Ну, такое окно - это изврат, но и оно имеет право на существование.
Значит, ты предлагаешь сканировать каждую строку и добавлять каждый найденный в ней сегмент черного цвета как прямоугольник? Но тогда как быть с ограничением в 4094? У меня сейчас под рукой описание API от 1997 года, так там ничего не сказано про ограничения. Завтра посмотрю в MSDN.
Разве нельзя полученный из 4094 прямоугольников hRgn скомбинировать с другим таким же, используя CombineRgn? Тогда задача решается 'на ура'.


Дата: Дек 28, 2003 09:07:25

Toxic
В win9x ограничение на размер структуры RGNDATA для функции ExtCreateRgn 64К. А 4094 я получил вычтя размер заголовка и поделив на 16(sizeof(RECT)). А с ограничением я предлагаю бороться используя win2000. А для win9x можно порекомендовать только объединять при сканировании одинаковые по длине и расположению отрезки в соседних строках в один прямоугольник.


Дата: Дек 29, 2003 01:41:08

Black_mirror
А с ограничением я предлагаю бороться используя win2000
Да... Так бы можно было много проблем решить. Но беда в том, что на свете много тупаков, которые, имея достаточные вычислительные ресурсы, все равно сидят под Win98, говоря, что "она надежнее" (!!! =8-0 !!!).


Дата: Дек 29, 2003 02:45:55

Я попиксельно сканировал картинку и присоединял нужный регион (1х1 пиксель) к общему региону. Получается долго, но в 9х работало. Вообще-то, я пришел к выводу, что быстрее будет попиксельно удалять части региона.


Дата: Дек 29, 2003 03:53:12

Sk. Inc.
быстрее будет попиксельно удалять части региона
Все зависит от соотношения количества черного к белому.


Дата: Дек 29, 2003 06:20:00

Toxic
Как правило, нужной части картинки больше, чем ненужной. Иначе бы размер окна был меньше :)

У меня где-то пример был для VB6, где обрабатывается картинка и регион создается по прямоугольникам, высотой в 1 пиксель. Если надо, могу поискать.


Дата: Дек 29, 2003 06:32:48

Sk. Inc.
Спасибо, мне не нужно. Но думаю товарищ _evil будет тебе признателен за аттач.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.088