Bitmap und Text vom ClipBoard

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Suco-X

Betreff: Bitmap und Text vom ClipBoard

BeitragMi, Jan 04, 2006 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Ich habe hier zwei Funktionen gebastelt, mit denen man Text oder Bilder aus dem Clipboard auslesen kann.
Der Text oder das Bild müssen zuvor in den Speicher kopiert werden (Rechtsklick/Graikf/Text) kopieren und das Testprogram liest es dann aus.
Ihr könnt es ja mal austesten, ist noch nicht Final. Wenn das ganze funktioniert, werde ich wohl mal eine Api Lib mit allen nützlichen Funktionen machen, die man so braucht.

Code: [AUSKLAPPEN]

Rem

Clipboard functions by Suco-X

End Rem

Strict



Extern "Win32"
   Function OpenClipboard(hwnd:Int)
   Function CloseClipboard()
   Function GetClipboardData:Byte Ptr(Format:Int)
   Function CreateCompatibleDC(hdc:Int)
   Function SelectObject(hdc:Int, obj:Int)
   Function CreateCompatibleBitmap(hdc:Int, width:Int, height:Int)
   Function GetPixel(dc:Int, x:Int, y:Int)
   Function CreateDIBSection(hdc:Int, pbmi:Byte Ptr, usage:Int, Bits:Byte Ptr, hSection:Int, Offset:Int)
   Function GetDIBits(hdc:Int, bitmap:Int, Start:Int, Num:Int, bits:Byte Ptr, lpbi:Byte Ptr, usage:Int)
   Function DeleteDC(hdc:Int)
End Extern



?Win32

   Type BITMAPINFO
   
      Field biSize:Int
      Field biWidth:Int
      Field biHeight:Int
      Field biPlanes:Short
      Field biBitCount:Short
      Field biCompression:Int
      Field biSizeImage:Int
      Field biXPelsPerMeter:Int
      Field biYPelsPerMeter:Int
      Field biClrUsed:Int
      Field biClrImportant:Int
   
      
      Field R:Byte
      Field G:Byte
      Field B:Byte
      Field Res:Byte
   End Type
   
   Const CF_TEXT = $01
   Const CF_BITMAP = $02
   Const CF_DIB = 8
   
   
   Function TextFromClipboard:String()
   
      If Not Openclipboard(0)
         Return ""
      EndIf
      
      Local TextBuf:Byte Ptr
      
      TextBuf = GetClipboardData(CF_TEXT)
      CloseClipboard()
      
      Return String.FromCString(TextBuf)
   End Function
   
   
   Function PixmapFromClipboard:TPixmap()
      
      If Not OpenClipboard(0)
         Return Null
      EndIf
      
      Local InfoBuf:Byte Ptr
      Local BitmapBuf:Byte Ptr
      Local TempInfo:BITMAPINFO
      Local DC:Int
      Local FinalPixmap:TPixmap
      
      InfoBuf   = GetClipboardData(CF_DIB)
      BitmapBuf = getClipboardData(CF_BITMAP)
      
      If InfoBuf = Null Or BitmapBuf = Null
         Return Null
      EndIf
   
      TempInfo  = New BITMAPINFO
      MemCopy TempInfo, InfoBuf, SizeOf(TempInfo)
      
      DC = CreateCompatibleDC(0)
   
      FinalPixmap = CreatePixmap(TempInfo.biWidth, TempInfo.biHeight, PF_BGR888)
      
      GetDIBits(DC, Int(BitmapBuf), 0, TempInfo.biHeight, FinalPixmap.PixelPtr(0,0),TempInfo,0)
      
      FinalPixmap = YFlipPixmap(FinalPixmap)
      CloseClipboard()
      DeleteDC(DC)
      Return FinalPixmap
   End Function

?






Graphics 800,600,0


Local ClipPixmap:TPixmap = PixmapFromClipboard()
Local ClipText:String = TextFromClipboard()


If ClipPixmap
   DrawPixmap ClipPixmap,0,0
EndIf

If ClipText
   Print ""
   Print "Clipboard Text gefunden:"
   Print ""
   Print ClipText
   Print ""
EndIf


Flip
WaitKey()




Schreibt mal eure Erfahrungen.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Artemis

BeitragMi, Jan 04, 2006 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
klappt wunderbar
 

gamble

BeitragMi, Jan 04, 2006 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir passiert da gar nichts. Habe ein schwarzes Fenster und im Output wird mir der Quellcode angezeigt.

Suco-X

Betreff: .......

BeitragMi, Jan 04, 2006 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann hast du wohl den Quellcode kopiert..
Entweder du hast ne Bitmap im Speicher oder Text, das Programm liest nur eines von beiden aus und stellt es dar Drawpixmap/Print
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

gamble

BeitragMi, Jan 04, 2006 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt. Ich dachte ich wäre im Desktop-Pixmap Thread Wink Funktioniert jetzt.

d-bug

BeitragSa, Jan 14, 2006 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, und da ich eben so lieb danach gefragt wurde, steuer ich zu dem Thema mal die Write Funktion für Texte bei :

Code: [AUSKLAPPEN]
Extern "Win32"
   Function OpenClipboard(hwnd:Int)
   Function CloseClipboard()
   Function EmptyClipboard()
   Function SetClipboardData(format:Int,hMem:Byte Ptr)
   Function GlobalAlloc:Byte Ptr(uflags:Int,bytes:Int)
   Function GlobalFree(buffer:Byte Ptr )
End Extern

?win32
   Const GMEM_FIXED = 0
   Const CF_TEXT=$01

   Function TextToClipboard (txt:String)
      If txt <> ""
         Local CPTR:Byte Ptr = GlobalAlloc(GMEM_FIXED,Len(txt)+1)
         For Local i = 0 Until Len(txt)
            CPTR[i] = txt[i]
         Next
         CPTR[Len(txt)+1]=0
         If OpenClipboard(0)
            EmptyClipboard()
            SetClipboardData (CF_TEXT,CPTR)
            CloseClipboard()
         EndIf
         If CPTR Then GlobalFree (CPTR)
      EndIf
   End Function
?

'rem
TextToClipboard ("HubbaBubba schmeckt scheisse")
'end rem


So, die ist vom guten alten Birdie aus dem englischen Forum Wink

greetz

[Edit]
Verdammt, ich sah gerade das im englischen Forum bereits eine TextToClipboard Funktion erstellt wurde, passend zu Suco-Xs Funktionen. Embarassed Die ist auch noch kürzer und schneller als die meinige... grmph. guckst du hier : http://www.blitzbasic.com/Comm...opic=53750
[/Edit]
  • Zuletzt bearbeitet von d-bug am So, Jan 15, 2006 0:26, insgesamt einmal bearbeitet
 

Ava

Gast

BeitragSa, Jan 14, 2006 19:00
Antworten mit Zitat
Very Happy
 

#Reaper

Newsposter

BeitragFr, Okt 19, 2007 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist zwar schon etwas länger her:

Danke, Funktioniert soweit sehr gut. Allerdings geht das Kopieren eines Images aus dem Clipboard nicht immer richtig. Das Format unterscheides sich öfters. Wenn man z.B. ein Bild aus Paint kopiert, funktioniert es einwandfrei. Wenn man aber einen Screenshot laden will, braucht man wieder ein anderes Format (und Paint etc. geht dementsprechend nicht mehr...).
Gibt es irgendeine möglichkeit, herauszufinden welches Format uns Windows übergibt?

MfG
#Reaper

PS: Wie sieht es eigentlich mit einer PixmapToClipboard() Funktion aus?
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

BtbN

BeitragFr, Okt 19, 2007 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub, ich werd mich mal an ein OS-Unabhängiges Clipboard-Modul machen, dieser ganze Win-Only kram deprimiert mich.

Blitzcoder

Newsposter

BeitragSa, Okt 20, 2007 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
An was für Linux würde mich auch interessieren. Ich muss mir das mal angucken, verwaltet X oder die WM's das Clipboard?
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)
 

#Reaper

Newsposter

BeitragSa, Okt 20, 2007 0:59
Antworten mit Zitat
Benutzer-Profile anzeigen
@BtbN: Das wäre toll Smile

@Blitzcoder: Irgendwo stand mal was von X, aber scheinbar die einzelnen GUI's (was heißt WM eigentlich? ^^°). Das hier hatte ich schon gefunden: http://developer.gimp.org/api/...oards.html
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

BtbN

BeitragSa, Okt 20, 2007 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Also aus der Zwischenablage lesen klappt schon ganz gut.
Nur schreiben klappt noch nicht so, weil Qt dafür scheinbar eine laufende Event-Loop benötigt, was aber dazu führen würde, dass man keinerlei kontrolle mehr über die Anwendung hat.
 

#Reaper

Newsposter

BeitragSa, Okt 20, 2007 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm.. was hat das mit Qt zu tuen...? o_O

Auch wenns noch mehr OT wird:
@BtbN: Ich arbeite gerade an einem Proggi für eine Netzwerk-Zwischenablage Smile
(Ist halt bislang nur für Windows, auch wegen einem TrayIcon Wink )
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

BtbN

BeitragSa, Okt 20, 2007 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Qt bietet bereits vollkommen OS-Unabhängigen Clipboard-Zugriff.
Will den auf BMax wrappen.
 

#Reaper

Newsposter

BeitragSa, Okt 20, 2007 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhh.. aber dann bekommt man ja Probleme mit denen und ihrer Lizenz, oder..? :-/ Confused
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

BtbN

BeitragSa, Okt 20, 2007 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Die GPL hat damit keinerlei Probleme.

Suco-X

Betreff: ....

BeitragSa, Feb 02, 2008 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich die Funktion zum Speichern von Pixmaps in die Zwischenablage nun selbst brauche, habe ich mich mal wieder ran gemacht und es scheint gut zu klappen.

Code: [AUSKLAPPEN]

Strict

Const CF_BITMAP = $02

Extern "Win32"
   Function OpenClipboard(hwnd:Int)
   Function CloseClipboard()
   Function SetClipboardData(format:Int, mem:Int)
   Function CreateCompatibleDC(hdc:Int)
End Extern


'Der Dank für diese nützliche Funktion gilt Skidracer
Function BitmapFromPixmap24(pix:TPixmap)
   Local x,y
   Local hdc,bm
   Local src:Byte Ptr
   Local bi:BITMAPINFOHEADER
   
   pix=ConvertPixmap(pix,PF_BGR888)
   
   hdc=GetDC(0)
   bm=CreateCompatibleBitmap(hdc,pix.width,pix.height)   
   If Not bm Throw "CreateCompatibleBitmap fehlgeschlagen"
      
   bi=New BITMAPINFOHEADER   
   bi.biSize=SizeOf(bi)
   bi.biWidth=pix.width
   bi.biHeight=-pix.height
   bi.biPlanes=1
   bi.biBitCount=24
   bi.biCompression=BI_RGB
   
   src=pix.pixels
   For y=0 Until pix.height
      SetDIBits hdc,bm,pix.height-y-1,1,src,bi,DIB_RGB_COLORS
      src:+pix.pitch
   Next
   Return bm
EndFunction

   
Function PixmapToClipboard(pixmap:TPixmap)
   Local handle_bitmap:Int
   
   pixmap = ConvertPixmap(pixmap, PF_RGB888)
   
   handle_bitmap = BitmapFromPixmap24(pixmap)
   
   If Not openClipboard(0) Throw "Fehler beim öffnen der Zwischenablage"
   
   EmptyClipboard()
   
   SetClipboardData(CF_BITMAP, handle_bitmap)
   
   CloseClipBoard()
   
   Return True
End Function   



'Ein kleines Beispiel.

Rem
Graphics 800,600,0


Repeat
   Cls
   
   For Local i:Int = 0 Until 200
      SetColor Rand(0,255), Rand(0,255), Rand(0,255)
      DrawRect Rand(0,800), Rand(0,600), 100,100
   Next
   
   If KeyHit(KEY_ENTER)
      PixmapToClipboard(GrabPixmap(0,0,GraphicsWidth(), GraphicsHeight()))
   EndIf
   
   Flip
Until KeyHit(KEY_ESCAPE)
End
End Rem


Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

judos

BeitragDi, März 25, 2008 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm würde mich sehr interessieren obs das auch im blitzbasic geht,
und wenn ja wie?

kenne mich mit bmax eben nicht so aus...

mfg judos

Suco-X

Betreff: ......

BeitragMi, März 26, 2008 0:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Du müsstest dafür eine Userlib verwenden und statt den Pointern Banks benutzen. Im Prinzip sollte es also möglich sein, müsstest dich aber gut mit der Materie auskennen.
Eigentlich sollte es für sowas doch schon Funktionen im Englischen BlitzBasic Bereich geben!?
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group