Функция _WinAPI_SetWindowRgn

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


_WinAPI_SetWindowRgn

Устанавливает область окну

#include <WinAPI.au3>
_WinAPI_SetWindowRgn($hWnd, $hRgn [, $bRedraw])

Параметры

$hWnd Дескриптор окна, которому устанавливается область.
$hRgn Дескриптор области, которая устанавливается окну.
$bRedraw [необязательный] Определяет, будет ли система перерисовывать окно после установки области.

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

Успех:Возвращает значение не равное нулю
Ошибка:Возвращает 0

Примечания

Область задаёт участок, где система позволяет рисовать.
Система не отображает какие либо части окна, которые лежат вне установленной области.
При вызове этой функции, система высылает сообщения WM_WINDOWPOSCHANGING и WM_WINDOWPOSCHANGED в окно.
Координаты области задаются относительно левого верхнего угла не клиентской области окна.
После успешного вызова SetWindowRgn, система владеет областью определяемую дескриптором области hRgn.
Система не делает копию области. Таким образом, вы не должны делать дальнейшие вызовы функции с этим дескриптором области.
В частности не удаляйте дескриптор этой области. Система удаляет дескриптор области, когда он больше не нужен.

См. также

_WinAPI_CreateRectRgn, _WinAPI_CreateRoundRectRgn, _WinAPI_CombineRgn, _WinAPI_GetWindowRgn

См. также

Искать SetWindowRgn в библиотеке 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