Declare Function CreatePolyPolygonRgn Lib "gdi32" (lpPoint As POINTAPI, _ lpPolyCounts As Long, _ ByVal nCount As Long, _ ByVal nPolyFillMode As Long) As Long
CreatePolyPolygonRgn создает область, состоящую из множества многоугольников. Вершины всех многоугольников передаются функции через массив lpPoint. Другой массив определяет, сколько точек в пределах того массива принадлежат каждому многоугольнику. Отдельные многоугольники никак не присоединяются, формируя область множественных несвязанных многоугольных областей. Обратите внимание, что заполняющийся режим для мультимногоугольной области(региона) должен быть определен явно.
В успешном случае функция возвращает описатель созданного региона или 0 в случае ошибки(используйте GetLastError для получения кода ошибки).
' Инвертируем точки, находящиеся в пределах мультимногоугольной области на окне Form1 ' Область составлена из треугольника и ромба ' Треугольник имеет вершину (25,25), (50,50), ' (25,50). Ромб имеет вершину (150,150), (200,200), (150,250) и (100,200) Dim vertex(0 To 6) As POINTAPI ' содержит вершины каждого многоугольника Dim numvertices(0 To 1) As Long ' сколько вершин принадлежат каждому многоугольнику Dim hrgn As Long ' дескриптор к мультимногоугольной области Dim retval As Long ' возвращаемое значение ' Загрузим вершины треугольника в массив вершин vertex(0).x = 25: vertex(0).y = 25 vertex(1).x = 50: vertex(1).y = 50 vertex(2).x = 25: vertex(2).y = 50 numvertices(0) = 3 ' три вершины для треугольника ' Загрузим вершины ромба в массив вершин vertex(3).x = 150: vertex(3).y = 150 vertex(4).x = 200: vertex(4).y = 200 vertex(5).x = 150: vertex(5).y = 250 vertex(6).x = 100: vertex(6).y = 200 numvertices(1) = 4 ' четыре вершины для ромба ' Создаем мультимногоугольную область и получаем дескриптор hrgn = CreatePolyPolygonRgn(vertex(0), numvertices(0), 2, ALTERNATE) ' Инвертируем пикселы в пределах этой области на Form1 retval = InvertRgn(Form1.hDC, hrgn) ' Удаляем регион для освобождения ресурсов retval = DeleteObject(hrgn)