Hi Gang,

Here's a first shot at getting binary data (i.e. an image) onto the Windows
Clipboard. If anyone wants to try it out and let me know if it works for
you, that would be great.

Requires View/Pro or Command (for library access).

Doesn't work on View 1.2.1. Looks like you can't use an image! as a routine
parameter under that version.

--Gregg


REBOL [
    Title:  "Windows Clipboard Library"
    Author: "Gregg Irwin"
    eMail:  [EMAIL PROTECTED]
]

win-clip: context [
    win-user: load/library %user32.dll
    win-gdi: load/library %gdi32.dll

    create-bitmap: make routine! [
        width   [integer!]
        height  [integer!]
        planes  [integer!]
        bits-per-pel [integer!]
        lpv-bits     [image!]
        return: [integer!]      ; HBMP on success, 0 on failure
    ] win-gdi "CreateBitmap"

    CF_TEXT:   1
    CF_BITMAP: 2

    _open: make routine! [
        hwnd-owner [integer!]
        return:    [integer!]
    ] win-user "OpenClipboard"
    ; Returns 0 on failure

    open: does [
        either 0 <> _open 0 [true][false]
    ]

    close: make routine! [
        return: [integer!]
    ] win-user "CloseClipboard"
    ; Returns 0 on failure

    clear: make routine! [
        return: [integer!]
    ] win-user "EmptyClipboard"
    ; Returns 0 on failure

    get-data: make routine! [
        format  [integer!]
        return: [integer!]
    ] win-user "GetClipboardData"
    ; Returns 0 on failure; hData on success

    ; After SetClipboardData is called, the system owns the object
    ; identified by the hMem parameter. The application can read
    ; the data, but must not free the handle or leave it locked.
    set-data: make routine! [
        format  [integer!]
        hMem    [integer!]
        return: [integer!]
    ] win-user "SetClipboardData"

    ; It looks like we either need to clear the clipboard, or write
    ; some text to it via the clipboard scheme, in order for image stuff
    ; to work. What happens is that the DIB rendering format doesn't
    ; update if we don't do that and that is what gets pasted into most,
    ; if not all, apps (even though the BITMAP format is in the clipboard
    ; with our data.
    write: func [data] [
        either not image? data [
            system/words/write clipboard:// form data
        ][
            if open [
                clear
                set-data CF_BITMAP create-bitmap data/size/x data/size/y 1
32 data
                close
            ]
        ]
    ]

]

;win-clip/write "abc"
;win-clip/write to image! layout [button]


;halt


-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to