Bitmap und Text vom ClipBoard
Übersicht

![]() |
Suco-XBetreff: Bitmap und Text vom ClipBoard |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
klappt wunderbar | ||
gamble |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bei mir passiert da gar nichts. Habe ein schwarzes Fenster und im Output wird mir der Quellcode angezeigt. | ||
![]() |
Suco-XBetreff: ....... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Stimmt. Ich dachte ich wäre im Desktop-Pixmap Thread ![]() |
||
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() greetz [Edit] Verdammt, ich sah gerade das im englischen Forum bereits eine TextToClipboard Funktion erstellt wurde, passend zu Suco-Xs Funktionen. ![]() [/Edit] |
||
- Zuletzt bearbeitet von d-bug am So, Jan 15, 2006 0:26, insgesamt einmal bearbeitet
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
![]() |
||
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaub, ich werd mich mal an ein OS-Unabhängiges Clipboard-Modul machen, dieser ganze Win-Only kram deprimiert mich. | ||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@BtbN: Das wäre toll ![]() @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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() (Ist halt bislang nur für Windows, auch wegen einem TrayIcon ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Qt bietet bereits vollkommen OS-Unabhängigen Clipboard-Zugriff.
Will den auf BMax wrappen. |
||
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mhh.. aber dann bekommt man ja Probleme mit denen und ihrer Lizenz, oder..? :-/ ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die GPL hat damit keinerlei Probleme. | ||
![]() |
Suco-XBetreff: .... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group