ich möchte ´n Image direkt auf´m Desktop ausgeben
Code: Alles auswählen
Procedure ScreenDraw(ImgNr, x, y) ;- Image aufs Desktop malen
Protected Br, hdcDesktop, Ho
If IsImage(ImgNr)
hdcDesktop = GetDC_(GetDesktopWindow_()) ;Ziel-Handle
Br = ImageWidth(ImgNr) : Ho = ImageHeight(ImgNr) ;Ziel-Größe
Debug "Pos = " + Str(x) + " / " + Str(y) + ", Size = " + Str(Br) + " x " + Str(Ho)
hdc = StartDrawing(ImageOutput(ImgNr)) ;Quell-Handle
res = BitBlt_(hdcDesktop, x, y, Br, Ho, hdc, 1, 1, #SRCCOPY)
Debug "Result = "+Str(res)
StopDrawing()
ReleaseDC_(GetDesktopWindow_(), hdcDesktop) ;DC zum Desktop freigeben
Else : Debug "no Image"
EndIf
EndProcedure
GetClipboardImage(1)
ScreenDraw(1, 2000, 100)
Weiß wer, wie´s geht ?
Das Gegenstück -ScreenShot- klappt wunderbar:
Code: Alles auswählen
;Modul ScreenShot Version 1.02 vom 20.10.2017
;
;Funktion: erstelle Image vom aktuellen Desktop(-Ausschnitt) !!eigenes Startdrawing() !!
;
;Aufruf: ImageNr = ScreenShot({x, y {, b, h {, Bits}}})
; x, y: Start-Position (Pixel vom linker und von oberen Monitor-Seite)
; wenn nicht angegeben, so beginnt ScreenShot an oberer, linker Monitorecke
; b, h: Breite und Höhe [Pixel]
; wenn nicht angegeben, so wird vollständiger Desktop (auch über mehrere Monitore) benutzt
; Bits: Tiefenangabe, gültige Werte können sein: 1, 2, 4, 8, 16, 24 oder 32 Bit.
; wenn nicht angegeben, so wird 24 benutzt
;
; Diese Funktion liefert die #ImageNr des generierten Images
;
;#jaPBeExt exit
Procedure ScreenShot(x = 0, y = 0, b = 0, h = 0, Bits = 24);- liefert #Image mit aktuellem Desktop(Ausschnitt)-Inhalt !!eigenes Startdrawing() !!
Protected *DeskTop, Bitmap, DeskTop_DC, hdcMem
If b <1 Or h <1 : x = 0 : y = 0 ;Breite oder Höhe nicht definiert: gesammten Desktop benutzten
b = GetSystemMetrics_(#SM_CXVIRTUALSCREEN);GesammtBreite (über alle Monitore)
h = GetSystemMetrics_(#SM_CYVIRTUALSCREEN);GesammtHöhe (über alle Monitore)
EndIf
If x<0 : x = 0 : EndIf : If y<0 : y = 0 : EndIf
*DeskTop = GetDesktopWindow_()
DeskTop_DC = GetDC_(*DeskTop)
Bitmap = CreateCompatibleBitmap_(DeskTop_DC, b, h)
hdcMem = CreateCompatibleDC_(DeskTop_DC)
SelectObject_(hdcMem, Bitmap)
BitBlt_(hdcMem, 0, 0, b, h, DeskTop_DC, x, y, #SRCCOPY)
DeleteDC_(hdcMem)
ReleaseDC_(*DeskTop, DeskTop_DC)
x = CreateImage(#PB_Any, b, h, Bits);x hier mißbraucht als #ImgNr
StartDrawing(ImageOutput(x))
DrawImage(Bitmap, 0, 0)
StopDrawing()
ReleaseDC_(hdcMem,DeskTop_DC)
DeleteObject_(Bitmap)
DeleteDC_(DeskTop_DC)
ProcedureReturn x ;Rückgabewert = #ImageNr
EndProcedure
;Test-Routine
;img=ScreenShot(10,10,500,500)
;SetClipboardImage(img)