Что нового

Скин для GUI

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Версия Autoit:3

Помогите разобраться,почему скрипт вылетает,в скрипте два окна,при перемещении одного,перемещается и дочернее по темже координатам,иногда происходит что скрипт разлетается во все все стороны...
Код:
#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <UDF\WinAPIEx.au3>
#Include <WindowsConstants.au3>
#include "UDF\GUICtrlOnHover.au3"

Global $CloseClicked 	= False
Global $sImages_Path 	= @ScriptDir & "\Skin"

_GDIPlus_Startup()
$hPng = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\skin\main.png')
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
_GDIPlus_BitmapDispose($hPng)
_GDIPlus_ShutDown()

$hTrans = GUICreate('', 607, 376, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
$hForm = GUICreate('', 600, 370, -1, -1, $WS_POPUP, $WS_EX_LAYERED, $hTrans)
$Trans = GUICtrlCreateLabel("", 0, 0, 600, 370)
GUICtrlSetBkColor(-1, 0xFF00DC)
_WinAPI_SetLayeredWindowAttributes($hForm, 0xFF00DC)
GUICtrlSetState($Trans, $GUI_DISABLE)

$hNew = GUICtrlCreatePic(@ScriptDir & "\skin\new.gif",560,0,39,38)
GUICtrlSetState($hNew, $GUI_DISABLE)


$hMenu = GUICtrlCreatePic(@ScriptDir & "\skin\menu.gif",55,300,490,50)
GUICtrlSetState($hMenu, $GUI_DISABLE)
$examle = GUICtrlCreatePic($sImages_Path & "\but0.gif",434,314,98,23)
GUICtrlSetCursor ($examle, 0)
_GUICtrl_OnHoverRegister(-1, "_Hover_Proc", "_Leave_Hover_Proc", "PrimaryDown_Proc", "PrimaryUp_Proc")

GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
_WinAPI_UpdateLayeredWindowEx($hTrans, -1, -1, $hBitmap, 200)
_WinAPI_SetLayeredWindowAttributes($hForm, 0xFF00DC, 255)
GUISetState(@SW_SHOW, $hTrans)
GUISetState(@SW_SHOW, $hForm)

While 1
    $msg = GUIGetMsg() 
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	If $CloseClicked Then
		$CloseClicked = False
		MsgBox(64, ":)", "Пока...!")
		Exit
	EndIf
Wend	

Func _Hover_Proc($iCtrlID)
	Switch $iCtrlID
		Case $examle
			GUICtrlSetImage($iCtrlID, $sImages_Path & "\but1.gif")
	EndSwitch
EndFunc

Func _Leave_Hover_Proc($iCtrlID)
	Switch $iCtrlID
		Case $examle
			GUICtrlSetImage($iCtrlID, $sImages_Path & "\but0.gif")
	EndSwitch
EndFunc

Func PrimaryDown_Proc($iCtrlID)
	Switch $iCtrlID
		Case $examle
			GUICtrlSetImage($iCtrlID, $sImages_Path & "\but2.gif")		
			;$PlayIsClicked = True
	EndSwitch
EndFunc

Func PrimaryUp_Proc($iCtrlID)
	Switch $iCtrlID
		Case $examle
			GUICtrlSetImage($iCtrlID, $sImages_Path & "\but1.gif")
			$CloseClicked = True
	EndSwitch
EndFunc

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hTrans

            Local $Pos = WinGetPos($hTrans)

            If IsArray($Pos) Then
                WinMove($hForm, '', $Pos[0]+5, $Pos[1]+4)
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    Switch $hWnd
        Case $hTrans
            Switch $iMsg
                Case $WM_NCHITTEST
                    Return $HTCAPTION
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST


Для того чтоб было более понятно,вот ссылка на архив с примером:http://narod.ru/disk/8178930001/GUISkin.rar.html
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Sergey2210 сказал(а):
...иногда происходит что скрипт разлетается во все все стороны...

Как это? У меня все нормально работает.
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Я же говорю - иногда,Первое окно которое прозрачное с фоновой картинкой улетает в верхний левый угол монитора,кнопка улетает в нижний правый,картинка типо меню улетает в левый нижний угол,а не может быть это из-за того что вот здесь:
Код:
Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hTrans

            Local $Pos = WinGetPos($hTrans)

            If IsArray($Pos) Then
                WinMove($hForm, '', $Pos[0]+5, $Pos[1]+4)
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE


Я убрал 5 и 4 оставил вот так:
Код:
If IsArray($Pos) Then
                WinMove($hForm, '', $Pos[0], $Pos[1])
             EndIf


а окна и Label я подогнал под один размер?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Sergey2210
Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Как правильно называть темы

"Скин для GUI " - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Администратор форума.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А если не использовать GUICtrlOnHover.au3, тоже "разлетается"? Я не вижу никаких причин для такого поведения GUI.

Попробуй так:

Код:
#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <UDF\WinAPIEx.au3>
#Include <WindowsConstants.au3>
#include "UDF\GUICtrlOnHover.au3"

Global $CloseClicked 	= False
Global $sImages_Path 	= @ScriptDir & "\Skin"

_GDIPlus_Startup()
$hPng = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\skin\main.png')
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
_GDIPlus_BitmapDispose($hPng)
_GDIPlus_ShutDown()

$hTrans = GUICreate('', 607, 376, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
$hForm = GUICreate('', 600, 370, -1, -1, $WS_POPUP, $WS_EX_LAYERED, $hTrans)
GUISetBkColor(0xFF00DC)
$hNew = GUICtrlCreatePic(@ScriptDir & "\skin\new.gif",560,0,39,38)
GUICtrlSetState($hNew, $GUI_DISABLE)
$hMenu = GUICtrlCreatePic(@ScriptDir & "\skin\menu.gif",55,300,490,50)
GUICtrlSetState($hMenu, $GUI_DISABLE)
$examle = GUICtrlCreatePic($sImages_Path & "\but0.gif",434,314,98,23)
GUICtrlSetCursor ($examle, 0)
_GUICtrl_OnHoverRegister(-1, "_Hover_Proc", "_Leave_Hover_Proc", "PrimaryDown_Proc", "PrimaryUp_Proc")
_WinAPI_UpdateLayeredWindowEx($hTrans, -1, -1, $hBitmap, 200)
_WinAPI_SetLayeredWindowAttributes($hForm, 0xFF00DC)

GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
GUISetState(@SW_SHOW, $hTrans)
GUISetState(@SW_SHOW, $hForm)

While 1
    $msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	If $CloseClicked Then
		$CloseClicked = False
		MsgBox(64, ":)", "Пока...!")
		Exit
	EndIf
Wend

Func _Hover_Proc($iCtrlID)
	Switch $iCtrlID
		Case $examle
			GUICtrlSetImage($iCtrlID, $sImages_Path & "\but1.gif")
	EndSwitch
EndFunc

Func _Leave_Hover_Proc($iCtrlID)
	Switch $iCtrlID
		Case $examle
			GUICtrlSetImage($iCtrlID, $sImages_Path & "\but0.gif")
	EndSwitch
EndFunc

Func PrimaryDown_Proc($iCtrlID)
	Switch $iCtrlID
		Case $examle
			GUICtrlSetImage($iCtrlID, $sImages_Path & "\but2.gif")
			;$PlayIsClicked = True
	EndSwitch
EndFunc

Func PrimaryUp_Proc($iCtrlID)
	Switch $iCtrlID
		Case $examle
			GUICtrlSetImage($iCtrlID, $sImages_Path & "\but1.gif")
			$CloseClicked = True
	EndSwitch
EndFunc

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hTrans

            Local $Pos = WinGetPos($hTrans)

            If IsArray($Pos) Then
                WinMove($hForm, '', $Pos[0]+5, $Pos[1]+4)
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    Switch $hWnd
        Case $hTrans
            Switch $iMsg
                Case $WM_NCHITTEST
                    Return $HTCAPTION
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
 
Верх