PowerBuilder - 从剪贴板复制位图
PowerBuilder - Copy Bitmap from the Clipboard
我想从 Paint 等复制保存在剪贴板中的位图。
到目前为止我的代码如下:
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(位图信息),因为在调用 GlobalLock 函数时 2(位图)总是 returns 零。
所以现在我正在获取 Blob 中的位图信息,但无法保存它。
它总是说图像已损坏。
我在 of_writeblob 函数中尝试所有这些 BlobMid 东西的原因是因为我想从位图信息中提取位图(如果可能的话)。
这里“http://www.topwizprogramming.com/freecode_bitmap.html”他们正在创建一个位图信息,而 blobheader 的长度为 14,所以我认为它可能会那样工作,但文件仍然损坏。我猜信息确实只包含信息而不是实际的位图。
有没有人解决过这个问题,或者有没有我可以简单使用的 dll?
编辑:在 topwiz 示例中,他们正在使用 header、信息和实际位图创建完整的位图,所以我猜我的尝试只会失败。
所以主要问题是,为什么在使用参数 2
调用 getclipboarddata 时 Globallock 函数返回零
所以如果有人感兴趣的话,我想出了更多的东西。
首先,您不必使用位图调用 GlobalLock,因为它已经为您提供了 HBitmap 的句柄。尽管使用该句柄也会解析损坏的文件(并在调用 globalsize 时崩溃)。
我还尝试将 header 和位图信息与来自 hbitmap 的 blob 一起添加,但也导致文件损坏。
我现在所做的是用 c++(visual studio) 创建一个 .dll,然后在 pfc_messagerouter 中调用该函数。
您可以在这里下载一个小示例:
Download
(Bitmap文件保存在c:\temp\test.bmp下,可以在Button的点击事件中修改)
我想从 Paint 等复制保存在剪贴板中的位图。
到目前为止我的代码如下:
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(位图信息),因为在调用 GlobalLock 函数时 2(位图)总是 returns 零。
所以现在我正在获取 Blob 中的位图信息,但无法保存它。 它总是说图像已损坏。 我在 of_writeblob 函数中尝试所有这些 BlobMid 东西的原因是因为我想从位图信息中提取位图(如果可能的话)。
这里“http://www.topwizprogramming.com/freecode_bitmap.html”他们正在创建一个位图信息,而 blobheader 的长度为 14,所以我认为它可能会那样工作,但文件仍然损坏。我猜信息确实只包含信息而不是实际的位图。
有没有人解决过这个问题,或者有没有我可以简单使用的 dll?
编辑:在 topwiz 示例中,他们正在使用 header、信息和实际位图创建完整的位图,所以我猜我的尝试只会失败。 所以主要问题是,为什么在使用参数 2
调用 getclipboarddata 时 Globallock 函数返回零所以如果有人感兴趣的话,我想出了更多的东西。 首先,您不必使用位图调用 GlobalLock,因为它已经为您提供了 HBitmap 的句柄。尽管使用该句柄也会解析损坏的文件(并在调用 globalsize 时崩溃)。 我还尝试将 header 和位图信息与来自 hbitmap 的 blob 一起添加,但也导致文件损坏。
我现在所做的是用 c++(visual studio) 创建一个 .dll,然后在 pfc_messagerouter 中调用该函数。 您可以在这里下载一个小示例: Download
(Bitmap文件保存在c:\temp\test.bmp下,可以在Button的点击事件中修改)