2016-07-06 110 views
0

我想複製保存在剪貼板中的位圖,即Paint等。PowerBuilder - 從剪貼板複製位圖

到目前爲止我的代碼如下:

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(位圖)總是返回零時調用GlobalLock函數。

所以現在我得到了Blob中的Bitmapinfo,但無法保存它。 它總是說圖像已損壞。 我在of_writeblob函數中嘗試了所有BlobMid內容的原因是因爲我想從bitmapinfo中提取位圖(如果可能的話)。

在這裏「http://www.topwizprogramming.com/freecode_bitmap.html」他們正在創建一個bitmapinfo和blobheader長度爲14,所以我認爲它可能會這樣工作,但該文件仍然受損。我想信息只包含信息而不是實際的位圖。

有沒有人解決過這個問題,還是有一個DLL我可以簡單地使用?

編輯:在topwiz示例中,他們正在創建一個帶有標題,信息和實際位圖的完整位圖,所以我的嘗試只能失敗。 所以,主要問題是,爲什麼Globallock函數返回零時調用getclipboarddata與參數2

回答

0

所以我想了更多的東西,如果有人感興趣。 首先,您不必使用位圖調用GlobalLock,因爲它已經爲您提供了HBitmap的句柄。雖然使用該句柄也可以解決損壞的文件(並在調用globalsize時崩潰)。 我也嘗試過將blob和hbitmap一起添加頭文件和bitmapinfo,但也導致了損壞的文件。

我現在所做的是我在C++(visual studio)中創建了一個.dll,並且我在pfc_messagerouter中調用了該函數。 在這裏,你可以下載一個小樣本: Download

(位圖文件保存在C:\ TEMP \ TEST.BMP,您可以在按鈕的點擊事件改變它)