Habs jetzt auch nicht ausprobiert, aber wenn man mehrere Scripte hat, reicht 1 Kompilierte Exe, von der aus die anderen Scripte gestartet werden können
[autoit]Run(@AutoItExe & ' /AutoIt3ExecuteScript Script1.au3'
[/autoit]Habs jetzt auch nicht ausprobiert, aber wenn man mehrere Scripte hat, reicht 1 Kompilierte Exe, von der aus die anderen Scripte gestartet werden können
[autoit]Run(@AutoItExe & ' /AutoIt3ExecuteScript Script1.au3'
[/autoit]Sowas ist mir nicht bekannt.
Welche CPU-Auslastung hat denn dein Script?
Du kannst z.B. mit _GDIPlus_GraphicsSetInterpolationMode (GDIp.au3) oder _GDIPlus_GraphicsSetSmoothingMode schnellere Algorithmen einstellen.
Meinst du das?
Du musst zuerst die Matrix zum Drehmittelpunkt verschieben, dann Drehen und dann wieder zurückverschieben
[autoit]_GDIPlus_MatrixTranslate($hMatrix, $iWidth / 2, $iHeight / 2)
_GDIPlus_MatrixRotate($hMatrix, $iAngle)
_GDIPlus_MatrixTranslate($hMatrix, -$iWidth / 2, -$iHeight / 2)
E
hätte jetz nicht gedacht, dass das "löschen" von gezeichneten linien so kompliziert sein würde...
Betrachte GDI+ wie ein Grafikprogramm. Wenn du z.B. in MSPaint ein Foto hast und einen roten Strich drauf malst, wie löschst du diesen, ohne die "Rückgangig" Funktion zu benutzen?
Nimm für den Anfang keine transparenten Fenster und werde mit den einfachen Zeichenfunktionen (DrawLine, FillRect, DrawImage...) vertraut.
Dann mach ein paar Versuche mit Backbuffer und RegisterMsg ($WM_PAINT)
Hier ein gutes Tutorial: Gdi+ Tutorial [Part 5]
Um GDI+ auf LayeredWindows zu benutzen, bedarf es schon eines gewissen Grundverständnisses und gehört schon eher zum Expertenlevel.
Deshalb mach mal das Tutorial durch und versuch dich dann an einfachen Spielen wie Pong oder Snake
E
$iWidth und $iHeight geben einfach die Größe des Fensters an
Und sind in diesem Fall das gleiche wie @DesktopWidth bzw. @DesktopHeight
Vielleicht solltest du zuerst mit etwas leichterem üben, bevor du dich über so ein schwieriges Script hermachst
Ich mach das immer mit einem Label hinter der Grafik.
Damit das Label die Grafik nicht stört, muss man SS_OwnerDraw Style angeben
GUICtrlCreateLabel("", X, Y, W, H, 0x0000000D)
[/autoit]Und mit GuiCtrlSetOnEvent kann man dann die gewünschte Funktion zuweisen
E
Rein theoretisch musst du nur in der Farbe 0xFFABCDEF den alten Strich übermalen.
Das klappt jedoch nicht immer. Wenn ich mich recht erinnere, dann geht das zwar mit FillRect, aber nicht mit FillEllipse oder DrawLine!
GraphicsClear scheint auch nicht zu funktionieren... so als ob Windows nicht immer 100% die richtige Farbe erwischt
Probier mal das hier:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
HotKeySet("{ESC}", "_Exit")
[/autoit] [autoit][/autoit] [autoit]$iWidth = @DesktopWidth
$iHeight = @DesktopHeight
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGui = GUICreate("", $iWidth, $iHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TRANSPARENT))
GUISetState()
$aMPos_Old = MouseGetPos()
[/autoit] [autoit][/autoit] [autoit]While Sleep(10)
$aMPos = MouseGetPos()
If $aMPos[0] <> $aMPos_Old[0] Or $aMPos[1] <> $aMPos_Old[1] Then
_UpdateWindow($hGui, $iWidth, $iHeight, $aMPos)
$aMPos_Old = $aMPos
EndIf
WEnd
Func _UpdateWindow($hWnd, $iW, $iH, $aMPos)
Local $tSize = DllStructCreate("long X;long Y")
DllStructSetData($tSize, "X", $iW)
DllStructSetData($tSize, "Y", $iH)
Local $tSource = DllStructCreate("long X;long Y")
[/autoit] [autoit][/autoit] [autoit]Local $tBlendI = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
DllStructSetData($tBlendI, "Alpha", 0xFF)
DllStructSetData($tBlendI, "Format", 1)
Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphics)
Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hPen = _GDIPlus_PenCreate(0xFFFF0000, 2)
_GDIPlus_GraphicsDrawLine($hContext, $iW / 2, $iH / 2, $aMPos[0], $aMPos[1], $hPen)
Local $hDC = _WinAPI_GetDC($hWnd)
Local $hDCS = _WinAPI_CreateCompatibleDC($hDC)
Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
Local $hOrig = _WinAPI_SelectObject($hDCS, $hBmp)
_WinAPI_UpdateLayeredWindow($hWnd, $hDC, 0, DllStructGetPtr($tSize), $hDCS, DllStructGetPtr($tSource), 0, DllStructGetPtr($tBlendI), 2)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_PenDispose($hPen)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsDispose($hContext)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)
_WinAPI_SelectObject($hDCS, $hOrig)
_WinAPI_DeleteObject($hBmp)
_WinAPI_ReleaseDC($hWnd, $hDC)
EndFunc ;==>_UpdateWindow
Func _Exit()
_GDIPlus_Shutdown()
GUIDelete($hGui)
Exit
EndFunc ;==>_Exit
Es funktioniert übrigens auch so:
[autoit]_GDIPlus_GraphicsDrawImageRectRect($buffer, $bk, $x, $y, 431, 400, 0, 0, 832, 800)
[/autoit]Hier das Beispiel, was genau _GDIPlus_GraphicsDrawImageRectRect macht:
Cursortasten zum bewegen; F1 - F4 zum ändern der Größe
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]$iX = 0
$iY = 0
$iW = 100
$iH = 100
HotKeySet("{UP}", "_Move")
HotKeySet("{DOWN}", "_Move")
HotKeySet("{LEFT}", "_Move")
HotKeySet("{RIGHT}", "_Move")
HotKeySet("{F1}", "_Size")
HotKeySet("{F2}", "_Size")
HotKeySet("{F3}", "_Size")
HotKeySet("{F4}", "_Size")
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\back.png")
[/autoit] [autoit][/autoit] [autoit]$hGui_SRC = GUICreate("Quelle", 431, 400, 0, 0)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$hGFX_SRC = _GDIPlus_GraphicsCreateFromHWND($hGui_SRC)
$hBMP_SRC_Buf = _GDIPlus_BitmapCreateFromGraphics(431, 400, $hGFX_SRC)
$hGFX_SRC_Buf = _GDIPlus_ImageGetGraphicsContext($hBMP_SRC_Buf)
GUISetState()
$hGui_DST = GUICreate("Ziel", 200, 200, 450, 0)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$hGFX_DST = _GDIPlus_GraphicsCreateFromHWND($hGui_DST)
$hBMP_DST_Buf = _GDIPlus_BitmapCreateFromGraphics(200, 200, $hGFX_DST)
$hGFX_DST_Buf = _GDIPlus_ImageGetGraphicsContext($hBMP_DST_Buf)
GUISetState()
$hPen = _GDIPlus_PenCreate(0xFFFF4040, 1)
_Draw()
While 1
Sleep(100)
WEnd
Func _Draw()
_GDIPlus_GraphicsClear($hGFX_SRC_Buf, 0xFF000000)
_GDIPlus_GraphicsDrawImage($hGFX_SRC_Buf, $hImage, 0, 0)
_GDIPlus_GraphicsDrawRect($hGFX_SRC_Buf, $iX, $iY, $iW, $iH, $hPen)
_GDIPlus_GraphicsDrawImage($hGFX_SRC, $hBMP_SRC_Buf, 0, 0)
_GDIPlus_GraphicsClear($hGFX_DST_Buf, 0xFF000000)
_GDIPlus_GraphicsDrawImageRectRect($hGFX_DST_Buf, $hImage, $iX, $iY, $iW, $iH, 0, 0, 200, 200)
_GDIPlus_GraphicsDrawImage($hGFX_DST, $hBMP_DST_Buf, 0, 0)
EndFunc ;==>_Draw
Func _Move()
Switch @HotKeyPressed
Case "{UP}"
$iY -= 1
Case "{DOWN}"
$iY += 1
Case "{LEFT}"
$iX -= 1
Case "{RIGHT}"
$iX += 1
EndSwitch
_Draw()
EndFunc ;==>_Move
Func _Size()
Switch @HotKeyPressed
Case "{F1}"
$iW -= 1
Case "{F2}"
$iW += 1
Case "{F3}"
$iH -= 1
Case "{F4}"
$iH += 1
EndSwitch
_Draw()
EndFunc ;==>_Size
Func _Exit()
_GDIPlus_PenDispose($hPen)
_GDIPlus_ImageDispose($hImage)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsDispose($hGFX_DST_Buf)
_GDIPlus_BitmapDispose($hBMP_DST_Buf)
_GDIPlus_GraphicsDispose($hGFX_DST)
_GDIPlus_GraphicsDispose($hGFX_SRC_Buf)
_GDIPlus_BitmapDispose($hBMP_SRC_Buf)
_GDIPlus_GraphicsDispose($hGFX_SRC)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_Exit
E
So besser?:
[autoit]_GDIPlus_GraphicsDrawImageRectRect($buffer, $bk, 0, 0, 431, 400, -$x, -$y, 832, 800)
[/autoit]Übrigens, das Bild wird nicht gestaucht, es sieht nur so aus, weil vom letzen Schleifendurchlauf noch "Bild Reste" übrig sind
lösch am besten immer den Buffer mit
_GDIPlus_GraphicsClear($buffer, 0xFF000000)
[/autoit]E
Damit keine Missverständnisse aufkommen - von den Dll´s ist nur BassExt.dll von mir; alle anderen sind vom Un4Seen-Team (un4seen.com)
Die Bass-UDF für AutoIt ist von BrettF, Prog@ndy und mir
E
Hier ein Beispielscript eines 31-Band EQs
#include "Bass.au3"
#include "BassExt.au3"
#include "BassFX.au3"
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#AutoIt3Wrapper_UseX64=n
Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]$hGui = GUICreate("31 Band EQ", 1105, 350)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
_GDIPlus_Startup()
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
$hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics(1085, 100, $hGraphics)
$hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
_GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
$hBrush = _GDIPlus_BrushCreateSolid(0xFF00FF00)
_BASS_Startup()
_BASS_FX_Startup()
_BASS_EXT_Startup()
_BASS_Init(0, -1, 44100, 0, "")
_BASS_RecordInit(-1)
$hStream = _BASS_StreamCreate(44100, 2, 0, $STREAMPROC_PUSH, 0)
[/autoit] [autoit][/autoit] [autoit]$aPipe = _BASS_EXT_StreamPipeCreate($hStream, $BASS_EXT_STREAMPROC_PUSH)
_BASS_ChannelPlay($hStream, True)
$hRecord = _BASS_RecordStart(44100, 2, 0, $BASS_EXT_RecordProc, $aPipe[0])
[/autoit] [autoit][/autoit] [autoit]$aFreq = StringSplit("20,25,31.5,40,50,63,80,100,125,160,200,250,315,400,500,630,800,1000,1250,1600,2000,2500,3150,4000,5000,6300,8000,10000,12500,16000,20000", ",")
Global $aFX[$aFreq[0] + 1]
Global $aSlider[$aFreq[0] + 1][2]
$iBW = 0.5
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To $aFreq[0]
$aFX[$i] = _BASS_ChannelSetFX($hRecord, $BASS_FX_BFX_BQF, $i)
_BASS_FXSetParameters($aFX[$i], $BASS_BFX_BQF_PEAKINGEQ & "|" & $aFreq[$i] & "|0|" & $iBW & "|0|0|" & $BASS_BFX_CHANALL)
GUICtrlCreateLabel(_FormatHz($aFreq[$i]), ($i - 1) * 35 + 10, 10, 35, 20, 1)
$aSlider[$i][0] = GUICtrlCreateSlider(($i - 1) * 35 + 10, 30, 28, 200, 10)
$aSlider[$i][1] = GUICtrlGetHandle($aSlider[$i][0])
GUICtrlSetLimit(-1, 150, -150)
GUICtrlSetOnEvent(-1, "_SetEQ")
Next
$aFFT = _BASS_EXT_CreateFFT(96, 0, 0, 1085, 100, 2, True)
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
GUISetState()
While 1
_GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)
_BASS_EXT_ChannelGetFFT($hStream, $aFFT, 6)
If Not @error Then DllCall($ghGDIPDll, "int", "GdipFillPolygon", "handle", $hGfxBuffer, "handle", $hBrush, "ptr", $aFFT[0], "int", $aFFT[1], "int", "FillModeAlternate")
_GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 10, 240)
Sleep(20)
WEnd
Func _SetEQ()
Local $iPos = GUICtrlRead(@GUI_CtrlId) / - 10
For $i = 1 To $aFreq[0]
If @GUI_CtrlId = $aSlider[$i][0] Then
_BASS_FXSetParameters($aFX[$i], $BASS_BFX_BQF_PEAKINGEQ & "|" & $aFreq[$i] & "|" & $iPos & "|" & $iBW & "|0|0|" & $BASS_BFX_CHANALL)
ToolTip($aFreq[$i] & "Hz " & $iPos & "dB")
Return
EndIf
Next
EndFunc ;==>_SetEQ
Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
Local $iCode = BitAND($wParam, 0x0000FFFF)
Local $iPos = BitShift($wParam, 16) / - 10
Local $iHi, $iLo
If $iCode = 5 Then
For $i = 1 To $aFreq[0]
If $lParam = $aSlider[$i][1] Then
_BASS_FXSetParameters($aFX[$i], $BASS_BFX_BQF_PEAKINGEQ & "|" & $aFreq[$i] & "|" & $iPos & "|" & $iBW & "|0|0|" & $BASS_BFX_CHANALL)
ToolTip($aFreq[$i] & "Hz " & $iPos & "dB")
Return $GUI_RUNDEFMSG
EndIf
Next
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_VSCROLL
Func _FormatHz($iHz)
Local $ikHz = Floor($iHz / 1000)
If $ikHz > 0 Then
$iHz = Mod($iHz, 1000)
Return $ikHz & "k" & StringReplace($iHz, "0", "")
Else
Return $iHz
EndIf
EndFunc ;==>_FormatHz
Func _Exit()
_BASS_RecordFree()
_BASS_StreamFree($hStream)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGfxBuffer)
_GDIPlus_BitmapDispose($hBmpBuffer)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_Exit
Das Ergebnis klingt jedoch nicht ganz sauber.
Man müsste einen größeren Buffer verwenden, aber dann steigt die Latenz!
Oder man verwendet BassAsio - dazu muss die Soundkarte jedoch einen Asiotreiber haben...
Ein Beispiel zu Asio findest du in der Bass-Hilfe unter "_BASS_ASIO_ChannelEnable" - _BASS_ChannelSetFX kann dort genauso angewendet werden, wie hier.
E
Hier die Möglichkeit via Bass.dll: [ gelöst ] bass.dll frage zu datei speichern
Hab gar nicht mehr gewusst, daß ich die MemoryBuffer-Funktion bereits in die DownloadProc integriert hatte...
so gehts:
#AutoIt3Wrapper_UseX64=n
#include "Bass.au3"
#include "BassExt.au3"
HotKeySet("{ESC}", "_Exit")
[/autoit] [autoit][/autoit] [autoit]_BASS_Startup()
_BASS_Ext_Startup()
_BASS_Init(0, -1, 44100, 0, "")
$tBuffer = DllStructCreate("byte[10000000]")
$pBuffer = DllStructGetPtr($tBuffer)
$iBuffer = DllStructGetSize($tBuffer)
$aMP3Buffer = _BASS_EXT_MemoryBufferCreate()
[/autoit] [autoit][/autoit] [autoit]$hStream = _BASS_StreamCreateURL("http://dc370.4shared.com/img/777213322/c38560ec/dlink__2Fdownload_2F2v7poYoy_3Ftsid_3D20110910-35650-7cd66ec0/preview.mp3", _
0, $BASS_STREAM_DECODE, $BASS_EXT_DownloadProc, $aMP3Buffer[0]) ;use callback function from bassext.dll
$iLength = _BASS_ChannelGetLength($hStream, $BASS_POS_BYTE)
$iBytes = 0
While $iBytes < $iLength
$iBytes += _BASS_ChannelGetData($hStream, $pBuffer, $iBuffer)
ToolTip(Round($iBytes * 100 / $iLength, 1) & "%" & @CRLF & "MP3 Daten in Buffer: " & Round(_BASS_EXT_MemoryBufferGetSize($aMP3Buffer) / 1024, 1) & "KB")
Sleep(500)
WEnd
$iSize = _BASS_EXT_MemoryBufferGetSize($aMP3Buffer)
$bMP3Data = _BASS_EXT_MemoryBufferGetData($aMP3Buffer, $iSize)
$hFile = FileOpen(@ScriptDir & "\Download.mp3", 18)
FileWrite($hFile, $bMP3Data)
FileClose($hFile)
_Exit()
[/autoit] [autoit][/autoit] [autoit]Func _Exit()
_BASS_StreamFree($hStream)
_BASS_EXT_MemoryBufferDestroy($aMP3Buffer)
_BASS_Free()
Exit
EndFunc ;==>_Exit
E
So wie ich das sehe, versuchst du einem Button mit GuiSetOnEvent eine Funktion zuzuweisen,
Dazu musst du allerdings GuiCtrlSetOnEvent verwenden!
E
Hier findest du den Code einer CallBack Dll von Progandy: http://www.autoitscript.com/forum/topic/83…post__p__604118
theoretisch musst du nur innerhalb der Funktion "DownloadProc" die empfangenen Daten speichern.
entweder direkt mit in FreeBasic, oder ca. so:
Dazu zuerst eine DllStruct in AutoIt erstellen, die genügend Bytes groß ist und deren Pointer als Parameter $User an DownloadProc übergeben.
Dann die empfangenen Daten in den reservierten Speicher schreiben und am Schluß die Struct via FileWrite speichern...
E
Hi
Willst du weißes Rauschen über die PA abspielen und wieder mit einem Messmikro aufnehmen und die Frequenzspektren vergleichen?
Das Rauschen in Echtzeit zu erzeugen geht mit AutoIt nicht.
Die einfachste Variante wäre ein weißes Rauschen als Wav-Datei abzuspielen.
Zum abspielen von Wav-Dateien findest du in der Hilfe genug Beispiele.
Und um das Frequenzspektrum des Eingangs anzuzeigen brauchst du theoretisch nur im Hilfebeispiel "_BASS_EXT_ChannelGetFFT" den Filestream durch einen Recordstream ersetzen (siehe _BASS_RecordStart)
Alternativ zur Wav-Datei fallen mir noch 2 Möglichkeiten ein:
1) _BASS_EXT_MemoryBufferCreate verwenden und Buffer mit weißem Rauschen befüllen
2) Eine CallBack-DLL erstellen, welche in Realtime das Rauschen generiert (Beispiele in der Hilfe unter "Using CallBacks")
Vielleicht bau ich auch irgendwann noch verschiedene Rauschtypen in _BASS_EXT_Generator ein
E
Via CreateIconIndirect und DrawIconEx lassen sich auch BMP-Bilder mit Transparenz laden und darstellen.
Beispiel im Anhang
Habt ihr das Script auch getestet?
Es ging um die Frage, wie man ein GDI+Image zu einem HBitmap umwandeln kann, und die Alphawerte erhalten bleiben.
Das geht, allerdings muss man zum zeichnen DrawIconEx verwenden, denn mit BitBlt wird das nichts.
Und auch für AlphaBlend müsste man das Bild vorher noch umrechnen - oder?
Hier hab ich noch eins für euch:
#include <Constants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
_GDIPlus_Startup()
Global $hBitmap = _CreateBitmap()
Global $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
Global $hGui = GUICreate("Test", 800, 200)
GUISetBkColor(0x394E69)
GUISetState()
Global $hIcon = _WinAPI_CreateIconIndirect($hHBitmap, $hHBitmap)
_WinAPI_DeleteObject($hHBitmap)
Global $hDC = _WinAPI_GetDC($hGui)
Global $hDC_BG = _WinAPI_CreateCompatibleDC($hDC)
Global $hBMP_BG = _WinAPI_LoadImage(0, @ScriptDir & "\Wasserlilien.bmp", $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE)
_WinAPI_SelectObject($hDC_BG, $hBMP_BG)
_WinAPI_BitBlt($hDC, 0, 0, 800, 200, $hDC_BG, 0, 0, $SRCCOPY)
_WinAPI_DeleteDC($hDC_BG)
_WinAPI_DeleteObject($hBMP_BG)
_WinAPI_DrawIconEx($hDC, 0, 0, $hIcon, 800, 200)
_WinAPI_DestroyIcon($hIcon)
_WinAPI_ReleaseDC($hGui, $hDC)
While GUIGetMsg() <> -3
Sleep(10)
WEnd
Func _CreateBitmap()
Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics(800, 200, $hGraphics)
_GDIPlus_GraphicsDispose($hGraphics)
Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000)
Local $hPen = _GDIPlus_PenCreate(0xFF00FF00)
For $i = 1 To 8
_GDIPlus_BrushSetSolidColor($hBrush, BitOR(BitShift($i * 0xFF / 8, -24), 0x000000FF))
_GDIPlus_GraphicsFillEllipse($hContext, ($i - 1) * 100, 10, 100, 100, $hBrush)
Next
_GDIPlus_PenDispose($hPen)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hContext)
Return $hBitmap
EndFunc ;==>_CreateBitmap
; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_CreateIconIndirect
; Description....: Creates an icon or cursor that has the specified size, colors, and bit patterns.
; Syntax.........: _WinAPI_CreateIconIndirect ( $hBitmap, $hMask [, $XHotspot [, $YHotspot [, $fIcon]]] )
; Parameters.....: $hBitmap - Handle to the icon color bitmap.
; $hMask - Handle to the icon bitmask bitmap.
; $XHotspot - Specifies the x-coordinate of a cursor's hot spot. If creates an icon, the hot spot is always in
; the center of the icon, and this member is ignored.
; $YHotspot - Specifies the y-coordinate of the cursor's hot spot. If creates an icon, the hot spot is always in
; the center of the icon, and this member is ignored.
; $fIcon - Specifies whether creates an icon or a cursor, valid values:
; |TRUE - Creates an icon. (Default)
; |FALSE - Creates a cursor.
; Return values..: Success - Handle to the icon or cursor that is created.
; Failure - 0 and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: The system copies the bitmaps before creating the icon or cursor. Because the system may temporarily
; select the bitmaps in a device context, $hBitmap and $hMask should not already be selected into a device context.
; The application must continue to manage the original bitmaps and delete them by _WinAPI_DeleteObject() when they
; are no longer necessary.
; Related........:
; Link...........: @@MsdnLink@@ CreateIconIndirect
; Example........: Yes
; ===============================================================================================================================
Func _WinAPI_CreateIconIndirect($hBitmap, $hMask, $XHotspot = 0, $YHotspot = 0, $fIcon = 1)
[/autoit] [autoit][/autoit] [autoit]Local $tICONINFO = DllStructCreate($tagICONINFO)
[/autoit] [autoit][/autoit] [autoit]DllStructSetData($tICONINFO, 1, $fIcon)
DllStructSetData($tICONINFO, 2, $XHotspot)
DllStructSetData($tICONINFO, 3, $YHotspot)
DllStructSetData($tICONINFO, 4, $hMask)
DllStructSetData($tICONINFO, 5, $hBitmap)
Local $Ret = DllCall('user32.dll', 'ptr', 'CreateIconIndirect', 'ptr', DllStructGetPtr($tICONINFO))
[/autoit] [autoit][/autoit] [autoit]If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return $Ret[0]
EndFunc ;==>_WinAPI_CreateIconIndirect
und das ist das Ergebnis:autoit.de/wcf/attachment/14121/
Die Alphawerte der einzelnen Kreise bleiben doch erhalten...
E
Heute wurde in der Shoutbox quasi danach gefragt, wie man mit GDI ein transparentes GDI+Bild zeichnen kann
Dies ist möglich mit DrawIcon:
#include <GDIPlus.au3>
#include <WinAPI.au3>
_GDIPlus_Startup()
Global $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\autoit_logo_gtaspider.png")
Global $iImageW = _GDIPlus_ImageGetWidth($hImage)
Global $iImageH = _GDIPlus_ImageGetHeight($hImage)
Global $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
Global $hGui = GUICreate("Test", $iImageW, $iImageH)
GUISetBkColor(0x394E69)
GUISetState()
Global $hIcon = _WinAPI_CreateIconIndirect($hHBitmap, $hHBitmap)
_WinAPI_DeleteObject($hHBitmap)
Global $hDC = _WinAPI_GetDC($hGui)
_WinAPI_DrawIconEx($hDC, 0, 0, $hIcon, $iImageW, $iImageH)
_WinAPI_DestroyIcon($hIcon)
_WinAPI_ReleaseDC($hGui, $hDC)
While GUIGetMsg() <> -3
Sleep(10)
WEnd
; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_CreateIconIndirect
; Description....: Creates an icon or cursor that has the specified size, colors, and bit patterns.
; Syntax.........: _WinAPI_CreateIconIndirect ( $hBitmap, $hMask [, $XHotspot [, $YHotspot [, $fIcon]]] )
; Parameters.....: $hBitmap - Handle to the icon color bitmap.
; $hMask - Handle to the icon bitmask bitmap.
; $XHotspot - Specifies the x-coordinate of a cursor's hot spot. If creates an icon, the hot spot is always in
; the center of the icon, and this member is ignored.
; $YHotspot - Specifies the y-coordinate of the cursor's hot spot. If creates an icon, the hot spot is always in
; the center of the icon, and this member is ignored.
; $fIcon - Specifies whether creates an icon or a cursor, valid values:
; |TRUE - Creates an icon. (Default)
; |FALSE - Creates a cursor.
; Return values..: Success - Handle to the icon or cursor that is created.
; Failure - 0 and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: The system copies the bitmaps before creating the icon or cursor. Because the system may temporarily
; select the bitmaps in a device context, $hBitmap and $hMask should not already be selected into a device context.
; The application must continue to manage the original bitmaps and delete them by _WinAPI_DeleteObject() when they
; are no longer necessary.
; Related........:
; Link...........: @@MsdnLink@@ CreateIconIndirect
; Example........: Yes
; ===============================================================================================================================
Func _WinAPI_CreateIconIndirect($hBitmap, $hMask, $XHotspot = 0, $YHotspot = 0, $fIcon = 1)
[/autoit][autoit][/autoit][autoit]Local $tICONINFO = DllStructCreate($tagICONINFO)
[/autoit][autoit][/autoit][autoit]DllStructSetData($tICONINFO, 1, $fIcon)
DllStructSetData($tICONINFO, 2, $XHotspot)
DllStructSetData($tICONINFO, 3, $YHotspot)
DllStructSetData($tICONINFO, 4, $hMask)
DllStructSetData($tICONINFO, 5, $hBitmap)
Local $Ret = DllCall('user32.dll', 'ptr', 'CreateIconIndirect', 'ptr', DllStructGetPtr($tICONINFO))
[/autoit][autoit][/autoit][autoit]If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return $Ret[0]
EndFunc ;==>_WinAPI_CreateIconIndirect
(Das Bild "autoit_logo_gtaspider.png" ist das AutoIt.de-Logo ganz oben)
E