Что нового

[Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPARENT

urrya

Новичок
Сообщения
159
Репутация
1
Доброго времени гос-да программисты.
Снова задачка, никак не получается создать окно GUI
без рамки но с тенью вокруг :stars:

есть кусочек кода с нужным окном -
Код:
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>

HotKeySet("+{Esc}", "_Exit")

Global $Form1 = GUICreate("GS", 440, 210, -1, -1, BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPARENT)
GUISetState(@SW_SHOW,$Form1)

While 1
WEnd

Func _Exit()
	Exit
EndFunc


помогите пожалуйста "приклеить" тень вокруг такого окна.

:scratch:
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

up

Похоже никто не знает как это сделать,
или просто Autoit этого не умеет.
Печально.
:'(
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

Поищите на форуме, примеров было много. Если кратко, то создаете PNG в виде тени, вставляетет его во второе окно, которое перемещаете синхронно с основным.


Добавлено:
Сообщение автоматически объединено:

Код:
#Include <APIConstants.au3>
#Include <GDIPlus.au3>
#Include <WinAPIEx.au3>

$hShadow = GUICreate('', 430 + 28, 200 + 28, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
$hForm = GUICreate('', 440, 210, -1, -1, $WS_POPUP, $WS_EX_CONTROLPARENT, $hShadow)

_GDIPlus_Startup()
_WinAPI_UpdateLayeredWindowEx($hShadow, -1, -1, _CreateDropShadow(430, 200, 14, 0x80000000), 255, 1)
_GDIPlus_Shutdown()

WM_MOVE($hForm, $WM_MOVE, 0, 0)

GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
GUISetState(@SW_SHOW, $hShadow)
GUISetState(@SW_SHOW, $hForm)

Do
Until GUIGetMsg() = -3

Func _CreateDropShadow($iWidth, $iHeight, $iRadius, $iARGB = 0)

    Local $hGraphic, $hBrush, $hImage, $hBitmap
    Local $aPart[4][5] = _
           [[$iRadius, 0, $iWidth, $iRadius, -90], _
            [$iWidth + $iRadius, $iRadius, $iRadius, $iHeight, 0], _
            [$iRadius, $iHeight + $iRadius, $iWidth, $iRadius, 90], _
            [0, $iRadius, $iRadius, $iHeight, 180]]

    $hImage = _GDIPlus_BitmapCreateFromScan0($iWidth + 2 * $iRadius, $iHeight + 2 * $iRadius)
    If Not $hImage Then
        Return 0
    EndIf
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
    _GDIPlus_GraphicsClear($hGraphic, 0)
    $hBrush = _GDIPlus_BrushCreateSolid($iARGB)
    _GDIPlus_GraphicsFillRect($hGraphic, $iRadius, $iRadius, $iWidth, $iHeight, $hBrush)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDrawRadialGradient($hGraphic, $iRadius, $iRadius, $iRadius, $iARGB, BitAND($iARGB, 0x00FFFFFF), -180, -90)
    _GDIPlus_GraphicsDrawRadialGradient($hGraphic, $iWidth + $iRadius, $iRadius, $iRadius, $iARGB, BitAND($iARGB, 0x00FFFFFF), -90, 0)
    _GDIPlus_GraphicsDrawRadialGradient($hGraphic, $iWidth + $iRadius, $iHeight + $iRadius, $iRadius, $iARGB, BitAND($iARGB, 0x00FFFFFF), 0, 90)
    _GDIPlus_GraphicsDrawRadialGradient($hGraphic,  $iRadius, $iHeight + $iRadius, $iRadius, $iARGB, BitAND($iARGB, 0x00FFFFFF), 90, 180)
    For $i = 0 To 3
        $tRect = DllStructCreate($tagGDIPRECTF)
        For $j = 0 To 4
            DllStructSetData($tRect, $j + 1, $aPart[$i][$j])
        Next
        $hBrush = _GDIPlus_LineBrushCreateFromRectWithAngle($tRect, $iARGB, BitAND($iARGB, 0x00FFFFFF), $aPart[$i][4], 0, 3)
        _GDIPlus_GraphicsFillRect($hGraphic, $aPart[$i][0], $aPart[$i][1], $aPart[$i][2], $aPart[$i][3], $hBrush)
        _GDIPlus_BrushDispose($hBrush)
    Next
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage)
    Return $hBitmap
EndFunc   ;==>_CreateDropShadow

Func _GDIPlus_GraphicsDrawRadialGradient($hGraphics, $iX, $iY, $iRadius, $iARGB1, $iARGB2, $iStartAngle = 0, $iEndAngle = 360, $iStep = 5)

    If $iStep < 1 Then
        $iStep = 1
    EndIf

    Local $Xi = $iX - $iRadius, $Yi = $iY - $iRadius, $Di = 2 * $iRadius
    Local $hBrush, $hMatrix, $Smooth = _GDIPlus_GraphicsGetSmoothingMode($hGraphics)
    Local $Start = True

    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 0)
    $hBrush = _GDIPlus_LineBrushCreate(0, 0, $iRadius, 0, $iARGB1, $iARGB2, 3)
    $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, $iX, $iY)
    While $iStartAngle < $iEndAngle
        If $iStartAngle + $iStep > $iEndAngle Then
            $iStep = $iEndAngle - $iStartAngle
        EndIf
        If $Start Then
            _GDIPlus_MatrixRotate($hMatrix, $iStartAngle + $iStep / 2)
            $Start = False
        Else
            _GDIPlus_MatrixRotate($hMatrix, $iStep)
        EndIf
        _GDIPlus_LineBrushSetTransform($hBrush, $hMatrix)
        _GDIPlus_GraphicsFillPie($hGraphics, $Xi, $Yi, $Di, $Di, $iStartAngle, $iStep, $hBrush)
        $iStartAngle += $iStep
    WEnd
    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, $Smooth)
    _GDIPlus_MatrixDispose($hMatrix)
    _GDIPlus_BrushDispose($hBrush)
    Return 1
EndFunc   ;==>_GDIPlus_GraphicsDrawRadialGradient

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Local $Pos = WinGetPos($hForm)
			If Not @Error Then
				WinMove($hShadow, '', $Pos[0] - 8, $Pos[1] - 8)
			EndIf
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

Можно еще так попробывать:
Код:
#Include <WinAPISys.au3>
#Include <WindowsConstants.au3>

HotKeySet("{Esc}", "_Exit")

Global $Form1 = GUICreate("GS", 440, 210, -1, -1, BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPARENT)
_GuiSetDropShadow($Form1)
GUISetState(@SW_SHOW, $Form1)

While 1
WEnd

Func _Exit()
	Exit
EndFunc

Func _GuiSetDropShadow($hWnd, $iTurnOnDropshadow = 1)
	If Not IsHWnd($hWnd) Or WinGetProcess($hWnd) <> @AutoItPID Then Return SetError(1, 0, 0)
	Local $aRes, $OldStyle
	$aRes = DllCall("user32.dll", "int", "SystemParametersInfo", "int", 0x1024, "int", 0, "int*", 0, "int", 0) ;$SPI_GETDROPSHADOW
	If @Error Or Not IsArray($aRes) Then Return SetError(2, 0, 0)
	If Not $aRes[3] Then ;if 'Show shadows under menus' option not set, try activating it.
		If $iTurnOnDropshadow Then ;turn on drop shadows
			$aRes = DllCall("user32.dll", "int", "SystemParametersInfo", "int", 0x1025, "int", 0, "int", True, "int", 0) ;$SPI_SETDROPSHADOW
			If @Error Or Not IsArray($aRes) Or (IsArray($aRes) And $aRes[0] <> 1) Then
				Return SetError(3, 0, 0)
			EndIf
		Else
			Return SetError(4, 0, 0)
		EndIf
	EndIf
	$OldStyle = _WinAPI_GetClassLongEx($hWnd, -26) ;$GCL_STYLE
	If @Error Then Return SetError(5, 0, 0)
	If _WinAPI_SetClassLongEx($hWnd, -26, BitOR($OldStyle, 0x00020000)) = $OldStyle Then ;$CS_DROPSHADOW
		Return 1
	Else
		Return SetError(6, 0, 0)
	EndIf
EndFunc
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

Спасибо большое за примеры.
Но вот только не могу даже посмотреть их.

От Yashied ошибка -

WARNING: $GUI_RUNDEFMSG: possibly used before declaration.
Return $GUI_RUNDEFMSG
~~~~~~~~~~~~~~~~~~~~~~~~^

а для примера от asdf8
я просто не могу найти и скачать файл библиотеки <WinAPISys.au3>

:(
 

InnI

AutoIT Гуру
Сообщения
4,612
Репутация
1,298
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

urrya
Вам нужно обновить AutoIt до последней версии 3.3.12.0.
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

InnI сказал(а):
urrya
Вам нужно обновить AutoIt до последней версии 3.3.12.0.

Да, я уже 3 раза откат делал с последней версии, так как все версии после 3.3.8.1 выдают некоторые ошибки в моём коде. :(

Хотя сейчас попробую ещё разок, может быть уже исправили.
 

InnI

AutoIT Гуру
Сообщения
4,612
Репутация
1,298
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

urrya
может быть уже исправили
И не надейтесь :smile:

А тень, про которую вы говорите, похоже добавляется окну темой Windows при наличии стиля $WS_THICKFRAME
Код:
Global $Form1 = GUICreate("GS", 440, 210, -1, -1, BitOR($WS_POPUP, $WS_THICKFRAME), $WS_EX_CONTROLPARENT)
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

InnI сказал(а):
urrya
может быть уже исправили
И не надейтесь :smile:

А тень, про которую вы говорите, похоже добавляется окну темой Windows при наличии стиля $WS_THICKFRAME
Код:
Global $Form1 = GUICreate("GS", 440, 210, -1, -1, BitOR($WS_POPUP, $WS_THICKFRAME), $WS_EX_CONTROLPARENT)

СПС !
:beer: :IL_AutoIt_1:


Добавлено:
Сообщение автоматически объединено:

Просто в описании стилей для GUI очень не понятное пояснение к ...

" $WS_THICKFRAME 0x00040000 Создаёт окно с возможностью менять размер. "

При чём тут тень и размер? Где связь? :stars: :smile: ;)
 

InnI

AutoIT Гуру
Сообщения
4,612
Репутация
1,298
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

urrya
При чём тут тень и размер?
Потому, что создав обычное окно $WS_OVERLAPPEDWINDOW, но без стиля $WS_THICKFRAME, вы не сможете изменять его размер, таская за рамку окна
Код:
Global $Form1 = GUICreate("GS", 440, 210, -1, -1, BitXOR($WS_OVERLAPPEDWINDOW, $WS_THICKFRAME))
А тень, как я уже сказал, имеет отношение к визуальной теме Windows и рисуется только при наличии у окна этой рамки (кстати, тень можно отключить в параметрах быстродействия: "Отображать тени, отбрасываемые окнами").
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

urrya [?]
я просто не могу найти и скачать файл библиотеки <WinAPISys.au3>

В AutoIt 3.3.8.1 #Include <WinAPISys.au3> нужно заменить на #Include <WinAPIEx.au3>
WinAPIEx.au3 не входит в стандартную комплектацию, ее нужно искать самому, и, причем, именно для AutoIt 3.3.8.1.


InnI [?]
А тень, про которую вы говорите, похоже добавляется окну темой Windows при наличии стиля $WS_THICKFRAME

У меня не добавляет. Если скрипт только для себя и тема Windows поддерживает тогда, конечно это выход.
 

InnI

AutoIT Гуру
Сообщения
4,612
Репутация
1,298
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

asdf8
У меня не добавляет
Вероятно, у вас выбрана упрощённая тема оформления. Или отключено отображение тени окна.

Если скрипт только для себя
Ну, почему же... Я как раз за то, что если пользователь не хочет видеть тени - зачем ему навязывать?
А если тень не отображается по техническим причинам и вдруг эту красоту показать... разработчик станет виноват в покупке новой видеокарты :smile:
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Re: [Окна, Диалоги] Как совместить $WS_DLGFRAME c BitOR($WS_POPUP, $WS_BORDER), $WS_EX_CONTROLPAREN

InnI [?]
Я как раз за то, что если пользователь не хочет видеть тени - зачем ему навязывать?

В моем примере, если установить параметр $iTurnOnDropshadow = 0,
то в случае отключенных теней пользователь не увидит ни какой тени.
 
Верх