2016-07-06 8 views
0

クリップボードに保存されているビットマップ、つまりペイントなどをコピーします。次のように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() 

外部関数GetclipboardDataため

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" 

()2(ビットマップ)は常にゼロときを返すので、私は、値8(BITMAPINFO)を使用しGlobalLock関数を呼び出します。

今はBlobでBitmapinfoを取得していますが、保存できません。 イメージは常に破損していると言います。 なぜ私はbitmapinfoからビットマップを抽出したかったのでしょうか(これが可能であれば)、私はこのBlobMidのすべてをof_writeblob関数で試したのです。

ここで "http://www.topwizprogramming.com/freecode_bitmap.html"はbitmapinfoを作成していますが、blobheaderの長さは14であるため、そのように動作するかもしれませんが、ファイルはまだ破損しています。情報には実際のビットマップではなく情報のみが含まれていると思います。

誰もこれを解決したことがありますか、それとも私が使いやすいDLLがありますか?

編集:topwizサンプルでは、​​ヘッダー、情報、実際のビットマップで完全なビットマップを作成しているので、私の試行は失敗するとしか思えません。 主な問題は、なぜパラメータが2のgetclipboarddataを呼び出すときにGloballock関数がゼロを返すのかです。

答えて

0

だから、誰かが興味を持っていれば、もっと楽になりました。 まず、ビットマップを使用してGlobalLockを呼び出す必要はありません.GitLockはすでにHBitmapへのハンドルを提供しているからです。そのハンドルで作業すると、破損したファイルで解決されます(globalsizeを呼び出すとクラッシュします)。 また、ヘッダーとbitmapinfoをhbitmapのblobと一緒に追加しようとしましたが、破損したファイルが作成されました。

私が今行ったことは、C++(ビジュアルスタジオ)で.dllを作成し、その関数をpfc_messagerouterで呼び出すことです。 Download

(ビットマップファイルがcの下に保存されています:\一時\のtest.bmpは、あなたがボタンのクリックイベントでそれを変更することができます)

ここでは、少しのサンプルをダウンロードすることができます
関連する問題