Функция _WinAPI_CombineRgn

 ↑  ←  Описание функции


_WinAPI_CombineRgn

Объединение двух областей и сохранение результата в третьей области

#include <WinAPI.au3>
_WinAPI_CombineRgn($hRgnDest, $hRgnSrc1, $hRgnSrc2, $iCombineMode)

Параметры

$hRgnDest Дескриптор новой области с размерами соответствующие двум объединяемым областям. (Эта область должна существовать до вызова CombineRgn.)
$hRgnSrc1 Дескриптор первой области.
$hRgnSrc2 Дескриптор второй области.
$iCombineMode Указывает способ объединения двух областей. Этот параметр может быть одним из следующих значений.
    $RGN_AND - Создаёт только область пересечения.
    $RGN_COPY - Создаёт копию области определяемой первой областью.
    $RGN_DIFF - Вторая область является исключающей для первой области.
    $RGN_OR - Создаёт область не исключая ничего.
    $RGN_XOR - Создаёт область из двух областей, в которых исключается область пересечения.

Возвращаемое значение

Успех:Возвращает тип результирующей области. Это может быть одно из следующих значений.
$NULLREGION - Область пуста.
$SIMPLEREGION - Область в виде одиночного прямоугольника.
$COMPLEXREGION - Область более одного прямоугольника.
Ошибка:Возвращает 0 - Не создано ни одной области.

Примечания

Две области объединяются в соответствии с указанным режимом.
Три области не обязательно различны. Например параметр hrgnSrc1 может быть равен параметру hrgnDest.

См. также

_WinAPI_CreateRectRgn, _WinAPI_CreateRoundRectRgn, _WinAPI_SetWindowRgn, _WinAPI_GetWindowRgn

См. также

Искать CombineRgn в библиотеке MSDN

Пример

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

; Возвращает высоту заголовка и толщину рамки окна, которые могут быть различными, когда тема XP включена или выключена (ON/OFF)
Global $htit = _WinAPI_GetSystemMetrics($SM_CYCAPTION)
Global $frame = _WinAPI_GetSystemMetrics($SM_CXDLGFRAME)

Local $gui = GUICreate("Тест окна с областями", 350, 210)
Local $btn_default = GUICtrlCreateButton("По умолчанию", 100, 30, 150)
Local $btn_round = GUICtrlCreateButton("Скруглённые края", 100, 60, 150)
Local $btn_buble = GUICtrlCreateButton("Пузырьковый вид ", 100, 90, 150)
Local $btn_transparent = GUICtrlCreateButton("Прозрачная область", 100, 120, 150)
Local $btn_exit = GUICtrlCreateButton("Выход", 100, 150, 150)
GUISetState(@SW_SHOW)

Local $pos = WinGetPos($gui) ; Возвращает размер окна (Не размер клиентской области, которая указывается в GUICreate)
Global $width = $pos[2]
Global $height = $pos[3]

Local $rgn, $rgn1, $rgn2
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $btn_exit
            ExitLoop

        Case $btn_default
            $rgn = _WinAPI_CreateRectRgn(0, 0, $width, $height)
            _WinAPI_SetWindowRgn($gui, $rgn)

        Case $btn_round
            $rgn = _WinAPI_CreateRoundRectRgn(0, 0, $width, $height, $width / 3, $height / 3)
            _WinAPI_SetWindowRgn($gui, $rgn)

        Case $btn_buble
            $rgn1 = _WinAPI_CreateRoundRectRgn(0, 0, $width / 2, $height / 2, $width / 2, $height / 2) ; левый-верхний
            $rgn2 = _WinAPI_CreateRoundRectRgn($width / 2, 0, $width, $height / 2, $width / 2, $height / 2) ; правый-верхний
            _WinAPI_CombineRgn($rgn1, $rgn1, $rgn2, $RGN_OR)
            _WinAPI_DeleteObject($rgn2)
            $rgn2 = _WinAPI_CreateRoundRectRgn(0, $height / 2, $width / 2, $height, $width / 2, $height / 2) ; левый-нижний
            _WinAPI_CombineRgn($rgn1, $rgn1, $rgn2, $RGN_OR)
            _WinAPI_DeleteObject($rgn2)
            $rgn2 = _WinAPI_CreateRoundRectRgn($width / 2, $height / 2, $width, $height, $width / 2, $height / 2) ; правый-нижний
            _WinAPI_CombineRgn($rgn1, $rgn1, $rgn2, $RGN_OR)
            _WinAPI_DeleteObject($rgn2)
            $rgn2 = _WinAPI_CreateRoundRectRgn(10, 10, $width - 10, $height - 10, $width, $height) ; середина
            _WinAPI_CombineRgn($rgn1, $rgn1, $rgn2, $RGN_OR)
            _WinAPI_DeleteObject($rgn2)
            _WinAPI_SetWindowRgn($gui, $rgn1)

        Case $btn_transparent
            _GuiHole($gui, 40, 40, 260, 170)

    EndSwitch
WEnd

; делает внутренние области прозрачными, но добавив элементы управления
Func _GuiHole($h_win, $i_x, $i_y, $i_sizew, $i_sizeh)
    Local $outer_rgn, $inner_rgn, $combined_rgn

    $outer_rgn = _WinAPI_CreateRectRgn(0, 0, $width, $height)
    $inner_rgn = _WinAPI_CreateRectRgn($i_x, $i_y, $i_x + $i_sizew, $i_y + $i_sizeh)
    $combined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    _WinAPI_CombineRgn($combined_rgn, $outer_rgn, $inner_rgn, $RGN_DIFF)
    _WinAPI_DeleteObject($outer_rgn)
    _WinAPI_DeleteObject($inner_rgn)
    _AddCtrlRegion($combined_rgn, $btn_default)
    _AddCtrlRegion($combined_rgn, $btn_round)
    _AddCtrlRegion($combined_rgn, $btn_buble)
    _AddCtrlRegion($combined_rgn, $btn_transparent)
    _AddCtrlRegion($combined_rgn, $btn_exit)
    _WinAPI_SetWindowRgn($h_win, $combined_rgn)
EndFunc   ;==>_GuiHole

; Добавляет области элементов управления для указанного региона
; Также учитывая размеры заголовков и рамки окна
Func _AddCtrlRegion($full_rgn, $ctrl_id)
    Local $ctrl_pos, $ctrl_rgn

    $ctrl_pos = ControlGetPos($gui, "", $ctrl_id)
    $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0] + $frame, $ctrl_pos[1] + $htit + $frame, _
            $ctrl_pos[0] + $ctrl_pos[2] + $frame, $ctrl_pos[1] + $ctrl_pos[3] + $htit + $frame)
    _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
    _WinAPI_DeleteObject($ctrl_rgn)
EndFunc   ;==>_AddCtrlRegion