Что нового

(Skin.au) Мерцают кнопки, не грузятся изображения

saraconor

Новичок
Сообщения
404
Репутация
3
Почему-то не подгружаются изображения в кнопку - кнопка в интерфейсе не видна. (использую последнюю версию Skin.au)
Кнопка появляется только если пути прямо прописать, а нужно обязательно чтобы изображения были в файле.
Странно, учитывая что остальные детали интерфейса нормально вставились.
А если путь прописать к файлу, то при наведении на кнопку она почемуто на долю секунды мерцает белым (в прошлой версии Skin.au такого не было) как от этого можно избавиться?
И пожалуйста приведите пример как можно сделать так чтобы изображение кнопки после нажатия и череды изменений (middle, down, up) изменилось на эту:
ccaaaf0ae8823226d54780791b36d346.jpg
Дескать кнопка "зажата"
Код:
#Region Resources  
#AutoIt3Wrapper_Res_File_Add=0.bmp, 2, 0
#AutoIt3Wrapper_Res_File_Add=1.bmp, 2, 1
#AutoIt3Wrapper_Res_File_Add=2.bmp, 2, 2
#AutoIt3Wrapper_Res_File_Add=3.bmp, 2, 3
#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('', 443, 188, 45, 19, $WS_POPUP, $WS_EX_MDICHILD, $hParent)
GUICtrlCreatePic('', 0, 0, 160, 61)
GUICtrlSendMsg(-1, 0x0172, $IMAGE_BITMAP, _LoadBitmap(0))
GUICtrlSetState(-1, $GUI_DISABLE)
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')

$Button1 = _Skin_AddButton(5, 2, 30, 12,_LoadBitmap(1), _LoadBitmap(2), _LoadBitmap(3))	;так не работает
;$Button1 = _Skin_AddButton(5, 2, 30, 12, '1.bmp', '2.bmp', '3.bmp')						;так работает

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

While 1
	_Skin_Helper($hForm)
	Switch GUIGetMsg()
		Case $Button1
		sleep(500)
		exit
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

			Local $Info = GUIGetCursorInfo($hForm)
			If Not @Error Then
				Switch $Info[4]
					Case $Button1	;кнопки:  $Button1,$Button2,$Button3...
						; Nothing
					Case Else
						_SendMessage($hParent, $WM_SYSCOMMAND, 0xF012, 0)
				EndSwitch
			EndIf
		Case $hParent
			Return $HTCAPTION
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST

И еще момент, в приведенном примере (во вложении) прозрачный интерфейс почему-то пропадает через 5-7 секунд после запуска:
h_1424590787_3802976_4ef2f4cd8a.jpg
 

Вложения

  • файлы.rar
    179.5 КБ · Просмотры: 6

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
См. архив.
 

Вложения

  • файлы2.zip
    184.5 КБ · Просмотры: 16
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Тут еще возникла проблема, открыв скомпилированный файл на другом компьютере секунд через 5-7 пропадает прозрачный фон GUI. Как это можно предотвратить?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
У меня ничего не пропадает ни через 5 сек, ни через 5 мин. Возможно, проблема в том, что у вас отключен Aero, хотя я тестировал как с Aero, так и без него. А может быть конфликт связан со стилем WS_EX_MDICHILD, который в оригинальном примере я не использовал. Попросите форумчан погонять скрипт, может у кого-нибудь появится такая же проблема. На данный момент я не могу ничем помочь, т.к. у меня так и не получилось воспроизвести данную проблему ни на одном из трех компьютеров.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
проверил на двух компах . win 7 x86. проблем нет.
есть вопрос по поводу Skin_02b.au3. при подключении этой библиотеки в форму не устанавливается кнопка
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
На одном компе пропадает фон с прозрачностью, на другом он становится полностью белым. Оба win7 x64
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Так, давайте выясним что и как мы тестируем. Я, естественно, говорю про скрипт из моего поста в том виде, в каком он лежит в архиве. Работает он с библиотекой Skin_01b.au3 (пытаться подключить 02b не стоит). Тесты проводятся с выключенным Aero.

Для пущей убедительности я сейчас еще раз протестировал скрипт в базовой теме Windows 7 и Windows Classic (обе без Aero), в 16- и 32-битных режимах. Никаких пропаданий фона и т.д.

P.S

В любом случая, данный глюк, если он и имеет место быть, связан с функцией UpdateLayeredWindow(). Почитайте примечание в описании, может это поможет решить проблему. Но сдается мне, что здесь виновато какое-то сторонннее приложение, влияющее на графический интерфейс системы.
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Протестировано несколько компьютеров, видимо это один такой аномальный комп, а в целом все работает как надо.
 
Верх