2016-07-06 3 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() 나는 값 8 (BITMAPINFO)를 사용하기위한
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 (비트 맵)는 항상 0시를 반환하기 때문에 GlobalLock 함수를 호출합니다.

그래서 지금은 Blob에서 Bitmapinfo를 얻고 있지만 저장할 수는 없습니다. 항상 이미지가 손상되었다고 말합니다. bitmapinfo에서 비트 맵을 추출하고 싶었 기 때문에 of_writeblob 함수에서이 BlobMid를 모두 시도한 이유가 있습니다.

여기에서 "http://www.topwizprogramming.com/freecode_bitmap.html"은 bitmapinfo를 만들고 blobheader의 길이는 14이므로 해당 방법이 작동한다고 생각했지만 파일은 여전히 ​​손상되었습니다. 정보에는 실제 비트 맵이 아니라 정보 만 포함되어 있다고 생각합니다.

아무도이 문제를 해결하지 못 했나요? 아니면 단순히 사용할 수있는 DLL이 있습니까?

편집 : topwiz 샘플에서 헤더, 정보 및 실제 비트 맵이 포함 된 전체 비트 맵을 작성하므로 내 시도가 실패 할 수 있습니다. 그래서 주요 문제는 Globallock 함수가 매개 변수 2를 사용하여 getclipboarddata를 호출 할 때 제로를 반환하는 이유입니다.

답변

0

그래서 관심이있는 경우 좀 더 생각났습니다. 먼저 HBL 맵 핸들을 제공하기 때문에 비트 맵을 사용하여 GlobalLock을 호출 할 필요가 없습니다. 이 핸들로 작업해도 손상된 파일에서 해결되지만 (globalsize를 호출 할 때 충돌이 발생합니다). 또한 hbitmap에서 blob과 함께 헤더와 bitmapinfo를 추가하려고 시도했지만 손상된 파일도 생성되었습니다.

내가 한 것은 .dll을 C++ (Visual Studio)에서 만들고 pfc_messagerouter에서이 함수를 호출하는 것입니다. Download

(비트 맵 파일이 C 아래에 저장됩니다 : \ 임시 \의 test.bmp, 당신은 버튼의 클릭 된 이벤트에서 변경할 수 있습니다)

는 여기에서 약간의 샘플을 다운로드 할 수 있습니다