HDC in Zwischenablage
-
Hi Leute,
ich will ein HDC in die Zwischenablage bekommen.
Nun als HDC geht das ja direkt nicht. Also muss man es ja in eine Bitmap oder DIB umwandeln. Das würd ich vieleicht auch noch hinbekommen. Bloß wenn ich dann das Bitmap hab bekomm ich das nicht in die Zwischenablage.
Ich hab schon das ganze Forum durchsucht inklusive FAQ usw und auch bei google, hab aber nix gefunden. Bloß immer MFC oder Visual C++ oder sonst was. Ich benutz aber nur ganze einfach C++ in der WinAPI, ohne MFC oder andere Erweiterungen.
Vielen Dank schon mal für alle Antworten!MFG
-
-
danke erstmal... es wird mir zwar angezeigt, dass ein Bitmap in der Zwischenablage ist, aber wenn ichs z.B. in einem anderen Programm einfüge wirds nicht dargestellt.. aber ich denke dass das an meiner Umwandlung von hdc nach dib liegt... ich probier das morgen mal noch aus.. hab jetzt keine zeit mehr.
ich schreib euch dann mal mein Ergebnis..
-
so. Also ich hab das HDC jetzt erfolgreich in ein HBITMAP umgewandelt.
Bloß bekomm ich das jetzt nicht richtig in die Zwischenablage.
Der Compiler meckert zwar nicht, und es wird auch angezeigt, dass ein Bitmap in der Zwischenablage ist, aber wenn ich die irgend wo einfügen will, passiert einfach gar nichts. Das lässt mich darauf schließen, dass der Inhalt der Zwischenablage, spirch meine HBITMAP fehlerhaft sein muss.
Hier mein Code:HDC hdc; HDC hdcMem; /// Grafik malen hdc = BeginPaint(hwnd,&ps); Rectangle(hdc,10,10,30,30); /// HDC -> HBITMAP hdcMem = CreateCompatibleDC(hdc); HBITMAP hbitmap = CreateCompatibleBitmap(hdc,40,40); SelectObject(hdcMem,hbitmap); BitBlt(hdcMem,0,0,50,50,hdc,0,0,SRCCOPY); DeleteDC(hdcMem); ///HBITMAP in Zwischenablage OpenClipboard(hwnd); HGLOBAL hglobal; HBITMAP p; hglobal=GlobalAlloc(GPTR|GMEM_FIXED,sizeof(HBITMAP)); p=(HBITMAP)GlobalLock(hglobal); p=hbitmap; GlobalUnlock(hglobal); EmptyClipboard(); SetClipboardData(CF_BITMAP,hglobal); CloseClipboard(); EndPaint(hwnd,&ps);Muss ich da noch mehr oder was anderes in die Ablage kopieren oder ist doch was an der Umwandlung falsch(was eigentlich nicht sein dürfte)?
Ich bin für jede Antwort dankbar...MFG
-
Vor dem Löschen des DC solltest Du Dein Bitmap wieder herauswählen.
HGDIOBJ hOldBitmap = SelectObject(hdcMem,hbitmap); BitBlt(hdcMem,0,0,50,50,hdc,0,0,SRCCOPY); SelectObject(hdcMem, hOldBitmap); DeleteDC(hdcMem);
-
danke für die antwort,
ändert aber nichts...
ich glaub dass der Fehler beim Kopieren in die Zwischenablage liegt...
-
Ja, der ist Quark. Versuchs mal mit einem einfachen
SetClipboardData(CF_BITMAP, hbitmap);und lass das Alloc/Lock/Unlock weg.
Sehr zu empfehlen: http://www.codeproject.com/KB/clipboard/clipspy.aspx
-
juhu das geht!

vielen dank für deine Hilfe
ich hatt iwie gedacht, dass das nicht geht oder MFC wär oder so.. aber es funktioniert
so. für alle dies interessiert hier dann mal mein fertiger Code, der ein HDC in die Zwischenablage speichert:HDC hdc; HDC hdcMem; int SizeX = 40; int SizeY = 40; /// Grafik malen hdc = BeginPaint(hwnd,&ps); Rectangle(hdc,10,10,30,30); /// HDC -> HBITMAP hdcMem = CreateCompatibleDC(hdc); HBITMAP hbitmap = CreateCompatibleBitmap(hdc,SizeX,SizeY); HGDIOBJ hOldBitmap=SelectObject(hdcMem,hbitmap); BitBlt(hdcMem,0,0,SizeX,SizeY,hdc,0,0,SRCCOPY); SelectObject(hdcMem,hOldBitmap);// nicht unbedingt nötig DeleteDC(hdcMem); ///HBITMAP in Zwischenablage OpenClipboard(hwnd); EmptyClipboard(); SetClipboardData(CF_BITMAP,hbitmap); CloseClipboard(); EndPaint(hwnd,&ps);kann man natührlich auch noch in Funktionen packen:
HBITMAP HDC2HBITMAP(HDC hdc,int StartX,int StartY,int SizeX,int SizeY) { HDC hdcMem; hdcMem = CreateCompatibleDC(hdc); HBITMAP hbitmap = CreateCompatibleBitmap(hdc,SizeX,SizeY); HGDIOBJ hOldBitmap=SelectObject(hdcMem,hbitmap); BitBlt(hdcMem,0,0,SizeX,SizeY,hdc,StartX,StartY,SRCCOPY); SelectObject(hdcMem,hOldBitmap);// nicht unbedingt nötig DeleteDC(hdcMem); return hbitmap; } HANDLE BITMAP2CLIPBOARD(HBITMAP hbitmap,HWND hwnd) { HANDLE hreturn; OpenClipboard(hwnd); EmptyClipboard(); hreturn = SetClipboardData(CF_BITMAP,hbitmap); CloseClipboard(); return hreturn; }Damit wär das Thema erledigt und kann geschlossen werden.
MFG