Viktor1703
AutoIT Гуру
- Сообщения
- 1,535
- Репутация
- 413
Идею взял с Qt
Загрузка иконки из скрипта:
Загрузка иконки из файла:
Скриншот:
С регулярными выражениями у меня беда, так что, если подкините нормальные паттерны, переделаю.
Загрузка иконки из скрипта:
Код:
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
$xpi = '@ AutoIt' & @CRLF & _
'{' & @CRLF & _
' COLORREF . 0x00000000' & @CRLF & _
' COLORREF # 0xFF606060' & @CRLF & _
' SIZE 41 5' & @CRLF & _
' ROW ".####..##..##.######..####..######.######"' & @CRLF & _
' ROW "##..##.##..##...##...##..##...##.....##.."' & @CRLF & _
' ROW "######.##..##...##...##..##...##.....##.."' & @CRLF & _
' ROW "##..##.##..##...##...##..##...##.....##.."' & @CRLF & _
' ROW "##..##..####....##....####..######...##.."' & @CRLF & _
'}' & @CRLF & _
'' & @CRLF & _
'@ MyIcon' & @CRLF & _
'{' & @CRLF & _
' COLORREF . 0x00000000' & @CRLF & _
' COLORREF # 0xFFFF0000' & @CRLF & _
' COLORREF $ 0xFFB20000' & @CRLF & _
' SIZE 20 20' & @CRLF & _
' ROW "$$$$................"' & @CRLF & _
' ROW "$$$....######......."' & @CRLF & _
' ROW "$$...##########....."' & @CRLF & _
' ROW "$...####....####...."' & @CRLF & _
' ROW "...###........###..."' & @CRLF & _
' ROW "..#####........###.."' & @CRLF & _
' ROW "..##.###........##.."' & @CRLF & _
' ROW ".###..###.......###."' & @CRLF & _
' ROW ".##....###.......##."' & @CRLF & _
' ROW ".##.....###......##."' & @CRLF & _
' ROW ".##......###.....##."' & @CRLF & _
' ROW ".##.......###....##."' & @CRLF & _
' ROW ".###.......###..###."' & @CRLF & _
' ROW "..##........###.##.."' & @CRLF & _
' ROW "..###........#####.."' & @CRLF & _
' ROW "...###........###..."' & @CRLF & _
' ROW "....####....####...$"' & @CRLF & _
' ROW ".....##########...$$"' & @CRLF & _
' ROW ".......######....$$$"' & @CRLF & _
' ROW "................$$$$"' & @CRLF & _
'}'
$hForm = GUICreate('')
$iPic1 = GUICtrlCreatePic('', 20, 20, 20, 20)
GUICtrlPic_SetXpiImage($iPic1, $xpi, 'MyIcon')
$iPic2 = GUICtrlCreatePic('', 20, 60, 41, 5)
GUICtrlPic_SetXpiImage($iPic2, $xpi, 'AutoIt')
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
Wend
Func GUICtrlPic_SetXpiImage($iCtrl, $sXpi, $sName)
Local $sBody, $aColor, $aSize, $aImage, $aSet[1][1], $hImage, $hGraphic, $hBmp, $hBitmap, $hPrev
If (Not IsHWnd($iCtrl)) Then
$iCtrl = GUICtrlGetHandle($iCtrl)
EndIf
$sBody = StringRegExpReplace($sXpi, '(?is).*?@\s+' & $sName & '[^{]+\{([^}]+)\}.*', '$1')
If ((Not $sBody) Or @error) Then
Return SetError(1, 0, False)
EndIf
$aColor = StringRegExp($sBody, '(?i)COLORREF\s+([^\s]+)\s+(\w+)', 3)
If (@error Or (Not IsArray($aColor))) Then
Return SetError(2, 0, False)
EndIf
$aColor = __xpi_to2d($aColor)
If (@error Or (Not IsArray($aColor))) Then
Return SetError(3, 0, False)
EndIf
$aSize = StringRegExp($sBody, '(?i)SIZE\s+(\d+)\s+(\d+)', 3)
If (@error Or (Not IsArray($aSize)) Or (UBound($aSize) <> 2)) Then
Return SetError(4, 0, False)
EndIf
$aImage = StringRegExp($sBody, '(?is)ROW\s+"([^"]*)', 3)
If (@error Or (Not IsArray($aImage))) Then
Return SetError(5, 0, False)
EndIf
If (UBound($aImage) == $aSize[1]) Then
ReDim $aSet[$aSize[1]][$aSize[0]]
For $i = 0 To (UBound($aImage) - 1)
For $l = 0 To ($aSize[0] - 1)
If (StringLen($aImage[$i]) <> $aSize[0]) Then
Return SetError(6, 0, False)
EndIf
$aSet[$i][$l] = StringMid($aImage[$i], ($l + 1), 1)
Next
Next
_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0($aSize[0], $aSize[1])
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
_GDIPlus_GraphicsSetSmoothingMode($hGraphic, 2)
$hBmp = _GDIPlus_BitmapCreateFromGraphics($aSize[0], $aSize[1], $hGraphic)
For $i = 0 To $aSize[1] - 1
For $l = 0 To $aSize[0] - 1
_GDIPlus_BitmapSetPixel($hBmp, $l, $i, __xpi_getcolor($aColor, $aSet[$i][$l]))
Next
Next
_GDIPlus_GraphicsDrawImage($hGraphic, $hBmp, 0, 0)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hPrev = _SendMessage($iCtrl, 0x0172, 0, $hBitmap)
If $hPrev Then
_WinAPI_DeleteObject($hPrev)
EndIf
$hPrev = _SendMessage($iCtrl, 0x0173)
If ($hPrev <> $hBitmap) Then
_WinAPI_DeleteObject($hBitmap)
EndIf
_GDIPlus_BitmapDispose($hBmp)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_BitmapDispose($hImage)
_GDIPlus_Shutdown()
EndIf
Return False
EndFunc
Func __xpi_to2d($aColor)
Local $aTemp[1][2]
If (IsArray($aColor) And UBound($aColor)) Then
For $i = 0 To UBound($aColor) - 1 Step 2
If (($aColor[$i] == '') Or (StringLen($aColor[$i]) > 1)) Then
Return SetError(1, 0, 0)
EndIf
If (($aColor[$i + 1] == '') Or (StringRegExp($aColor[$i + 1], '0x.{8}') <> 1)) Then
Return SetError(2, 0, 0)
EndIf
$aTemp[0][0] += 1
ReDim $aTemp[$aTemp[0][0] + 1][UBound($aTemp, 2)]
$aTemp[$aTemp[0][0]][0] = $aColor[$i]
$aTemp[$aTemp[0][0]][1] = $aColor[$i + 1]
Next
Return $aTemp
EndIf
Return False
EndFunc
Func __xpi_getcolor($aColor, $sChar)
If IsArray($aColor) Then
For $i = 1 To $aColor[0][0]
If ($sChar == $aColor[$i][0]) Then
Return $aColor[$i][1]
EndIf
Next
Endif
EndFunc
Загрузка иконки из файла:
Скрипт:
Файл image.xpi
Код:
#include <GDIPlus.au3>
$hFile = FileOpen('image.xpi')
$sRead = FileRead($hFile)
FileClose($hFile)
$hForm = GUICreate('')
$iPic = GUICtrlCreatePic('', 20, 20, 20, 20)
GUICtrlPic_SetXpiImage($iPic, $sRead, 'MyIcon')
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
Wend
Func GUICtrlPic_SetXpiImage($iCtrl, $sXpi, $sName)
Local $sBody, $aColor, $aSize, $aImage, $aSet[1][1], $hImage, $hGraphic, $hBmp, $hBitmap, $hPrev
If (Not IsHWnd($iCtrl)) Then
$iCtrl = GUICtrlGetHandle($iCtrl)
EndIf
$sBody = StringRegExpReplace($sXpi, '(?is).*?@\s+' & $sName & '[^{]+\{([^}]+)\}.*', '$1')
If ((Not $sBody) Or @error) Then
Return SetError(1, 0, False)
EndIf
$aColor = StringRegExp($sBody, '(?i)COLORREF\s+([^\s]+)\s+(\w+)', 3)
If (@error Or (Not IsArray($aColor))) Then
Return SetError(2, 0, False)
EndIf
$aColor = __xpi_to2d($aColor)
If (@error Or (Not IsArray($aColor))) Then
Return SetError(3, 0, False)
EndIf
$aSize = StringRegExp($sBody, '(?i)SIZE\s+(\d+)\s+(\d+)', 3)
If (@error Or (Not IsArray($aSize)) Or (UBound($aSize) <> 2)) Then
Return SetError(4, 0, False)
EndIf
$aImage = StringRegExp($sBody, '(?is)ROW\s+"([^"]*)', 3)
If (@error Or (Not IsArray($aImage))) Then
Return SetError(5, 0, False)
EndIf
If (UBound($aImage) == $aSize[1]) Then
ReDim $aSet[$aSize[1]][$aSize[0]]
For $i = 0 To (UBound($aImage) - 1)
For $l = 0 To ($aSize[0] - 1)
If (StringLen($aImage[$i]) <> $aSize[0]) Then
Return SetError(6, 0, False)
EndIf
$aSet[$i][$l] = StringMid($aImage[$i], ($l + 1), 1)
Next
Next
_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0($aSize[0], $aSize[1])
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
_GDIPlus_GraphicsSetSmoothingMode($hGraphic, 2)
$hBmp = _GDIPlus_BitmapCreateFromGraphics($aSize[0], $aSize[1], $hGraphic)
For $i = 0 To $aSize[1] - 1
For $l = 0 To $aSize[0] - 1
_GDIPlus_BitmapSetPixel($hBmp, $l, $i, __xpi_getcolor($aColor, $aSet[$i][$l]))
Next
Next
_GDIPlus_GraphicsDrawImage($hGraphic, $hBmp, 0, 0)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hPrev = _SendMessage($iCtrl, 0x0172, 0, $hBitmap)
If $hPrev Then
_WinAPI_DeleteObject($hPrev)
EndIf
$hPrev = _SendMessage($iCtrl, 0x0173)
If ($hPrev <> $hBitmap) Then
_WinAPI_DeleteObject($hBitmap)
EndIf
_GDIPlus_BitmapDispose($hBmp)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_BitmapDispose($hImage)
_GDIPlus_Shutdown()
EndIf
Return False
EndFunc
Func __xpi_to2d($aColor)
Local $aTemp[1][2]
If (IsArray($aColor) And UBound($aColor)) Then
For $i = 0 To UBound($aColor) - 1 Step 2
If (($aColor[$i] == '') Or (StringLen($aColor[$i]) > 1)) Then
Return SetError(1, 0, 0)
EndIf
If (($aColor[$i + 1] == '') Or (StringRegExp($aColor[$i + 1], '0x.{8}') <> 1)) Then
Return SetError(2, 0, 0)
EndIf
$aTemp[0][0] += 1
ReDim $aTemp[$aTemp[0][0] + 1][UBound($aTemp, 2)]
$aTemp[$aTemp[0][0]][0] = $aColor[$i]
$aTemp[$aTemp[0][0]][1] = $aColor[$i + 1]
Next
Return $aTemp
EndIf
Return False
EndFunc
Func __xpi_getcolor($aColor, $sChar)
If IsArray($aColor) Then
For $i = 1 To $aColor[0][0]
If $sChar == $aColor[$i][0] Then
Return $aColor[$i][1]
EndIf
Next
Endif
EndFunc
Файл image.xpi
Код:
@ MyIcon
{
COLORREF . 0x00000000
COLORREF # 0xFFFF0000
COLORREF $ 0xFFB20000
SIZE 20 20
ROW "$$$$................"
ROW "$$$....######......."
ROW "$$...##########....."
ROW "$...####....####...."
ROW "...###........###..."
ROW "..#####........###.."
ROW "..##.###........##.."
ROW ".###..###.......###."
ROW ".##....###.......##."
ROW ".##.....###......##."
ROW ".##......###.....##."
ROW ".##.......###....##."
ROW ".###.......###..###."
ROW "..##........###.##.."
ROW "..###........#####.."
ROW "...###........###..."
ROW "....####....####...$"
ROW ".....##########...$$"
ROW ".......######....$$$"
ROW "................$$$$"
}
Скриншот:
С регулярными выражениями у меня беда, так что, если подкините нормальные паттерны, переделаю.