Что нового

изменение кнопки при наведении на нее курсора

saraconor

Новичок
Сообщения
418
Репутация
3
во вложении пример. все нормально работает, но почему-то если щелкнуть по пустому полю интерфейса или перетащить его в другое место, кнопки перестают реагировать на наведение курсора. как это можно поправить?
вот код:
Код:
#include <WindowsConstants.au3>     ;GUI
#include "_GUICreateAlfa.au3"       ;интерфейс с прозрачностью
#include <GuiButton.au3>
#include "NoFocusLines.au3"         ;отключает рамки фокуса в GUI

$1 = _GUICreateAlfa("кнопочки",@ScriptDir&"\1.png")
$2 = GUICtrlCreateButton("",45,22,48,44,$BS_BITMAP)
GUICtrlSetImage(-1,@ScriptDir&"\1.bmp", -1)
$3 = GUICtrlCreateButton("",94,22,48,44,$BS_BITMAP)
GUICtrlSetImage(-1,@ScriptDir&"\2.bmp", -1)

_NoFocusLines_Set($2)   ;убрать фокуса c нопки
_NoFocusLines_Set($3)   ;убрать фокуса c нопки

GUISetState(@SW_SHOW)

while 1
$CurInfo = GUIGetCursorInfo()	;проверка курсора в окне GUI

If IsArray($CurInfo) Then

If $CurInfo[4] = $2 Then
GUICtrlSetImage($2,@ScriptDir&"\3.bmp", -1)
Else
GUICtrlSetImage($2,@ScriptDir&"\1.bmp", -1)
EndIf

If $CurInfo[4] = $3 Then
GUICtrlSetImage($3,@ScriptDir&"\4.bmp", -1)
Else
GUICtrlSetImage($3,@ScriptDir&"\2.bmp", -1)
EndIf
EndIf

Switch GUIGetMsg()
	Case $2
	GUICtrlSetImage($2,@ScriptDir&"\5.bmp", -1)
	sleep(300)
    exit
	Case $3
	GUICtrlSetImage($3,@ScriptDir&"\6.bmp", -1)
	sleep(300)
    exit
EndSwitch

wend
 

Вложения

  • Test.rar
    46 КБ · Просмотры: 21

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
saraconor,
Вы десятки раз в секунду меняете картинки на кнопках.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Да забудьте вы про _GUICreateAlfa.au3 и NoFocusLines.au3. Первый имеет кучу глюков, например, не будет нормально отображаться окно, если попытаться вставить картинку. Второй я вообще не рекомендую использовать, т.к. в некоторых случаях может привести к полной неработоспособности скрипта. Или вас пугают несколько лишних строк в коде? Вот вам пример с использованием Skin UDF:

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

#Include "Skin.au3"

_GDIPlus_Startup()
$hPng = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\1.png')
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
$hParent = GUICreate('', 178, 79, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
_WinAPI_UpdateLayeredWindowEx($hParent, -1, -1, $hBitmap, 255, 1)
_GDIPlus_ImageDispose($hPng)
_GDIPlus_Shutdown()

$hForm = GUICreate('', 160, 61, 12, 12, $WS_POPUP, $WS_EX_MDICHILD, $hParent)
GUICtrlCreatePic(@ScriptDir & '\11.bmp', 0, 0, 160, 61)
GUICtrlSetState(-1, $GUI_DISABLE)
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')

$Button1 = _Skin_AddButton(45 - 15, 22 - 12, 49, 43, _WinAPI_LoadImage(0, '1.bmp', 0, 0, 0, 0x0010), _WinAPI_LoadImage(0, '3.bmp', 0, 0, 0, 0x0010), _WinAPI_LoadImage(0, '5.bmp', 0, 0, 0, 0x0010))
$Button2 = _Skin_AddButton(94 - 15, 22 - 12, 49, 43, _WinAPI_LoadImage(0, '2.bmp', 0, 0, 0, 0x0010), _WinAPI_LoadImage(0, '4.bmp', 0, 0, 0, 0x0010), _WinAPI_LoadImage(0, '6.bmp', 0, 0, 0, 0x0010))

GUISetState(@SW_SHOW, $hParent)
GUISetState(@SW_SHOW, $hForm)

While 1
	_Skin_Helper($hForm)
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			ConsoleWrite('Button1' & @CR)
		Case $Button2
			ConsoleWrite('Button2' & @CR)
	EndSwitch
WEnd

Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			If $skData[0][3] > 0 Then
				Return $GUI_RUNDEFMSG
			EndIf
			Local $Info = GUIGetCursorInfo($hForm)
			If Not @Error Then
				Switch $Info[4]
					Case $Button1, $Button2
						; Nothing
					Case Else
						_SendMessage($hParent, $WM_SYSCOMMAND, 0xF012, 0)
				EndSwitch
			EndIf
		Case $hParent
			Return $HTCAPTION
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
 

Вложения

  • Test.zip
    32.4 КБ · Просмотры: 44
Автор
S

saraconor

Новичок
Сообщения
418
Репутация
3
Ваш пример как обычно волшебен и рвет шаблоны. Спасибо!
а как вы вставили в скипт изображения кнопок? я не вижу путей к файлу
 

Yashied

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

Код:
$Button1 = _Skin_AddButton(45 - 15, 22 - 12, 49, 43, _WinAPI_LoadImage(0, '1.bmp', 0, 0, 0, 0x0010), _WinAPI_LoadImage(0, '3.bmp', 0, 0, 0, 0x0010), _WinAPI_LoadImage(0, '5.bmp', 0, 0, 0, 0x0010))
$Button2 = _Skin_AddButton(94 - 15, 22 - 12, 49, 43, _WinAPI_LoadImage(0, '2.bmp', 0, 0, 0, 0x0010), _WinAPI_LoadImage(0, '4.bmp', 0, 0, 0, 0x0010), _WinAPI_LoadImage(0, '6.bmp', 0, 0, 0, 0x0010))


Просто функция _Skin_AddButton() требует не файлы .bmp, а HBITMAP. Я не стал писать полные пути, предполагается, что файлы изображений с кнопками лежат в одной папке со скриптом.
 
Автор
S

saraconor

Новичок
Сообщения
418
Репутация
3
дело в том что в дальнейшем предполагается запихнуть картинки в exe файл и который при открытии будет распаковывать их во временную папку, и уже от туда использовать в скрипте:
Код:
FileInstall("F:\папка скрипта\2.bmp",@TempDir&"\2.bmp")

но я так понимаю можно и полные пути прописать
Код:
........._WinAPI_LoadImage(0, 'C:\Users\My\Desktop\2.bmp', 0, 0, 0, 0x0010).........
 
Автор
S

saraconor

Новичок
Сообщения
418
Репутация
3
извините за офтоп, но есть ли аналог FileInstall, только чтобы картинка была всегда в exe файле, не распаковываясь в папки?
 

Yashied

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

Полные пути прописывать и нужно, просто мне не хотелось загромождать код. В любом случае, вместо брутального FileInstall() лучше использовать ресурсы. Более подробно можете почитать здесь, а так, вот вам простой пример (функцию _LoadResImage() можете детально не рассматривать, она просто загружает PNG из ресурсов аналогично тому, как _WinAPI_LoadBitmap() загружает BMP):

Код:
#Region Resources
#AutoIt3Wrapper_Res_File_Add=200.bmp, 2, 200
#AutoIt3Wrapper_Res_File_Add=201.bmp, 2, 201
#AutoIt3Wrapper_Res_File_Add=202.bmp, 2, 202
#AutoIt3Wrapper_Res_File_Add=203.bmp, 2, 203
#AutoIt3Wrapper_Res_File_Add=204.bmp, 2, 204
#AutoIt3Wrapper_Res_File_Add=205.bmp, 2, 205
#AutoIt3Wrapper_Res_File_Add=206.bmp, 2, 206
#AutoIt3Wrapper_Res_File_Add=Form.png, PNG, FORM
#EndRegion Resources

#Include <APIConstants.au3>
#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>

#Include "Skin.au3"

_GDIPlus_Startup()
$hPng = _LoadPNG('FORM')
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
$hParent = GUICreate('', 178, 79, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
_WinAPI_UpdateLayeredWindowEx($hParent, -1, -1, $hBitmap, 255, 1)
_GDIPlus_ImageDispose($hPng)
_GDIPlus_Shutdown()

$hForm = GUICreate('', 160, 61, 12, 12, $WS_POPUP, $WS_EX_MDICHILD, $hParent)
GUICtrlCreatePic('', 0, 0, 160, 61)
GUICtrlSendMsg(-1, 0x0172, $IMAGE_BITMAP, _LoadBitmap(200))
GUICtrlSetState(-1, $GUI_DISABLE)
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')

$Button1 = _Skin_AddButton(30, 10, 49, 43, _LoadBitmap(201), _LoadBitmap(203), _LoadBitmap(205))
$Button2 = _Skin_AddButton(79, 10, 49, 43, _LoadBitmap(202), _LoadBitmap(204), _LoadBitmap(206))

GUISetState(@SW_SHOW, $hParent)
GUISetState(@SW_SHOW, $hForm)

While 1
	_Skin_Helper($hForm)
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			MsgBox(64, 'Test', 'Button1')
		Case $Button2
			MsgBox(64, 'Test', 'Button2')
	EndSwitch
WEnd

Func _LoadBitmap($iResource)
	If Not @Compiled Then
		Return _WinAPI_LoadImage(0, @ScriptDir & '\' & $iResource & '.bmp', 0, 0, 0, 0x0010)
	Else
		Return _WinAPI_LoadBitmap(_WinAPI_GetModuleHandle(0), $iResource)
	EndIf
EndFunc   ;==>_LoadBitmap

Func _LoadPNG($sResource)
	If Not @Compiled Then
		Return _GDIPlus_ImageLoadFromFile(@ScriptDir & '\' & $sResource & '.png')
	Else
		Return _LoadResImage(0, 'PNG', $sResource)
	EndIf
EndFunc   ;==>_LoadPNG

Func _LoadResImage($hInstance, $sType, $sName, $iLanguage = 0)

	Local $hInfo, $hData, $pData, $iSize, $hMem, $pMem, $pStream, $hImage

	If Not $hInstance Then
		$hInstance = _WinAPI_GetModuleHandle('')
	EndIf
	If $iLanguage Then
		$hInfo = _WinAPI_FindResourceEx($hInstance, $sType, $sName, $iLanguage)
	Else
		$hInfo = _WinAPI_FindResource($hInstance, $sType, $sName)
	EndIf
	$hData = _WinAPI_LoadResource($hInstance, $hInfo)
	$iSize = _WinAPI_SizeOfResource($hInstance, $hInfo)
	$pData = _WinAPI_LockResource($hData)
	If @Error Then
		Return SetError(1, 0, 0)
	EndIf
	$hMem = DllCall('kernel32.dll', 'ptr', 'GlobalAlloc', 'uint', 2, 'ulong_ptr', $iSize)
	If @Error Then
		Return SetError(2, 0, 0)
	EndIf
	Do
		$pMem = DllCall('kernel32.dll', 'ptr', 'GlobalLock', 'ptr', $hMem[0])
		If @Error Then
			ExitLoop
		EndIf
		If Not _WinAPI_MoveMemory($pMem[0], $pData, $iSize) Then
			ExitLoop
		EndIf
		DllCall('kernel32.dll', 'int', 'GlobalUnlock', 'ptr', $hMem[0])
		$pStream = _WinAPI_CreateStreamOnHGlobal($hMem[0])
		If @Error Then

		EndIf
	Until 1
	If @Error Then
		DllCall('kernel32.dll', 'ptr', 'GlobalFree', 'ptr', $hMem[0])
		Return SetError(2, 0, 0)
	EndIf
;~	_GDIPlus_Startup()
	$hImage = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromStream', 'ptr', $pStream, 'ptr*', 0)
	If (Not @Error) And (Not $hImage[0]) Then
		$hImage = $hImage[2]
	Else
		$hImage = 0
	EndIf
;~	_GDIPlus_Shutdown()
	_WinAPI_ReleaseStream($pStream)
	If Not $hImage Then
		Return SetError(3, 0, 0)
	EndIf
	Return $hImage
EndFunc   ;==>_LoadResImage

Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			If $skData[0][3] > 0 Then
				Return $GUI_RUNDEFMSG
			EndIf
			Local $Info = GUIGetCursorInfo($hForm)
			If Not @Error Then
				Switch $Info[4]
					Case $Button1, $Button2
						; Nothing
					Case Else
						_SendMessage($hParent, $WM_SYSCOMMAND, 0xF012, 0)
				EndSwitch
			EndIf
		Case $hParent
			Return $HTCAPTION
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST


Теперь, если запустить скрипт из SciTE, то будут использоваться картинки из той же папки, а если скомпилировать скрипт, то изображения будут загружаться из ресурсов .exe файла.

h_1418409495_5033423_4c626c30b1.png
 

Вложения

  • Test_res.zip
    33.1 КБ · Просмотры: 29
Верх