Toon posts:

[win32, c++] plaatje naar clipboard, hoe?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een plaatje in m'n geheugen en die moet naar het clipboard. Het plaatje is gewoon een raw buffer met 32bit RGB pixeldata, geen DIB of Bitmap ofzoiets.

Ik heb nu dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int PutImageInClipboard( unsigned int *pixelData, int width, int height ) 
{ 
    BITMAPINFO bmi; 
    ZeroMemory(&bmi,sizeof(BITMAPINFO)); 
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
    bmi.bmiHeader.biWidth = width; 
    bmi.bmiHeader.biHeight = -height; 
    bmi.bmiHeader.biCompression = BI_RGB; 
    bmi.bmiHeader.biPlanes = 1; 
    bmi.bmiHeader.biBitCount = 32; 

    void *dibData; 
    HBITMAP bitmap = CreateDIBSection(NULL,&bmi,DIB_RGB_COLORS,(void**)&dibData,NULL,0); 

    int dataSize = width*height*4; 
    memcpy(dibData,pixelData,dataSize); 

    if (!OpenClipboard(NULL)) return 1; 
    if (!EmptyClipboard()) return 2; 
    HANDLE handle = SetClipboardData(CF_BITMAP,bitmap); 
    if (!handle) return 3; 
    if (!CloseClipboard()) return 4; 
    DeleteObject(bitmap); 
    return 0; 
}
Maar die werkt niet ;(
Dat wil zeggen de functie returnt wel 0, maar het clipboard bevat daarna geen geldige image (kan geen paste doen in photoshop of andere progs). Heb ook geprobeerd om die DeleteObject op het eind te commenten, misschien dat daardoor iets blijft bestaan wat nu verloren gaat, maar dat maakte geen veschil.

Ik heb ook bij SetClipboardData CF_DIB gebruikt in plaats van CF_BITMAP, maar dan is de handle die ik terugkrijg NULL.

Weet iemand hoe het wel moet? :?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Even de docs van CreateDIBSection lezen:
You cannot paste a DIB section from one application into another application.
Je zult dus een gewone bitmap aan moeten maken met CreateBitmap of CreateCompatibleBitmap, en dan de bits uploaden naar die bitmap met SetDIBits

[ Voor 12% gewijzigd door .oisyn op 25-02-2005 12:07 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ah, heb het aan de praat gekregen met CreateBitmap, thanks!

Nog wel een vraagje: in msdn staat "However, for performance reasons applications should use CreateBitmap to create monochrome bitmaps and CreateCompatibleBitmap to create color bitmaps".

Nu gebruik ik het in principe altijd voor 32 bit (X)RGB plaatjes, maar die CreateCompatibleBitmap vereist weer een HDC en die heb ik niet. En met CreateCompatibleDC kun je een HDC maken die "compatible with the application's current screen" is, maar dat wil ik ook niet, het mag niet van je scherm instellingen afhangen. Iemand met een 16 kleuren windows (voor zover dat nog voorkomt) moet natuurlijk net zo goed een 32 bit plaatje (vanuit memory) in z'n clipboard kunnen zetten. Kan ik er vanuit gaan dat 't met CreateBitmap wel goed zit? (desnoods niet met maximale performance)

(edit) hmmm het lijkt toch niet helemaal in orde, die CreateBitmap failt regelmatig. Is er een solide manier om via CreateCompatibleBitmap een bitmap te maken die niet van de user z'n desktop settings afhangt??

[ Voor 14% gewijzigd door Verwijderd op 25-02-2005 13:22 ]


Verwijderd

Topicstarter
Heb nog van alles geprobeerd met CreateCompatibleBitmap en GlobalAlloc en weet ik wat allemaal, maar ik krijg het met geen mogelijkheid aan de praat ;(

Iemand nog een gouden tip of misschien voorbeeld code hoe dit moet?