1 (изменено: InFlames, 2010-11-16 22:35:40)

Тема: AHK: Прозрачность картинок в GUI

Текста много. Прошу прощения, но в двух словах не объяснить.

Хочу создать что-то вроде скина для GUI. Фоном будет картинка. На этом фоне будут расположены кнопки (тоже картинки). С прямоугольными картинками все просто, там не надо делать их прозрачными. А вот с картинками другой формы, не прямоугольной, есть загвоздка. Надо делать часть фона прозрачным.

Вариант 1
Задать цвет фона GUI и цвет фона картинки одинаковыми, и сделать в GUI этот цвет прозрачным, тогда будет видна та часть картинки, которая будет отличаться от цвета, который задали прозрачным.

Вариант 2
Я нигде раньше про это не читал, но случайно обнаружил следующее. Делаем картинку, фон для нее делаем любого цвета, при этом создаем альфа-канал и зарисовываем фон картинки (эта часть картинки с альфа-каналом в GUI будет прозрачна). Создаем GUI с любым фоном и делаем этот цвет прозрачным. В итоге фон GUI - прозрачный, часть картинки - прозрачная. И всё это не зависит от цвета, который мы выбрали для прозрачности.

Я использовал второй вариант. Создал картинку: круг, на нем нарисована линия. Фон залит альфа-каналом.
Создаю GUI с фоном произвольного цвета, делаю его прозрачным, добавляю созданную картинку и получаю GUI в виде круга. Это как бы теперь фон GUI. Далее я хочу сверху добавить еще картинку (как бы кнопку). Она тоже произвольной формы. Я добавил туже картинку, но уменьшив ее в размерах.
В итоге часть фона стала прозрачной. Что бы дальше не разводить писанину, просто запустите скрипт и станет понятно, что меня не устраивает: я хочу, что бы вторая картинка была без прозрачного фона, но в виде круга.

Скачать fon.bmp 1.17мб
или можно не скачивать, скрипт сам скачает

If !FileExist("fon.bmp")
    URLDownloadToFile, http://onemove.ru/get/27091 ,fon.bmp

c=fe0000 ; произвольный цвет
gui, color, %c%
gui,  +AlwaysOnTop +LastFound +ToolWindow -Caption -Border
WinSet, TransColor, %c% 255
gui, add, picture, w300 h-1, fon.bmp
gui, add, picture, w200 h-1 x150 y45, fon.bmp
gui, show
Return

GuiEscape:
GuiClose:
ExitApp

2

Re: AHK: Прозрачность картинок в GUI

Файл-картинка чудного формата, с горем пополам просматривается через интернет-обозреватель. Через Autohotkey и стандартные программы для графики не открывается. Поэтому я так и не понял, в чём вопрос. Задание прозрачного цвета должно работать в .GIF и .PNG. А .BMP с прозрачностью - не по зубам стандартным средствам.

3

Re: AHK: Прозрачность картинок в GUI

О том, как создавать прозрачные области в картинке — здесь.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4 (изменено: InFlames, 2010-11-17 00:20:57)

Re: AHK: Прозрачность картинок в GUI

Очень странно, вот собственно эта картинка через интернет-обозреватель. А вот запущенный скрипт автохоткея.
Тут про альфа-каналы.
Там хоть и нет .bmp в списке поддерживаемых форматов, но он поддерживает  альфа-каналы.
При сохранении в фотошопе .bmp есть галочка для сохранения альфа каналов.
Я пробовал и как PNG и как TIF сохранять, все работает так же как и с BMP.

(В просмотрщике изображений, в том же интернет-обозревателе фон bmp файла с алфа-каналом не будет прозрачной, но при загрузке в автохоткей, фон становится прозрачным, как вот )


teadrinker пишет:

О том, как создавать прозрачные области в картинке — здесь.

Я это видел. Там область прямоугольная. Я же хочу, что бы на фоне формы круга, находился еще один круг.
Проблема в том, что картинку в виде круга сохранить нельзя. Надо делать прозрачными области вокруг круга. Когда в ahk накладываются такие две картинки (одна больше другой, что бы было видно), то бОльшая картинка преобретает очертания круга, а меньшая картинка имеет прямоугольные прозрачные границы. Вот  скрин

5

Re: AHK: Прозрачность картинок в GUI

Короче, проблема в том, что прозрачный цвет картинки1 в GUI не "просвечивает насквозь", а накладывается поверх" картинки2 в  GUI ?

6 (изменено: teadrinker, 2010-11-17 00:28:26)

Re: AHK: Прозрачность картинок в GUI

Понял. Здесь нужно задать опцию картинкам +BackgroundTrans.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: InFlames, 2010-11-17 00:32:32)

Re: AHK: Прозрачность картинок в GUI

Скрин

Проблема в том, что картинка1 (см. скрин) отображается нормально, с прозрачным фоном.
Такая же картинка2 (но меньшего размера, для наглядности), которая накладывается сверху на первую, делает первую картинку прозрачную. Я же хочу, что бы прозрачными оставались только пиксели вокруг картинок.
Это как положить одну монетку на другую. Прозрачными должны быть только области вокруг монет, а там где они накладываются друг на друга, прозрачности быть не должно.



teadrinker пишет:

Понял. Здесь нужно задать опцию картинкам +BackgroundTrans.

Потрясающе. Спасибо огромное.
результат

8

Re: AHK: Прозрачность картинок в GUI

InFlames пишет:

При сохранении в фотошопе .bmp есть галочка для сохранения альфа каналов.

Всё равно лучше в png сохранять, он гораздо меньше места занимает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Прозрачность картинок в GUI

Это верно. Просто я за bmp зацепился, потому что мне попалась картинка именно в bmp с альфа-каналом.
Хочу сделать скин для программы в стиле меню Wаrсrаft III. Выдернул кнопки. Они оказались в bmp с черным фоном (как потом оказалось фон этот залит альфа-каналом). Добавил их в GUI, сделал фон GUI прозрачным. И (!!!) хотя черный фон кнопки с красным фоном (сделанным прозрачным) GUI не совпадал кнопка все равно была прозрачной.

Вот результат.

If !FileExist("background.bmp")
    URLDownloadToFile, http://onemove.ru/get/27114 , background.bmp
If !FileExist("button3.bmp")    
    URLDownloadToFile, http://onemove.ru/get/27115 , button3.bmp



c=28251c ; произвольный цвет
gui, color, %c%
gui,  +AlwaysOnTop +LastFound +ToolWindow -Caption -Border
WinSet, TransColor, %c% 255
gui, add, picture, w300 h-1 vv1 +BackgroundTrans , background.bmp
gui, add, picture, w214 h35 vv2 x85 y23 +BackgroundTrans  Hidden, button3.bmp
gui, add, picture, w217 h41 vv3 x85 y21 +BackgroundTrans gg, button3.bmp
gui, font, s18 cWhite, Comic Sans MS
gui, add, text, x145 y25 vv4 gg +BackgroundTrans, Button
gui, show
Return

g:
    GuiControl, hide, v3
    GuiControl, show, v2
    GuiControl, move, v4, y23
    While GetKeyState("lbutton", "P")
    Sleep 100
    GuiControl, show, v3
    GuiControl, hide, v2
    GuiControl, move, v4, y25
Return


GuiEscape:
GuiClose:
ExitApp

10

Re: AHK: Прозрачность картинок в GUI

Не очень понял идею, готично всё слишком. Картинка button3.bmp не открывается даже в фотошопе, файл, похоже, какой-то битый.

http://s004.radikal.ru/i206/1011/e3/998986936bb3.jpg

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Прозрачность картинок в GUI

Без понятия.
С png что-то не получается. Вот может tif подойдет.

If !FileExist("background.tif")
    URLDownloadToFile, http://onemove.ru/get/27122 , background.tif
If !FileExist("button3.tif")    
    URLDownloadToFile, http://onemove.ru/get/27123 , button3.tif



c=28251c ; произвольный цвет
gui, color, %c%
gui,  +AlwaysOnTop +LastFound +ToolWindow -Caption -Border
WinSet, TransColor, %c% 255
gui, add, picture, w300 h-1 vv1 +BackgroundTrans , background.tif
gui, add, picture, w214 h35 vv2 x85 y23 +BackgroundTrans  Hidden, button3.tif
gui, add, picture, w217 h41 vv3 x85 y21 +BackgroundTrans gg, button3.tif
gui, font, s18 cWhite, Comic Sans MS
gui, add, text, x145 y25 vv4 gg +BackgroundTrans, Button
gui, show
Return

g:
    GuiControl, hide, v3
    GuiControl, show, v2
    GuiControl, move, v4, y23
    While GetKeyState("lbutton", "P")
    Sleep 10
    GuiControl, show, v3
    GuiControl, hide, v2
    GuiControl, move, v4, y25
Return


GuiEscape:
GuiClose:
ExitApp

12

Re: AHK: Прозрачность картинок в GUI

button3.tif

http://i061.radikal.ru/1011/e7/f8b4c5dd65f4.jpg

Сам-то пробовал?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13 (изменено: InFlames, 2010-11-17 11:02:50)

Re: AHK: Прозрачность картинок в GUI

Конечно. Вот, всё работает. Может кто еще попробует и отпишет.
http://screencast.com/t/69QbioBx1

Добавлю: проверил дома на WinXp и Win7, проверил на работе на WinXp. Эти скрипты отлично работают. Изображения открываются.

14 (изменено: Foma, 2014-03-28 16:44:47)

Re: AHK: Прозрачность картинок в GUI

Я двигаю картинку с прозрачным фоном по другой картинке с градиентом, а потом ещё на несколько наезжаю. В результате картинка двигается с фоном от места первого появления, через пару секунд всё окно перерисовывается и картинка движется дальше уже с тем фоном что бы под ней в момент перерисовки. Когда наезжает на другие картинки тащит за собой тот же фон с предыдущей. Как этого можно избежать?


Gui, Add, Picture, x0 y0,img\fon1.jpg ;фон1
...
Gui, Add, Picture, x100 y200,img\fon2.png     ;фон2
...
Gui, Add, Picture, x10 y10 +BackgroundTrans vPic0,img\pic0.gif ;прозравчная картинка
...
Gui, Show,,окно


; движется по таймеру
GuiControl,Move,Pic0,x%xnew% y%ynew% +BackgroundTrans

15

Re: AHK: Прозрачность картинок в GUI

Разобрался.

16

Re: AHK: Прозрачность картинок в GUI

Переделал так.

Gui, Add, Picture, x0 y0,img\fon1.jpg ;фон1
...
Gui, Add, Picture, x100 y200,img\fon2.png     ;фон2
...
Gui, Add, Picture, x10 y10 +BackgroundTrans vPic0,img\pic0.gif ;прозравчная картинка
...
Gui, Show,,окно


; движется по таймеру
GuiControl,Hide,Pic0
GuiControl,Move,Pic0,x%xnew% y%ynew% +BackgroundTrans
GuiControl,Show,Pic0

  Фон не тянется, но всё равно жуткое мигание получается.  Можно как-то это убрать?

17

Re: AHK: Прозрачность картинок в GUI

Например, разделить на два окна.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18

Re: AHK: Прозрачность картинок в GUI

Есть способ заставить верхнее окно всегда следовать за нижним? Или нужно писать процедуру по отслеживанию первого и перемещению за ним второго?

19

Re: AHK: Прозрачность картинок в GUI

Нужно писать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20

Re: AHK: Прозрачность картинок в GUI

Может проще закурить GDI+?

21

Re: AHK: Прозрачность картинок в GUI

ypppu пишет:

Может проще закурить GDI+?

  Ничего не получилось с AHK x64.

22

Re: AHK: Прозрачность картинок в GUI

А библиотеку GDIp.ahk не пробовали обновить?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: Прозрачность картинок в GUI

Пробовал. Брал ссылку тут http://www.autohotkey.com/board/topic/2 … 45-by-tic/ Там и сейчас та же версия "Gdip standard library v1.45 by tic (Tariq Porter) 07/09/11". А где поискать более новую?

24

Re: AHK: Прозрачность картинок в GUI

Там же, посмотрите внимательнее.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

25

Re: AHK: Прозрачность картинок в GUI

Спасибо, нашёл. Буду разбираться.

26

Re: AHK: Прозрачность картинок в GUI

Мало что понял, но вот так для себя переделал:

x1 := 111
y1 := 111
x2 := 222
y2 := 222
pToken := Gdip_Startup()
Gui, 9: -Caption +E0x80000 +HWNDhwnd1 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui, 9: Show, NA

F1::
gosub, draw
return

draw:
loop, 200
        {
        hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
        hdc := CreateCompatibleDC()
        obm := SelectObject(hdc, hbm)
        G := Gdip_GraphicsFromhdc(hdc)
        Gdip_SetSmoothingMode(G, 4)
        pPen := Gdip_CreatePen(0xff0000FF, 1)
        Gdip_DrawLine(G, pPen, x1, y1, x2, y2)
        Gdip_DeleteBrush(pPen)
        UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
        SelectObject(hdc, obm)
        DeleteObject(hbm)
        DeleteDC(hdc)
        Gdip_DeleteGraphics(G)
        x1 := x1 + 2
        x2 := x2 + 2
        }
Return 
    
~Esc::
Clean:
    Gui 9: Destroy
Return

  Планирую использовать как подпрограмму. Прошу посмотреть не будет ли забиваться память, тормозить и т.п. Может что-то нужно вывести из цикла наружу или вообще убрать?

27

Re: AHK: Прозрачность картинок в GUI

teadrinker пишет:

Нужно писать.

  Совершенно не понятно как это приспособить к окну, которое должно нормально отражаться на экране. Всё равно накладывать новое окно поверх него?

28

Re: AHK: Прозрачность картинок в GUI

Foma пишет:

Может что-то нужно вывести из цикла наружу или вообще убрать?

Правильно так:

draw:
   hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromhdc(hdc)
   Gdip_SetSmoothingMode(G, 4)
   pPen := Gdip_CreatePen(0xff0000FF, 1)
  
   loop, 200
   {
      Gdip_DrawLine(G, pPen, x1, y1, x2, y2)
      UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
      x1 += 2, x2 += 2
      Sleep, 10
   }
   
   Gdip_DeletePen(pPen)
   SelectObject(hdc, obm)
   DeleteObject(hbm)
   DeleteDC(hdc)
   Gdip_DeleteGraphics(G)
   Return 
Foma пишет:

  Совершенно не понятно как это приспособить к окну, которое должно нормально отражаться на экране. Всё равно накладывать новое окно поверх него?

А о каких конкретно окнах идёт речь?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

29 (изменено: Foma, 2014-04-03 21:42:47)

Re: AHK: Прозрачность картинок в GUI

teadrinker пишет:
Foma пишет:

Может что-то нужно вывести из цикла наружу или вообще убрать?

Правильно так:

  Спасибо, учту.

А о каких конкретно окнах идёт речь?

  Я брал код из примера. Там поверх всего создаётся прозрачное окно gui и графика рисуется как бы отдельно от всего. А если мне нужно сделать это в непрозрачном окне с кучей других кнопок и пр?

Для окна с графикой убрал  +AlwaysOnTop, добавил  +Owner, привязав к основному окну. Вроде терпимо получается. Единственное, если сдвигаешь мышкой главное окно, графика остаётся на месте, иногда вне родительского окна,  до тех пор, пока не отпустишь кнопку мыши. Смотрится не очень красиво. Было бы здорово как-то более крепко привязать окно с графикой к родительскому.

30

Re: AHK: Прозрачность картинок в GUI

Приведите свой код.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

31

Re: AHK: Прозрачность картинок в GUI

При смещении главного окна синяя линия не следует за ним до самого отпускания ЛКМ.

x2 := 0
y2 := 0

Gui, 8: Show, x10 y10 w1000 h800, Главное
WinGet,hwnd,ID,Главное

pToken := Gdip_Startup()
Gui, 9: -Caption +E0x80000 +HWNDhwnd1 +LastFound +ToolWindow +OwnDialogs +Owner%hwnd% ;+AlwaysOnTop 
Gui, 9: Show, NA

F1::
gosub, draw
return

draw:
loop, 500
        {
        WinGetPos,xx,yy,ww,hh,Главное
        hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
        hdc := CreateCompatibleDC()
        obm := SelectObject(hdc, hbm)
        G := Gdip_GraphicsFromhdc(hdc)
        Gdip_SetSmoothingMode(G, 4)
        pPen := Gdip_CreatePen(0xff0000FF, 1)
        Gdip_DrawLine(G, pPen, xx, yy, x2, y2)
        Gdip_DeleteBrush(pPen)
        UpdateLayeredWindow(hwnd1, hdc, xx, yy, ww, hh)
        SelectObject(hdc, obm)
        DeleteObject(hbm)
        DeleteDC(hdc)
        Gdip_DeleteGraphics(G)
        xx := xx + 1
        yy := yy + 1
        x2 := x2 + 1
        y2 := y2 + 1
        sleep, 50
        }
Return
    
    
~Esc::
Clean:
    Gui 9: Destroy
Return

32

Re: AHK: Прозрачность картинок в GUI

teadrinker пишет:
Foma пишет:

Может что-то нужно вывести из цикла наружу или вообще убрать?

Правильно так:

  Не стирается предыдущая линия. Получается не движение линии, а рисование трапеции.

33

Re: AHK: Прозрачность картинок в GUI

А толком можете сказать, какого результата хотите добиться?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

34

Re: AHK: Прозрачность картинок в GUI

Полностью "привязать" подвижную графику (в примере линию) к главному окну.  Уже всё получилось, кроме момента перетаскивания окна.  Линия остаётся на месте, даже если под ней уже нет окна. Вплоть до отпускания ЛКМ.

35

Re: AHK: Прозрачность картинок в GUI

Вот пример привязки одного окна к другому:

Width := Height := 300
Gui, Add, Pic, hwndhPic x0 y0 w%Width% h%Height%  ; к этому контролу привяжем окно для рисования
Gui, Show, w%Width% h%Height%

OnMessage(0x3, "WM_MOVE")   ; отслеживаем перемещения окна
OnExit, Exit

; WS_EX_LAYERED := 0x80000, WS_EX_TRANSPARENT := 0x20
Gui, 2:-Caption +E0x80020 +hwndID +Owner1   ; в этом окне будем рисовать
Gui, 2:Show, NA

pToken := Gdip_Startup()
hbm := CreateDIBSection(Width, Height)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromhdc(hdc)
Gdip_SetSmoothingMode(G, 4)

pPen := Gdip_CreatePen(0xff0000FF, 1)   ; карандаш для рисования

x1 := y1 := 0
WinGetPos, x, y,,, ahk_id %hPic%
Loop % Width
{
   Gdip_DrawLine(G, pPen, x1, y1, x2 := x1++, y2 := y1++)
   UpdateLayeredWindow(ID, hdc, x, y, Width, Height)
   Sleep, 10
}
Gdip_DeletePen(pPen)
return

Exit:
   SelectObject(hdc, obm), DeleteObject(hbm)
   DeleteDC(hdc), Gdip_DeleteGraphics(G)
   Gdip_Shutdown(pToken)
   ExitApp

GuiClose:
   ExitApp
   
WM_MOVE()
{
   global
   WinGetPos, x, y,,, ahk_id %hPic%
   UpdateLayeredWindow(ID, hdc, x, y, Width, Height)
}

Рисовать можно также непосредственно в обычном окне, пример:

Width := Height := 300
Gui, Add, Pic, hwndhPic x0 y0 w%Width% h%Height%  ; в этом контроле будем рисовать
Gui, Show, w%Width% h%Height%

OnExit, Exit
OnMessage(0xF, "WM_PAINT")  ; поддержка изображения при перерисовке окна

pToken := Gdip_Startup()
hbm := CreateDIBSection(Width, Height)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromhdc(hdc)
Gdip_SetSmoothingMode(G, 4)

pFillBrush := Gdip_BrushCreateSolid(0xffffffff)   ; кисть для заливки
Gdip_FillRectangle(G, pFillBrush, 0, 0, Width, Height)   ; заливаем белым поле рисования 
Gdip_DeleteBrush(pFrameBrush)

pPen := Gdip_CreatePen(0xff0000FF, 1)   ; карандаш для рисования

hPicDC := GetDC(hPic)  ; получаем контекст контрола, чтобы переносить в него изображение

x1 := y1 := 0
Loop % Width
{
   Gdip_DrawLine(G, pPen, x1, y1, x2 := x1++, y2 := y1++)
   BitBlt(hPicDC, 0, 0, Width, Height, hdc, 0, 0)
   Sleep, 10
}

Gdip_DeletePen(pPen)
return

GuiClose:
   ExitApp
   
Exit:
   ReleaseDC(hPicDC, hPic)
   SelectObject(hdc, obm), DeleteObject(hbm)
   DeleteDC(hdc), Gdip_DeleteGraphics(G)
   Gdip_Shutdown(pToken)
   ExitApp

WM_PAINT()   ; поддержка изображения при перерисовке окна
{
   global
   SetTimer, Timer, -10
   Return

Timer:
   BitBlt(hPicDC, 0, 0, Width, Height, hdc, 0, 0)
   Return
}
+ Когда-то выкладывал здесь более сложный пример рисования в окне.

Анимированная синусоида:

   If !pToken := Gdip_Startup()
   {
      MsgBox, 48, Ошибка GDI+, Убедитесь в наличии gdiplus.dll в вашей системе!
      ExitApp
   }

   OnExit, Exit
   SetBatchLines, -1
   SetWinDelay, 0

   k1 = 52   ; коэффициент частоты
   k2 = 80   ; коэффициент амплитуды
   Width = 492
   Height = 250       ; размеры картинки
   SleepDuration = 6  ; пауза в цикле
   Frame = 3          ; рамка

   H2 := Height//2
   X := (A_ScreenWidth-Width)//2
   Y := (A_ScreenHeight-Height)//2

   DllCall("Winmm\timeBeginPeriod", UInt, 3)

   hbm := CreateDIBSection(Width, Height)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   Gdip_SetSmoothingMode(G, 4)

   pFrameBrush := Gdip_BrushCreateSolid(0xffC4C0B8)  ; кисть для рамки
   pFillBrush := Gdip_BrushCreateSolid(0xffffffff)   ; кисть для заливки
   pGrayPen := Gdip_CreatePen(0xff808080, 1)         ; карандаш для оси
   pBluePen := Gdip_CreatePen(0xff0000ff, 1)         ; карандаш для графика

   Gdip_FillRectangle(G, pFrameBrush, -1, -1, Width+2, Height+2)   ; с запасом
   Gdip_FillRectangle(G, pFillBrush, Frame, Frame, Width-Frame*2-1, Height-Frame*2-1)
   Gdip_DeleteBrush(pFrameBrush)
   Gdip_DrawLine(G, pGrayPen, Frame, H2, Width-Frame-1, H2)

   Gui, Color, 0xECE9D8
   Gui, Add, Pic, x20 y20 w%Width% h%Height% hwndhPic
   Gui, Add, Button, % "x" (Width - 40)//2 " y" 35 + Height " w80 h23 gPause vButton", Start
   Gui, Show, % "w" Width+40 " h" Height + 75

   hPicDC := GetDC(hPic)  ; получаем контекст контрола, чтобы переносить в него изображение
   BitBlt(hPicDC, 0, 0, Width, Height, hdc, 0, 0)  ; переносим рисунок в контекст контрола
   OnMessage(0xF, "WM_PAINT")  ; поддержка изображения при перерисовке окна

   Loop
   {
      i := !i
      x1 := Frame+1
      y1 := Round((-Sin((x1 - Frame - 1)*k1/1000))*k2 + H2)
      While x1 < Width-Frame-2
      {
         DllCall("Sleep", UInt, SleepDuration)
         if !p
            Continue
         x2 := x1 + 1
         y2 := Round((-Sin((x2 - Frame - 1)*k1/1000))*k2 + H2)
         if i
            Gdip_DrawLine(G, pBluePen, x1, y1, x2, y2)
         Else
         {
            end := x2 = Width-Frame-2
            Gdip_FillRectangle(G, pFillBrush, x1-1, Frame+1, end ? 3 : 2, Height-Frame*2-2)
            Gdip_DrawLine(G, pGrayPen, x1-1, H2, end ? x2+1 : x2, H2)
         }
         x1 := x2, y1 := y2
         BitBlt(hPicDC, 0, 0, Width, Height, hdc, 0, 0)
      }
   }

Pause:
   GuiControl,, Button, % (p := !p) ? "Stop" : "Start"
   Return

GuiClose:
GuiEscape:
   ExitApp

Exit:
   Gdip_DeletePen(pGrayPen), Gdip_DeletePen(pBluePen), Gdip_DeleteBrush(pFillBrush)
   ReleaseDC(hPicDC, hPic)
   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)
   Gdip_Shutdown(pToken)
   DllCall("Winmm\timeEndPeriod", UInt, 3)
   ExitApp

WM_PAINT()   ; поддержка изображения при перерисовке окна
{
   global
   SetTimer, Timer, -10
   Return

Timer:
   BitBlt(hPicDC, 0, 0, Width, Height, hdc, 0, 0)
   Return
}

Нажать кнопку "Старт".

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

36

Re: AHK: Прозрачность картинок в GUI

Спасибо, буду разбираться.

37

Re: AHK: Прозрачность картинок в GUI

Немного изменил, чтобы линия двигалась не вдоль себя.  Старая линия не стирается.

x1 := 1
y1 := 2
x2 := 10
y2 := 20
Width := Height := 500
Gui, Add, Pic, hwndhPic x0 y0 w%Width% h%Height%  ; в этом контроле будем рисовать
Gui, Show, w%Width% h%Height%

OnExit, Exit
OnMessage(0xF, "WM_PAINT")  ; поддержка изображения при перерисовке окна

pToken := Gdip_Startup()
hbm := CreateDIBSection(Width, Height)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromhdc(hdc)
Gdip_SetSmoothingMode(G, 4)

pFillBrush := Gdip_BrushCreateSolid(0xffAAAAAA)   ; кисть для заливки
Gdip_FillRectangle(G, pFillBrush, 0, 0, Width, Height)   ; заливаем белым поле рисования 
Gdip_DeleteBrush(pFrameBrush)

pPen := Gdip_CreatePen(0xff0000FF, 1)   ; карандаш для рисования

hPicDC := GetDC(hPic)  ; получаем контекст контрола, чтобы переносить в него изображение

x1 := y1 := 0
Loop, 100
{
   x1 := x1 + 1
   y1 := y1 + 2
   x2 := x2 + 3
   y2 := y2 + 4
   Gdip_DrawLine(G, pPen, x1, y1, x2, y2)
   BitBlt(hPicDC, 0, 0, Width, Height, hdc, 0, 0)
   Sleep, 10
}

Gdip_DeletePen(pPen)
return

GuiClose:
   ExitApp
   
Exit:
   ReleaseDC(hPicDC, hPic)
   SelectObject(hdc, obm), DeleteObject(hbm)
   DeleteDC(hdc), Gdip_DeleteGraphics(G)
   Gdip_Shutdown(pToken)
   ExitApp

WM_PAINT()   ; поддержка изображения при перерисовке окна
{
   global
   SetTimer, Timer, -10
   Return

Timer:
   BitBlt(hPicDC, 0, 0, Width, Height, hdc, 0, 0)
   Return
}

38

Re: AHK: Прозрачность картинок в GUI

Foma пишет:

Старая линия не стирается.

Чтобы понять, как стирать ненужное изображение, см. мой последний пример с синусоидой.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder