Viktor1703
AutoIT Гуру
- Сообщения
- 1,535
- Репутация
- 413
Сделал я значит POPUP окно, в ручную обрабатываю сообщения чтобы можно было тащить за края окна и тем самым изменять его размеры, подключил в скрипт DSEngine.dll для воспроизведения видео, когда начинаю изменять размеры окна, то оно сильно мигает, если применяю стиль к окну $WS_EX_COMPOSITED, то мигания пропадают и появляются следующие проблемы, видео всегда поверх всех окон, как будто оно не прикреплено к моему, если перетащить окно в самый низ раб. стола, то на панели где кнопка пуск появляется кадр с этого ролика.. уже не знаю что и придумать, все стили перепробовал, пробовал и _WinAPI_RedrawWindow() и _WinAPI_SetWindowPos(), не помогло, посоветуйте как быть?
Код:
Архив: DSEngine + Source code
Добавлено:
Всё, сам додумал кому интересно...
Код:
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <APIConstants.au3>
#include <WinAPIEx.au3>
#include <Misc.au3>
#Include <DSEngine.au3>
$sFile = FileOpenDialog('Select Video File', @ScriptDir, 'Video Files (*.avi;*.mpg;*.wmv;*.mov;*.3gp;*.asf;*.mp4;*.flv;*.rv)')
If Not $sFile Then
Exit
EndIf
If @OSArch == 'X86' Then
Engine_Startup(@ScriptDir & '\DSEngine_UDF.dll')
ElseIf @OSArch == 'X64' Then
Engine_Startup(@ScriptDir & '\DSEngine_UDF_x64.dll')
Else
Exit
EndIf
$hForm = GUICreate('', 500, 350, -1, -1, $WS_POPUP, $WS_EX_COMPOSITED)
GUISetBkColor(0x151515)
Engine_LoadFile($sFile, $hForm)
Engine_SetRects(0, 0, 0, 0, 0, 0, 500, 350)
GUIRegisterMsg($WM_MOUSEMOVE, 'WndProc')
GUIRegisterMsg($WM_LBUTTONDBLCLK, 'WndProc')
GUIRegisterMsg($WM_LBUTTONDOWN, 'WndProc')
GUISetState()
Engine_SetWindow($hForm)
Engine_StartPlayback()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
Wend
Func SizeWindow($iLeft, $iTop, $iWidth, $iHeight)
Engine_SetRects(0, 0, 0, 0, 0, 0, $iWidth, $iHeight)
EndFunc
Func WndProc($hWnd, $iMsg, $wParam, $lParam)
Local Static $iBorder = 0
Switch $hWnd
Case $hForm
Switch $iMsg
Case $WM_MOUSEMOVE
$iBorder = IsOverBorder($hWnd, 5)
Case $WM_LBUTTONDOWN
If ($iBorder <> 0) Then
ResizeBorder($hWnd, $iBorder, 'SizeWindow')
Else
_SendMessage($hWnd, $WM_NCLBUTTONDOWN, $HTCAPTION, 0)
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func IsOverBorder($hWnd, $iPixel)
Local $X, $Y, $iPos = WinGetPos($hWnd)
$X = _WinAPI_GetMousePosX(True, $hWnd)
$Y = _WinAPI_GetMousePosY(True, $hWnd)
If (($X >= 0) And ($X <= $iPixel) And ($Y >= $iPixel) And ($Y <= $iPos[3] - ($iPixel * 2))) Then
ResizeCursor(1)
Return 1
ElseIf (($X >= $iPixel) And ($X <= ($iPos[2] - ($iPixel * 2))) And ($Y >= 0) And ($Y <= $iPixel)) Then
ResizeCursor(2)
Return 2
ElseIf (($X >= ($iPos[2] - $iPixel)) And ($X <= $iPos[2]) And ($Y >= $iPixel) And ($Y <= ($iPos[3] - ($iPixel * 2)))) Then
ResizeCursor(3)
Return 3
ElseIf (($X >= $iPixel) And ($X <= ($iPos[2] - ($iPixel * 2))) And ($Y >= ($iPos[3] - $iPixel)) And ($Y <= $iPos[3])) Then
ResizeCursor(4)
Return 4
ElseIf (($X >= 0) And ($X <= $iPixel) And ($Y >= 0) And ($Y <= $iPixel)) Then
ResizeCursor(5)
Return 5
ElseIf (($X >= ($iPos[2] - $iPixel)) And ($X <= $iPos[2]) And ($Y >= 0) And ($Y <= $iPixel)) Then
ResizeCursor(6)
Return 6
ElseIf (($X >= 0) And ($X <= $iPixel) And ($Y >= $iPos[3] - $iPixel) And ($Y <= $iPos[3])) Then
ResizeCursor(7)
Return 7
ElseIf (($X >= ($iPos[2] - $iPixel)) And ($X <= $iPos[2]) And ($Y >= $iPos[3] - $iPixel) And ($Y <= $iPos[3])) Then
ResizeCursor(8)
Return 8
Else
ResizeCursor(0)
Return 0
EndIf
EndFunc
Func ResizeBorder($hWnd, $iType, $sFunc)
Local $sMouse, $dMouse, $iPos
$sMouse = MouseGetPos()
$iPos = WinGetPos($hWnd)
ResizeCursor($iType)
While _IsPressed(1)
$dMouse = MouseGetPos()
Switch $iType
Case 1
WinMove($hWnd, '', $iPos[0] + ($dMouse[0] - $sMouse[0]), $iPos[1], $iPos[2] + ($sMouse[0] - $dMouse[0]), $iPos[3])
Call($sFunc, $iPos[0] + ($dMouse[0] - $sMouse[0]), $iPos[1], $iPos[2] + ($sMouse[0] - $dMouse[0]), $iPos[3])
Case 2
WinMove($hWnd, '', $iPos[0], $iPos[1] + ($dMouse[1] - $sMouse[1]), $iPos[2], $iPos[3] + ($sMouse[1] - $dMouse[1]))
Call($sFunc, $iPos[0], $iPos[1] + ($dMouse[1] - $sMouse[1]), $iPos[2], $iPos[3] + ($sMouse[1] - $dMouse[1]))
Case 3
WinMove($hWnd, '', $iPos[0], $iPos[1], $iPos[2] + ($dMouse[0] - $sMouse[0]), $iPos[3])
Call($sFunc, $iPos[0], $iPos[1], $iPos[2] + ($dMouse[0] - $sMouse[0]), $iPos[3])
Case 4
WinMove($hWnd, '', $iPos[0], $iPos[1], $iPos[2], $iPos[3] + ($dMouse[1] - $sMouse[1]))
Call($sFunc, $iPos[0], $iPos[1], $iPos[2], $iPos[3] + ($dMouse[1] - $sMouse[1]))
Case 5
WinMove($hWnd, '', $iPos[0] + ($dMouse[0] - $sMouse[0]), $iPos[1] + ($dMouse[1] - $sMouse[1]), $iPos[2] + ($sMouse[0] - $dMouse[0]), $iPos[3] + ($sMouse[1] - $dMouse[1]))
Call($sFunc, $iPos[0] + ($dMouse[0] - $sMouse[0]), $iPos[1] + ($dMouse[1] - $sMouse[1]), $iPos[2] + ($sMouse[0] - $dMouse[0]), $iPos[3] + ($sMouse[1] - $dMouse[1]))
Case 6
WinMove($hWnd, '', $iPos[0], $iPos[1] + ($dMouse[1] - $sMouse[1]), $iPos[2] + ($dMouse[0] - $sMouse[0]), $iPos[3] + ($sMouse[1] - $dMouse[1]))
Call($sFunc, $iPos[0], $iPos[1] + ($dMouse[1] - $sMouse[1]), $iPos[2] + ($dMouse[0] - $sMouse[0]), $iPos[3] + ($sMouse[1] - $dMouse[1]))
Case 7
WinMove($hWnd, '', $iPos[0] + ($dMouse[0] - $sMouse[0]), $iPos[1], $iPos[2] + ($sMouse[0] - $dMouse[0]), $iPos[3] + ($dMouse[1] - $sMouse[1]))
Call($sFunc, $iPos[0] + ($dMouse[0] - $sMouse[0]), $iPos[1], $iPos[2] + ($sMouse[0] - $dMouse[0]), $iPos[3] + ($dMouse[1] - $sMouse[1]))
Case 8
WinMove($hWnd, '', $iPos[0], $iPos[1], $iPos[2] + ($dMouse[0] - $sMouse[0]), $iPos[3] + ($dMouse[1] - $sMouse[1]))
Call($sFunc, $iPos[0], $iPos[1], $iPos[2] + ($dMouse[0] - $sMouse[0]), $iPos[3] + ($dMouse[1] - $sMouse[1]))
EndSwitch
WEnd
EndFunc
Func ResizeCursor($iType)
Switch $iType
Case 1, 3
_WinAPI_SetCursor(_WinAPI_LoadCursor(0, 32644))
Case 2, 4
_WinAPI_SetCursor(_WinAPI_LoadCursor(0, 32645))
Case 5, 8
_WinAPI_SetCursor(_WinAPI_LoadCursor(0, 32642))
Case 6, 7
_WinAPI_SetCursor(_WinAPI_LoadCursor(0, 32643))
Case Else
_WinAPI_SetCursor(_WinAPI_LoadCursor(0, 32512))
EndSwitch
EndFunc
Архив: DSEngine + Source code
Добавлено:
Сообщение автоматически объединено:
Всё, сам додумал кому интересно...
Код:
...
GUIRegisterMsg($WM_ERASEBKGND, 'WndProc')
...
Func WndProc($hWnd, $iMsg, $wParam, $lParam)
Local Static $iBorder = 0
Switch $hWnd
Case $hForm
Switch $iMsg
Case $WM_ERASEBKGND
Return 0
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
...