Что нового

[Элементы GUI, GUI] Прозрачность по заданному цвету

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Что то я запутался совсем. Создаем GUI окно(в проекте все работает, а вот тут прозрачность вообще исчезла, но думаю принцип будет понятен):

Код:
#Include <GDIPlus.au3>
#Include <WinAPIEx.au3>
#Include <APIConstants.au3> ;API Constains

_GDIPlus_Startup()

$_hGUI_Dlg = GUICreate( '', 250, 250, -1, -1, $WS_POPUP, BitOR( $WS_EX_TRANSPARENT, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_LAYERED ))
GUISetBkColor(0xfc0fc0,$_hGUI_Dlg)

_WinAPI_SetLayeredWindowAttributes($_hGUI_Dlg, 0xfc0fc0, 0, $LWA_COLORKEY)

$_hGraphic = _GDIPlus_GraphicsCreateFromHWND( $_hGUI_Dlg )
$_hBitmap = _GDIPlus_BitmapCreateFromGraphics( 250, 250, $_hGraphic )
$_hBuffer = _GDIPlus_ImageGetGraphicsContext($_hBitmap)
_GDIPlus_GraphicsSetSmoothingMode( $_hBuffer, 7 )

DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "handle", $_hBuffer, "int", 4)
; ---
$_hDC = _WinAPI_GetDC($_hGUI_Dlg)
$_hCompatibleDC = _WinAPI_CreateCompatibleDC($_hDC)
GUISetState(@SW_SHOW, $_hGUI_Dlg)


$_hPen = _GDIPlus_PenCreate(0xFFE00000, 1.5)

While 1
	If GUIGetMsg() = -3 Then _
		_Quit()

	_GDIPlus_GraphicsClear($_hBuffer, 0xFFfc0fc0)

	_GDIPlus_GraphicsDrawLine( $_hBuffer, 125, 0, 125, 250, $_hPen )

	$gdibitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_hBitmap)
	_WinAPI_SelectObject($_hCompatibleDC, $gdibitmap)
	_WinAPI_DeleteObject($gdibitmap)
	_WinAPI_BitBlt($_hDC, 0, 0, 250, 250, $_hCompatibleDC, 0, 0, 0x00CC0020) ;0x00CC0020 = $SRCCOPY
	Sleep( 20 )
WEnd

Func _Quit()
	_WinAPI_ReleaseDC($_hGUI_Dlg, $_hDC)
	_WinAPI_ReleaseDC($_hGUI_Dlg, $_hCompatibleDC)
	_WinAPI_DeleteDC($_hDC)
	_WinAPI_DeleteDC($_hCompatibleDC)
	; ---
	_GDIPlus_GraphicsDispose($_hBuffer)
	_GDIPlus_BitmapDispose($_hBitmap)
	_GDIPlus_GraphicsDispose($_hGraphic)
	; ---
	_GDIPlus_Shutdown()
	GuiDelete($_hGUI_Dlg)

	Exit
EndFunc


Весь фон битмапа розовый, он становится прозрачным без проблем. Но тут мы сталкиваемся со встречной проблемой:

Код:
$_hPen = _GDIPlus_PenCreate(0xFFE00000, 1.5)

Стоит нам прозрачность карандаша изменить на 20(в данный момент FF), как "вся прозрачность" заливается нашим 0xfc0fc0.

Собственно суть проблемы:
Есть окно, на него рисуется битмап, необходимо определенный цвет битмапа делать прозрачным(как тут) и, если на битмапе уже есть прозрачность - !оставить! ее.

Заранее спасибо.

P.S. Имеющаяся прозрачность заливается только в том случае, если 0<< прозрачность << 255 (это как есть в настоящий момент, и этого не должно быть)


Добавлено:
Сообщение автоматически объединено:

firex [?]
Имеющаяся прозрачность заливается только в том случае, если 0<< прозрачность << 255
Двусмысленно выразился, прошу прощения, дополнил.
(это как есть в настоящий момент, и этого не должно быть)



Добавлено:
Сообщение автоматически объединено:

Посидел ночь и кое что придумал. Накидал спеша, требуется большое допиливание для оптимизации.

Код:
#Include <GDIPlus.au3>
#Include <WinAPIEx.au3>
#Include <APIConstants.au3> ;API Constains
#include <GUIConstants.au3>

_GDIPlus_Startup()

$_hGUI_Dlg = GUICreate( '', 250, 250, -1, -1, $WS_POPUP, BitOR( $WS_EX_TRANSPARENT, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_LAYERED ))
GUISetBkColor($GUI_BKCOLOR_TRANSPARENT, $_hGUI_Dlg)
GUISetState(@SW_SHOW, $_hGUI_Dlg)

$_hGraphic = _GDIPlus_GraphicsCreateFromHWND( $_hGUI_Dlg )
$_hBitmap = _GDIPlus_BitmapCreateFromGraphics( 250, 250, $_hGraphic )
$_hBuffer = _GDIPlus_ImageGetGraphicsContext($_hBitmap)
;_GDIPlus_GraphicsSetSmoothingMode( $_hBuffer, 2 )
;DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $_hBuffer, "int", 7)
;DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "handle", $_hBuffer, "int", 4)
; ---
$_hDC = _WinAPI_GetDC($_hGUI_Dlg)
$_hCompatibleDC = _WinAPI_CreateCompatibleDC($_hDC)

$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", 250)
DllStructSetData($tSize, "Y", 250)
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", 0)
DllStructSetData($tBlend, "Format", 1)

$_hPen = _GDIPlus_PenCreate(0x70E0E000, 20) ;And after try 22E0E000 :C
While 1
	If GUIGetMsg() = -3 Then _
		_Quit()

	_GDIPlus_GraphicsClear($_hBuffer, 0x00000000)

	_GDIPlus_GraphicsDrawLine( $_hBuffer, 125, 0, 125, 250, $_hPen )

	$gdibitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_hBitmap)
	;_WinAPI_SelectObject($_hCompatibleDC, $gdibitmap)
	_WinAPI_UpdateLayeredWindowEx($_hGUI_Dlg, -1, -1, $gdibitmap)
	;_WinAPI_UpdateLayeredWindow( $_hGUI_Dlg, $_hDC, 0, $pSize, $_hCompatibleDC, $pSource, 0, $pBlend, 0x02 )
	_WinAPI_DeleteObject($gdibitmap)
	;_WinAPI_BitBlt($_hDC, 0, 0, 250, 250, $_hCompatibleDC, 0, 0, $SRCCOPY ); 0x00CC0020) ;0x00CC0020 = $SRCCOPY

	Sleep( 20 )
WEnd

Func _Quit()
	_WinAPI_ReleaseDC($_hGUI_Dlg, $_hDC)
	_WinAPI_ReleaseDC($_hGUI_Dlg, $_hCompatibleDC)
	_WinAPI_DeleteDC($_hDC)
	_WinAPI_DeleteDC($_hCompatibleDC)
	; ---
	_GDIPlus_GraphicsDispose($_hBuffer)
	_GDIPlus_BitmapDispose($_hBitmap)
	_GDIPlus_GraphicsDispose($_hGraphic)
	; ---
	_GDIPlus_Shutdown()
	GuiDelete($_hGUI_Dlg)

	Exit
EndFunc
 
Верх