Что нового

[Элементы GUI] gui + png + компиляция

johnmarshall

Осваивающий
Сообщения
198
Репутация
37
Всем добрый вечер.
читаю форумы уже 5 часов к ряду, мозг расплавился.
Ситуация такая:
есть обычная форма:
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ###
$Form1 = GUICreate("Form1", 396, 288, 198, 124)
$Tab1 = GUICtrlCreateTab(32, 24, 289, 193)
$TabSheet1 = GUICtrlCreateTabItem("TabSheet1")
$Button1 = GUICtrlCreateButton("Button1", 48, 72, 91, 73)
$Pic1 = GUICtrlCreatePic("", 152, 72, 84, 76)
$TabSheet2 = GUICtrlCreateTabItem("TabSheet2")
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

ничего примечательного. стандартная. добавляю PNG или GIF рисунок с прозрачностью
- либо рядом
- либо на кнопку.
потом пытаюсь добавить рисунок в скомпилированный скрипт:
- либо через reshaker.exe
- либо через resources.au3

система winXP SP3. autoit 3.3.6.1

итого:
- http://www.autoitscript.com/forum/topic/51103-resources-udf/ библиотека ресурсов, все хорошо компилит, только кнопка получается без рисунка, потому, что не добавляется.
- http://www.autoitscript.com/forum/topic/113484-htmlayout-dll-udf/ боян. может со временем или под другие нужды, но не подходит.
- http://autoit-script.ru/index.php?topic=4342.0 пример хороший, только рисунок на кнопке получает эффект "сепия".
- http://autoit-script.ru/index.php/topic,5090.0.html хороший пример с прозрачностью, все отлично работает, только это для общего окна формы.
- http://autoit-script.ru/index.php/topic,49.0.html работает. перечитал весь Icons.udf, как просто добавить рисунок, не обрезая, не понял. добавить в скомпилированный файл не получилось по причине то-ли конфликта resources.udf (http://www.autoitscript.com/forum/topic/51103-resources-udf/) и Icons.udf (http://www.autoitscript.com/forum/topic/92675-icons-au3/).
- http://autoit-script.ru/index.php/topic,5419.0.html кнопка-тумблер. работает, компилится, только это для обычных иконок, а надо PNG.
- http://autoit-script.ru/index.php/topic,1751.msg12505/topicseen.html GUIImageList.au3 не осилил.

прочел еще:
http://autoit-script.ru/index.php/topic,6434.0.html
http://autoit-script.ru/index.php/topic,1267.0.html классный пример. пока не осилил)
http://autoit-script.ru/index.php/topic,241.0.html прозрачные окна.
http://autoit-script.ru/index.php/topic,3405.msg24616.html табы очень понравились, хорошо скомпилировались. PNG не смог добавить.
http://autoit-script.ru/index.php/topic,2430.0.html с иконками работает. с рисунками не работает.
http://dundats.mvps.org/help/html/libfunctions/_guiimagelist_create.htm _guiimagelist_create не осилил.

просьба (я понимаю, еще одна тема, примеров и так куча, но все-таки)

подскажите небольшой, простенький пример, чтобы можно было на форму добавить рисунок PNG или GIF с прозрачностью,
и чем его лучше все-таки внедрять в ресурс; через resources.udf, без Icons.udf; или AutoIt3Wrapper с Icons.udf,
или как вообще лучше.

UPD.
добавление используя resources.udf -- #AutoIt3Wrapper_Res_File_Add=PlayBlue.png, rt_rcdata, PlayBlue.png
добавление используя ResHacker.exe -- #AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, 0.png, RCData, 600, 0
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Re: [Элементы GUI] [Элементы GUI] gui + png + компиляция

Вот так способ использую для png с прозрачным фоном (с gif не пробовал):
ResHacker.exe должен лежать в одной папке со скриптом, либо нужно указывать иной путь.
Ресурсы класть в папку resources рядом со скриптом.
Картинки будут видны только после компиляции!
Код:
#Region AutoIt3Wrapper
#AutoIt3Wrapper_Compression=4 ; уровень компрессии подобран вручную :)
#AutoIt3Wrapper_UseUpx=n ; отключаем упаковщик - он будет запущен позже
; добавление ресурсов
#AutoIt3Wrapper_outfile=prog.exe ; имя программы после компиляции
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, resources\top.png,  PNG, 100,
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, resources\untop.png,  PNG, 200,
; эта строчка для упаковщика, с параметрами, которые не дают сжимать ресурсы, если их сжать - они пропадут.
#AutoIt3Wrapper_Run_After=Upx.exe "%out%" --best --no-backup --overlay=copy --compress-exports=1 --compress-resources=0 --strip-relocs=1
#EndRegion AutoIt3Wrapper

#include <GUIConstants.au3>
#include <WinAPIEx.au3>
#include <Icons.au3>

$hInstance = _WinAPI_GetModuleHandle(0)
_GDIPlus_Startup()
$hGUI = GUICreate('Title', 300, 300)
$hTop = GUICtrlCreatePic('', 50, 50, 32, 32)
_LoadResourceImage($hInstance, 'PNG', 100, $hTop)

$hUntop = GUICtrlCreatePic('', 200, 50, 32, 32)
_LoadResourceImage($hInstance, 'PNG', 200, $hUntop)
GUISetState()

While 1
	$hMsg = GUIGetMsg()
	Select
		Case $hMsg = $GUI_EVENT_CLOSE
			Exit
		Case $hMsg = $hTop
			MsgBox(0, 'TOP', 'TOP')
		Case $hMsg = $hUntop
			MsgBox(0, 'UNTOP', 'UNTOP')
	EndSelect
WEnd


Func _LoadResourceImage($hInstance, $sResType, $sResName, $hHndl, $iResLanguage = 0)

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

    If $iResLanguage Then
        $hInfo = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    Else
        $hInfo = _WinAPI_FindResource($hInstance, $sResType, $sResName)
    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(1, 0, 0)
    EndIf
    $pMem = DllCall("kernel32.dll", "ptr", "GlobalLock", "ptr", $hMem[0])
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    DllCall("kernel32.dll", "none", "RtlMoveMemory", "ptr", $pMem[0], "ptr", $pData, "ulong_ptr", $iSize)
    DllCall("kernel32.dll", "int", "GlobalUnlock", "ptr", $hMem[0])
    $hStream = _WinAPI_CreateStreamOnHGlobal($hMem[0])
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    _GDIPlus_Startup()
    $hImage = DllCall("gdiplus.dll", "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "ptr*", 0)
    If (@error) Or ($hImage[0]) Or (Not $hImage[2]) Then
        $hImage = 0
    EndIf
    _GDIPlus_Shutdown()
    DllCall("kernel32.dll", "ptr", "GlobalFree", "ptr", $hMem[0])
    If Not IsArray($hImage) Then
        Return SetError(1, 0, 0)
    EndIf
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage[2])
	_GDIPlus_ImageDispose($hImage[2])
	_SetHImage($hHndl, $hBitmap)
	_WinAPI_DeleteObject($hBitmap)
;~     Return $hImage[2]
	Return 0
EndFunc   ;==>_LoadResourceImage

_GDIPlus_Shutdown()
Иногда в скомпилированной программе не все картинки видны помогает повтор сборки.
PS: на Windows2000 рисунок отрисовывается очень коряво, его практически не рассмотреть и вместо прозрачного фона - черная заливка. Может это конкретный комп или сама система, проверял только на одной машине.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Re: [Элементы GUI] [Элементы GUI] gui + png + компиляция

:rofl:
 
Верх