1

Тема: AHK: GDI+ нарисовать прозрачный элемент поверх другого

Вопрос к знатокам графики.
Следующий код заполняет окно серым цветом и рисует два прямоугольника.
Как нарисовать второй прямоугольник прозрачным относительно первого прямоугольника?
Чтобы, по итогу, получилось так.
https://i.imgur.com/Te7bC05.png

+ открыть спойлер
#include Gdip.ahk

if(!Gdip_Startup())
	msgbox % "Can't start GDI+"

Gui, -Caption +hwndhwnd +E0x80000 ; WS_EX_LAYERED
Gui, Show, W1 H1 Hide


w:=100,h:=100
x:=(A_ScreenWidth-w)//2
y:=(A_ScreenHeight-h)//2

hdc:=CreateCompatibleDC()
hbm:=CreateDIBSection(w, h)
obm:=SelectObject(hdc, hbm)



;Background
;=======================================
bkg_hdc1:=DrawNewPoly(w,h,0xFFeeeeee)
BitBlt(hdc, 0,0, w, h, bkg_hdc1, 0,0,0)
;=======================================


;Green
;=======================================
figure_hdc1:=DrawNewPoly(w,30,0xFFbbeeaa)
BitBlt(hdc, 0,0, w, 30, figure_hdc1, 0,0,0)
;=======================================


;Black
;=======================================
figure_hdc2:=DrawNewPoly(50,30,0x20000000)
BitBlt(hdc, 40,0, 50, 30, figure_hdc2, 0,0,0)
;=======================================


UpdateLayeredWindow(hwnd, hdc, x, y, w, h)
Gui, Show
return


DrawNewPoly(w,h,argb) {
	hbm:=CreateDIBSection(w, h)
	hdc:=CreateCompatibleDC()
	obm:=SelectObject(hdc, hbm)
	g:=Gdip_GraphicsFromHDC(hdc)

	brush:=Gdip_BrushCreateSolid(argb)

	res:=Gdip_FillRectangle(g,brush,0,0,w,h)

	Gdip_DeleteBrush(brush)
	return hdc
}
f1::reload

2

Re: AHK: GDI+ нарисовать прозрачный элемент поверх другого

Ваш код очень неаккуратный, созданные объекты не удаляются.

Gui, -Caption +hwndhGui +E0x80000
Gui, Show, NA
w := h := 100

pToken := Gdip_Startup()
hbm := CreateDIBSection(w, h)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
Gdip_SetSmoothingMode(G, 4)
FillRectangle(G, 0xffeeeeee, 0, 0, w, h)
FillRectangle(G, 0xffbbeeaa, 0, 0, w, 30)
FillRectangle(G, 0x20000000, 40, 0, 50, 30)
UpdateLayeredWindow(hGui, hdc, (A_ScreenWidth - w)//2, (A_ScreenHeight - h)//2, w, h)

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

FillRectangle(G, color, x, y, w, h)  {
   pBrush := Gdip_BrushCreateSolid(color)
   Gdip_FillRectangle(G, pBrush, x, y, w, h)
   Gdip_DeleteBrush(pBrush)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: GDI+ нарисовать прозрачный элемент поверх другого

Я эти операции опустил, а так, спасибо большое за помощь. На офф. форуме тоже самое посоветовали. (передавать pGraphics в функцию)