【问题标题】:PowerBuilder - Copy Bitmap from the ClipboardPowerBuilder - 从剪贴板复制位图
【发布时间】:2016-07-06 07:18:13
【问题描述】:

我想复制保存在剪贴板中的位图,例如画图等。

到目前为止我的代码如下:

ulong l_handle, l_datasize, l_lock
long l_file
uint i_format
blob lb_blob
n_bitmap ln_bit

l_handle = handle(parent)
OpenClipboard(l_handle)
//2 = Bitmap
//8 = Bitmapinfo
if not IsClipboardFormatAvailable(8) then 
    closeclipboard()
    return
end if
l_handle = GetclipboardData( 8)

l_lock = GlobalLock(l_handle)
if not isnull(l_lock) then
    l_datasize = GlobalSize(l_lock)
    if l_datasize>0 then
        lb_blob = blob(space(l_datasize), EncodingAnsi!)
        ReadClipboardData(lb_blob, l_lock, l_datasize)
        GlobalUnlock(l_handle)
        closeClipboard()

        if not isnull(lb_blob) then
            //l_file = fileopen("c:\temp\test.dib", StreamMode!, Write!, LockReadWrite!, Replace!)

            ln_bit.of_writeblob( "c:\temp\test.bmp", lb_blob)
            ln_bit.of_writeblob( "c:\temp\test1.bmp", BlobMid(lb_blob, 15) )
            ln_bit.of_writeblob( "c:\temp\test2.bmp", BlobMid(lb_blob, 169))
            ln_bit.of_writeblob( "c:\temp\test3.bmp", BlobMid(lb_blob, 14))
            ln_bit.of_writeblob( "c:\temp\test4.bmp", BlobMid(lb_blob, 168))
            //FileWriteEx(l_file, lb_blob)

            //fileclose(l_file)
            //p_1.setpicture(lb_blob)
        end if
    end if
    GlobalUnlock(l_handle)
end if
closeClipboard()

外部函数

Function Ulong GetClipboardData ( &
    uint uFormat&
    ) Library "user32.dll"
    Function boolean OpenClipboard ( &
    long hWndNewOwner &
    ) Library "user32.dll"

Function boolean CloseClipboard ( &
    ) Library "user32.dll"

Function ulong GlobalLock(&
  ulong hMem&
) Library "kernel32.dll"

Function boolean GlobalUnlock( ulong hMem) Library "kernel32.dll"

SUBROUTINE ReadClipboardData(ref blob Destination, ulong Source, ulong&
Length) Library "KERNEL32.DLL" Alias for "RtlMoveMemory"
FUNCTION ulong GlobalSize(ulong hMem) Library "kernel32.dll"
FUNCTION boolean IsClipboardFormatAvailable(ulong format) Library "user32.dll"

对于 GetclipboardData(),我使用值 8 (Bitmapinfo),因为 2 (Bitmap) 在调用 GlobalLock 函数时总是返回零。

所以现在我正在 Blob 中获取 Bitmapinfo,但无法保存它。 它总是说图像已损坏。 我在 of_writeblob 函数中尝试所有这些 BlobMid 内容的原因是因为我想从 bitmapinfo 中提取位图(如果可能的话)。

在这里“http://www.topwizprogramming.com/freecode_bitmap.html”他们正在创建一个位图信息,并且 blobheader 的长度为 14,所以我认为它可能会以这种方式工作,但文件仍然损坏。我猜这个信息只包含信息而不是实际的位图。

有没有人解决过这个问题,或者有一个我可以简单使用的 dll 吗?

编辑:在 topwiz 示例中,他们正在创建带有标题、信息和实际位图的完整位图,所以我猜我的尝试只会失败。 那么问题来了,为什么全局锁函数在调用getclipboarddata参数2时返回零

【问题讨论】:

    标签: image bitmap copy clipboard powerbuilder


    【解决方案1】:

    所以如果有人感兴趣,我想出了更多的东西。 首先,您不必使用位图调用 GlobalLock,因为它已经为您提供了 HBitmap 的句柄。尽管使用该句柄也可以解决损坏的文件(并在调用 globalsize 时崩溃)。 我还尝试将标头和位图信息与来自 hbitmap 的 blob 一起添加,但也导致文件损坏。

    我现在所做的是在 c++(visual studio) 中创建了一个 .dll,并在 pfc_messagerouter 中调用了该函数。 在这里你可以下载一个小样本: Download

    (Bitmap文件保存在c:\temp\test.bmp下,可以在Button的clicked事件中更改)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-17
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多