Что нового

[Элементы GUI] _ResSetImageToCtrl & GUICtrlCreateTabItem

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
В приложении сделал кнопки в виде картинок на GUICtrlCreatePic с использованием Icons.au3. Все работает на ура, но захотелось упаковать все ресурсы в один файл вместе со скриптом через Resources.au3 и откомпилировать.

Возникли проблемки:
1. Размер рисунка не подстраивается под размер элемента управления, ну при желании можно уменьшить его в редакторе ничего страшного.
2. Если элемент управления находится на вкладке GUICtrlCreateTabItem, и его рисунок нужно заменить на другой (по нажатию на нем например), то рисунок исчезает, если попереключать вкладки, то он отобразится :wacko:
Код:
#Region AutoIt3Wrapper
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Run_Au3check=n
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, clear.png,  RCData, 100, 0
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, top.png,  RCData, 200, 0
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, untop.png,  RCData, 250, 0
#EndRegion AutoIt3Wrapper

#include <GUIConstants.au3>
#include <Icons.au3>
#Include <Resources.au3>

$proj = 'test'
$hGUI = GUICreate($proj, 200, 220)
$tab = GUICtrlCreateTab(0, 0, 200, 150)
GUICtrlCreateTabItem(' 1 ')

	$clear = GUICtrlCreatePic('', 40, 60, 32, 32)
;~ 	_ResSetImageToCtrl($clear, '#100')
	_SetImage($clear, @ScriptDir & '\clear.png')

	$SetTop = GUICtrlCreatePic('', 120, 60, 32, 32)
	$top = True
	WinSetOnTop($proj, '', 1)
;~ 	_ResSetImageToCtrl($SetTop, '#200')
	_SetImage($SetTop, @ScriptDir & '\top.png')

GUICtrlCreateTabItem(' 2 ')
GUICtrlCreateTabItem('')
$_1 = GUICtrlCreatePic('', 80, 180, 32, 32)
;~ 	_ResSetImageToCtrl($_1, '#200')
	_SetImage($_1, @ScriptDir & '\top.png')
$1 = True

GUISetState()

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case -3
			Exit
		Case $SetTop
			$top = Not $top
			If $top Then
;~ 				_ResSetImageToCtrl($SetTop, '#200')
				_SetImage($SetTop, @ScriptDir & '\top.png')
				WinSetOnTop($proj, '', 1)
			Else
;~ 				_ResSetImageToCtrl($SetTop, '#250')
		 		_SetImage($SetTop, @ScriptDir & '\untop.png')
				WinSetOnTop($proj, '', 0)
			EndIf
		Case $clear
			MsgBox(262192, "msg", "clear!", 0.5)
		Case $_1
			$1 = Not $1
			If $1 Then
;~ 				_ResSetImageToCtrl($_1, '#200')
				_SetImage($_1, @ScriptDir & '\top.png')
			Else
;~ 				_ResSetImageToCtrl($_1, '#250')
		 		_SetImage($_1, @ScriptDir & '\untop.png')
			EndIf
	EndSwitch
WEnd

Кто-нибудь знает решение?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Ну, собственно именно для этого я и писал Icons.au3. Это не такая уж и простая библиотека, как кажется на первый взгляд.

Сделай так:

Код:
#Region  AutoIt3Wrapper
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Run_Au3check=n
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, clear.png,  RCData, 100, 0
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, top.png,  RCData, 200, 0
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, untop.png,  RCData, 250, 0
#EndRegion  AutoIt3Wrapper

#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
#include <Icons.au3>
#include <Memory.au3>
#include <WinAPIEx.au3>

_GDIPlus_Startup()

Global $hClear = _LoadImage(100), $hTop = _LoadImage(200), $hUntop = _LoadImage(250)

$proj = 'test'
$hGUI = GUICreate($proj, 200, 220)
$tab = GUICtrlCreateTab(0, 0, 200, 150)
GUICtrlCreateTabItem(' 1 ')

$clear = GUICtrlCreatePic('', 40, 60, 32, 32)
_SetHImage($clear, $hClear)

$SetTop = GUICtrlCreatePic('', 120, 60, 32, 32)
$top = True
WinSetOnTop($proj, '', 1)
_SetHImage($SetTop, $hTop)

GUICtrlCreateTabItem(' 2 ')
GUICtrlCreateTabItem('')
$_1 = GUICtrlCreatePic('', 80, 180, 32, 32)
_SetHImage($_1, $hTop)
$1 = True

GUISetState()

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case -3
			Exit
		Case $SetTop
			$top = Not $top
			If $top Then
				_SetHImage($SetTop, $hTop)
				WinSetOnTop($proj, '', 1)
			Else
				_SetHImage($SetTop, $hUntop)
				WinSetOnTop($proj, '', 0)
			EndIf
		Case $clear
			MsgBox(262192, "msg", "clear!", 0.5)
		Case $_1
			$1 = Not $1
			If $1 Then
				_SetHImage($_1, $hTop)
			Else
				_SetHImage($_1, $hUntop)
			EndIf
	EndSwitch
WEnd

_GDIPlus_Shutdown()

Func _LoadImage($iRes)

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

	$hInstance = _WinAPI_GetModuleHandle('')
	$hInfo = _WinAPI_FindResource($hInstance, $iRes, $RT_RCDATA)
	$hData = _WinAPI_LoadResource($hInstance, $hInfo)
	$iSize = _WinAPI_SizeofResource($hInstance, $hInfo)
	$pData = _WinAPI_LockResource($hData)
	If @error Then
		Return 0
	EndIf
	$hMem = _MemGlobalAlloc($iSize, $GMEM_MOVEABLE)
	$pMem = _MemGlobalLock($hMem)
	_MemMoveMemory($pData, $pMem, $iSize)
	_MemGlobalUnlock($hMem)
	$hStream = _WinAPI_CreateStreamOnHGlobal($hMem)
	$hImage = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromStream', 'ptr', $hStream, 'ptr*', 0)
	If (Not @error) And (Not $hImage[0]) Then
		$hImage = $hImage[2]
	Else
		$hImage = 0
	EndIf
	_WinAPI_DeleteObject($hStream)
	If Not $hImage Then
		Return 0
	EndIf
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	_GDIPlus_ImageDispose($hImage)
	Return $hBitmap
EndFunc   ;==>_LoadImage
 
Автор
Redline

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Yashied [?]
Ну, собственно именно для этого я и писал Icons.au3. Это не такая уж и простая библиотека, как кажется на первый взгляд.
Отлично работает!
Спасибо за быстрый ответ.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Ребята, я не знаю как написано в русской справке, но все Win... функции могут воспринимать как название заголовка, так и непосредственно хендл окна, который и нужно по возможности использовать. И вместо этого

Код:
WinSetOnTop($proj, '', 1)


нужно писать это

Код:
WinSetOnTop($hGUI, '', 1)
 
Верх