firex
AutoIT Гуру
- Сообщения
- 943
- Репутация
- 208
Что то я запутался совсем. Создаем GUI окно(в проекте все работает, а вот тут прозрачность вообще исчезла, но думаю принцип будет понятен):
Весь фон битмапа розовый, он становится прозрачным без проблем. Но тут мы сталкиваемся со встречной проблемой:
Стоит нам прозрачность карандаша изменить на 20(в данный момент FF), как "вся прозрачность" заливается нашим 0xfc0fc0.
Собственно суть проблемы:
Есть окно, на него рисуется битмап, необходимо определенный цвет битмапа делать прозрачным(как тут) и, если на битмапе уже есть прозрачность - !оставить! ее.
Заранее спасибо.
P.S. Имеющаяся прозрачность заливается только в том случае, если 0<< прозрачность << 255 (это как есть в настоящий момент, и этого не должно быть)
Добавлено:
firex [?]
Добавлено:
Посидел ночь и кое что придумал. Накидал спеша, требуется большое допиливание для оптимизации.
Код:
#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