Автор Тема: Создаём свои "XPI" иконки  (Прочитано 4009 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Создаём свои "XPI" иконки
« Создано: Март 02, 2014, 21:16:16 »
Идею взял с Qt

Загрузка иконки из скрипта:
(нажмите для показа/скрытия)

Загрузка иконки из файла:
(нажмите для показа/скрытия)

Скриншот:
Нажмите для отображения изображения в оригинальном размере.

С регулярными выражениями у меня беда, так что, если подкините нормальные паттерны, переделаю.
« Последнее редактирование: Март 03, 2014, 12:32:49 от Viktor1703 »

Русское сообщество AutoIt

Создаём свои "XPI" иконки
« Отправлен: Март 02, 2014, 21:16:16 »

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Создаём свои "XPI" иконки
« Ответ #1, Отправлен: Март 03, 2014, 02:09:10 »
damien2008

Спасибо, забыл предупредить, у меня AutoIt v3.3.10.2 в нём не требуется GDIP, в версиях 3.3.8.1 и ниже нужна GDIP UDF

Оффлайн MnM [?]

  • SoSerious
  • Продвинутый
  • ***
  • Сообщений: 679
  • Репутация: 90
  • Пол: Мужской
  • Post-Hardcore
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Создаём свои "XPI" иконки
« Ответ #2, Отправлен: Март 03, 2014, 06:29:40 »
Хотел добавить в иконку еще 2 пикселя в зеленом цвете:
Код: AutoIt [Выделить]
'   COLORREF ^ 0x0C431B00' & @CRLF & _

Скрипт не создает иконку

Хотел увеличить размер:
Скрипт не создает иконку  :stars:

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Создаём свои \"XPI\" иконки
« Ответ #3, Отправлен: Март 03, 2014, 10:34:55 »
MnM
Хотел увеличить размер:
Скрипт не создает иконку 

Оно понятно, я перепутал размерность массива..

(нажмите для показа/скрытия)

Жаль нельзя добавить более одного изображения, рег. выражения не то возвращают...
« Последнее редактирование: Март 03, 2014, 11:05:09 от Viktor1703, Причина: Объединение сообщений »

Русское сообщество AutoIt

Re: Создаём свои \"XPI\" иконки
« Ответ #3 Отправлен: Март 03, 2014, 10:34:55 »

Оффлайн ---Zak--- [?]

  • Скриптер
  • ****
  • Сообщений: 438
  • Репутация: 113
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Создаём свои "XPI" иконки
« Ответ #4, Отправлен: Март 03, 2014, 12:04:02 »
2 Viktor1703
Цитировать
Жаль нельзя добавить более одного изображения, рег. выражения не то возвращают...

А если вот как-нибудь так (в регулярных не очень силен):

Код: AutoIt [Выделить]
$sBody = StringRegExpReplace($sXpi, '(?is)@\s+' & $sName & '[\s+|\n|\r]+{[\s+|\n|\r]+(.*?)[\s+|\n|\r]+}', '$1')

заменить на
Код: AutoIt [Выделить]
$sBody = StringRegExpReplace($sXpi, '(?is).*@\s+' & $sName & '[\s+|\n|\r]+{[\s+|\n|\r]+(.*?)[\s+|\n|\r]+}.*', '$1')



Пример:
(нажмите для показа/скрытия)
OS: WinXp SP3 (RUS), Win7 (x86/x64)


My development:
http://autoit-script.ru/index.php?topic=11541.0.html

Оффлайн Z_Lenar [?]

  • Продвинутый
  • ***
  • Сообщений: 209
  • Репутация: 52
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Создаём свои "XPI" иконки
« Ответ #5, Отправлен: Март 03, 2014, 12:15:32 »
Viktor1703
Переделал:
Код: AutoIt [Выделить]
#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 & _
'@ 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('')
$iPic = GUICtrlCreatePic('', 20, 20, 20, 20)
GUICtrlPic_SetXpiImage($iPic, $xpi, 'MyIcon')
$iPic1 = GUICtrlCreatePic('', 50, 20, 41, 5)
GUICtrlPic_SetXpiImage($iPic1, $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).*[email protected]\s+' & $sName & '[^{]+\{([^}]+)\}.*', '$1')
    If ((Not $sBody) Or @error) Then
        Return SetError(1, 0, False)
    EndIf

    $aColor = StringRegExp($sBody, '(?i)COLORREF\s+([[:punct:]]+)\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

« Последнее редактирование: Март 03, 2014, 12:23:31 от Z_Lenar »

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Создаём свои "XPI" иконки
« Ответ #6, Отправлен: Март 03, 2014, 14:18:32 »
Вот такая вот картинка получилась  :)

(нажмите для показа/скрытия)

Русское сообщество AutoIt

Re: Создаём свои "XPI" иконки
« Ответ #6 Отправлен: Март 03, 2014, 14:18:32 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
6 Ответов
13379 Просмотров
Последний ответ Октябрь 07, 2009, 09:36:42
от akoulev
12 Ответов
13437 Просмотров
Последний ответ Декабрь 01, 2012, 02:05:11
от defens
2 Ответов
8158 Просмотров
Последний ответ Ноябрь 02, 2010, 11:58:00
от Linaleks
8 Ответов
22007 Просмотров
Последний ответ Февраль 09, 2011, 22:04:08
от Kaster
8 Ответов
11314 Просмотров
Последний ответ Апрель 10, 2011, 11:50:11
от madmasles
2 Ответов
5816 Просмотров
Последний ответ Октябрь 17, 2011, 20:18:09
от Gorenich
5 Ответов
5219 Просмотров
Последний ответ Март 05, 2012, 14:53:52
от Redline
2 Ответов
2975 Просмотров
Последний ответ Март 31, 2012, 16:45:37
от agikon
3 Ответов
4550 Просмотров
Последний ответ Август 25, 2013, 10:36:23
от Godygadu
1 Ответов
203 Просмотров
Последний ответ Май 21, 2018, 10:53:11
от gunter123