我呼叫了一個QQ的截圖OCX,該控制元件雙擊時會把圖片復制到粘貼板上,但我想再把粘貼板的圖片保存起來,該怎么做?
Function int CameraSubArea(int utype) LIBRARY "CameraDll.dll"
FUNCTION ulong GetClipboardData(ulong wFormat) LIBRARY "user32.dll"
FUNCTION ulong IsClipboardFormatAvailable(ulong wFormat) LIBRARY "user32.dll"
FUNCTION ulong GlobalLock(ulong hMem) LIBRARY "kernel32.dll"
FUNCTION ulong GlobalUnlock(ulong hMem) LIBRARY "kernel32.dll"
FUNCTION ulong GlobalSize(ulong hMem) LIBRARY "kernel32.dll"
subroutine copymemory(REF blob Destionation,blob Source, long length )library"kernel32.dll"
//subroutine copymemory(REF string Destionation,string Source, long length )library"kernel32.dll"
FUNCTION ulong OpenClipboard(ulong hwnd) LIBRARY "user32.dll"
li_return_msg =CameraSubArea(0)
IF li_return_msg = 1 THEN
if IsClipboardFormatAvailable(2) = 1 then
hGlobal = GetClipBoardData(2)
lp = GlobalLock(hGlobal)
//blobtemp = space(GlobalSize(lp))
//copymemory(ref blbResult,BlobTemp,lp)
GlobalUnlock(hGlobal)
in_bitmap.of_WriteBlob("c:\1.bmp", blob(blbResult))
end if
END IF
在網上找了這么一段,但就是報錯,不行
請高手幫忙一下,謝謝
uj5u.com熱心網友回復:
http://download.csdn.net/source/1626134uj5u.com熱心網友回復:
這個我下了,不好用。不是截整個螢屏,是自定義螢屏。QQ有個控制元件能實作,就像QQ截屏一樣,很好用。
但QQ截屏后是保存到粘貼板的,我要再把粘貼板的資料保存成圖片。
就是不知道怎么保存,在網上找了很久都找不到
請高手們指教一下,謝謝
uj5u.com熱心網友回復:
哪位高手請教一下uj5u.com熱心網友回復:
你給的例子應該行的吧blob blobtemp
if IsClipboardFormatAvailable(2) = 1 then
hGlobal = GetClipBoardData(2)
lp = GlobalLock(hGlobal)
blobtemp = space(GlobalSize(lp))
copymemory(ref blbResult,BlobTemp,lp)
GlobalUnlock(hGlobal)
end if
這個時候 blobtemp 中存的就是BMP圖片的內竄
你可以將picture控制元件看一下
picture.SetPicture(blobtemp)
應該能顯示出圖片來
剩下的就是將Blobtemp中的內容保存到檔案就行了.
uj5u.com熱心網友回復:
這樣報錯呀,有沒有人真正實驗過的呀,指教一下,急呀uj5u.com熱心網友回復:
hGlobal = OpenClipboard(Handle(Parent))hGlobal = GetClipBoardData(1)
lp = GlobalLock(hGlobal)
li_count = GlobalSize(lp)
MemoryCopy(ls_a,lp,li_count)
GlobalUnlock(hGlobal)
CloseClipboard()
如果是以上代碼,就沒問題,ls_a就是粘貼板的文字
但如果是GetClipBoardData(2),改成取圖片的,GlobalLock卻回傳0,不知道為什么
uj5u.com熱心網友回復:
試了, 確實不行.這個方法是拷貝字串的.
用這個方法拷貝圖片非常麻煩.
要用copyimage 拷貝為記憶體圖片,
然后將記憶體圖片再保存為檔案.
uj5u.com熱心網友回復:
能不能貼出具體的代碼,謝謝uj5u.com熱心網友回復:
FUNCTION ulong GetClipboardData(ulong wFormat) LIBRARY "user32.dll"FUNCTION ulong IsClipboardFormatAvailable(ulong wFormat) LIBRARY "user32.dll"
Function long CloseClipboard() Library "user32"
FUNCTION ulong OpenClipboard(ulong hwnd) LIBRARY "user32.dll"
Function ulong CopyImage (ulong handle,long un1,long n1, long n2,long un2) LIBRARY "user32.dll"
ulong hglobal,ll_hbitmap
if IsClipboardFormatAvailable(2) = 1 then
OpenClipboard(handle(parent))
hGlobal = GetClipBoardData(2)
CloseClipboard();
ll_hbitmap = copyimage(hglobal,0,0,0,4)
End If
ll_hbitmap 就是記憶體圖片
但是要將記憶體圖片存入檔案就麻煩了
將HBITMAP句柄保存為本地bmp位圖的鏈接:
(VC源代碼)
http://blog.csdn.net/ok208043624/archive/2008/10/27/3151822.aspx
uj5u.com熱心網友回復:
1樓里就有答案,貌似還是進口的,樓主用心就可以完美解決。uj5u.com熱心網友回復:
標記下,下載來學習一下2010年3月18日 23時16分06秒uj5u.com熱心網友回復:
1樓說的程式非常強大,什么時候能寫出這樣的PB程式就可以了。uj5u.com熱心網友回復:
學習 .uj5u.com熱心網友回復:
我這里也有類似的問題,大家看來看看啊!http://blog.csdn.net/shengli333/archive/2010/12/24/6096000.aspx
uj5u.com熱心網友回復:
關注,前幾天正要搞這個,這兩天又在忙別的,哪天也研究一下uj5u.com熱心網友回復:
//FUNCTION Boolean OpenClipboard(ULong hWndNewOwner) LIBRARY "user32.dll"//FUNCTION Boolean CloseClipboard() LIBRARY "user32.dll"
//FUNCTION ULong GetClipboardData(ulong wFormat) LIBRARY "user32.dll"
//FUNCTION ulong IsClipboardFormatAvailable(ulong wFormat) LIBRARY "user32.dll"
//FUNCTION ULong GetDesktopWindow() LIBRARY "user32.dll"
//FUNCTION ULong GetDC(ULong hWnd) LIBRARY "user32.dll"
//FUNCTION ULong CreateCompatibleDC(ULong hdc) LIBRARY "gdi32.dll"
//FUNCTION ULong SelectObject(ULong hdc,ULong hgdiobj) LIBRARY "gdi32.dll"
//FUNCTION Int GetDIBits(ULong hdc,ULong hbmp,UInt uStartScan,UInt cScanLines,REF Blob lpvBits,REF bitmapinfo lpbi,UInt uUsage) LIBRARY "gdi32.dll"
//FUNCTION Int GetDIBits(ULong hdc,ULong hbmp,UInt uStartScan,UInt cScanLines, ULong lpvBits, REF bitmapinfo lpbi, UInt uUsage) LIBRARY "gdi32.dll"
//SUBROUTINE CopyBitmapFileHeader(REF Blob Destination, bitmapfileheader Source,Long Length) LIBRARY "kernel32.dll" ALIAS FOR "RtlMoveMemory"
//SUBROUTINE CopyBitmapInfo(REF Blob Destination, bitmapinfo Source,Long Length) LIBRARY "kernel32.dll" ALIAS FOR "RtlMoveMemory"
//FUNCTION Boolean DeleteDC(ULong hdc) LIBRARY "gdi32.dll"
//FUNCTION Int ReleaseDC(ULong hWnd,ULong hdc) LIBRARY "user32.dll"
//FUNCTION ULong CreateFile(String lpFileName, ULong dwDesiredAccess, ULong dwShareMode, ULong lpSecurityAttributes, ULong dwCreationDisposition, &
//ULong dwFlagsAndAttributes, ULong hTemplateFile ) LIBRARY "kernel32.dll" ALIAS FOR "CreateFileA"
//FUNCTION Boolean WriteFile(ULong hFile,Blob lpBuffer,ULong nNumberOfBytesToWrite,REF ULong lpNumberOfBytesWritten, &
//ULong lpOverlapped) LIBRARY "kernel32.dll"
//FUNCTION Boolean CloseHandle(ULong hObject) LIBRARY "kernel32.dll"
type bitmapfileheader from structure
integer bftype
long bfsize
integer bfreserved1
integer bfreserved2
long bfoffbits
end type
type bitmapinfoheader from structure
long bisize
long biwidth
long biheight
integer biplanes
integer bibitcount
long bicompression
long bisizeimage
long bixpelspermeter
long biypelspermeter
long biclrused
long biclrimportant
end type
type bitmapinfo from structure
bitmapinfoheader bmiheader
unsignedlong bmicolors[]
end type
//前面的是函式定義與結構體
long lul_hBitmap
ulong lul_hdcmem, hdc
//判斷剪貼板中的資料是否是BMP資料
constant ulong CF_BITMAP = 2
if IsClipboardFormatAvailable(CF_BITMAP) = 1 then
//(1)開始從剪貼板取資料
OpenClipboard(GetDesktopWindow())
lul_hBitmap = GetClipBoardData(CF_BITMAP)
CloseClipboard()
blob lb
hdc = GetDC(GetDesktopWindow())
lul_hdcmem = CreateCompatibleDC(hdc)
selectobject(lul_hdcmem, lul_hBitmap)
//(2)將取得的記憶體圖片轉換位blob資料流
ULong lul_hdc, lul_pixels
Blob lblb_header, lblb_info, lblb_bitmap
BitmapInfo lstr_Info
BitmapFileHeader lstr_Header
IF lul_hBitmap <> 0 THEN
lstr_Info.bmiHeader.biSize = 40
IF GetDIBits(lul_hdcMem, lul_hBitmap, 0, 0, 0, lstr_Info, DIB_RGB_COLORS) > 0 THEN
lul_pixels = lstr_Info.bmiHeader.biBitCount
lstr_Info.bmiColors[lul_pixels] = 0
lblb_bitmap = Blob(Space(lstr_Info.bmiHeader.biSizeImage))
// 獲取檔案資訊
GetDIBits(lul_hdcMem, lul_hBitmap, 0, lstr_Info.bmiHeader.biheight, &
lblb_bitmap, lstr_Info, DIB_RGB_COLORS)
// 創建BMP檔案頭
lstr_Header.bfType = BITMAPTYPE
lstr_Header.bfSize = lstr_Info.bmiHeader.biSizeImage
lstr_Header.bfOffBits = 54 + (lul_pixels * 4)
// 將檔案頭轉換成blob
lblb_header = Blob(Space(14))
CopyBitmapFileHeader(lblb_header, lstr_Header, 14)
// 將檔案內容轉換為blob
lblb_info = Blob(Space(40 + lul_pixels * 4))
CopyBitmapInfo(lblb_info, lstr_Info, 40 + lul_pixels * 4)
// 整合檔案資訊
lblb_bitmap = lblb_header + lblb_info + lblb_bitmap
END IF
END IF
//釋放通過GetDC或GetWindowDC所檢索出來的公用背景關系設備
ReleaseDC(GetDesktopWindow(),hdc)
//洗掉通過CreteDC或CreateCompatibleDC所創建的背景關系設備
DeleteDC(lul_hdcmem)
//lul_hBitmap由于已經通過selectobject函式選入背景關系設備lul_hdcmem中,因此不需要再呼叫DeleteObject函式來洗掉
//(3)取到圖片檔案后,則開始保存到檔案中
if len(lblb_bitmap) > 0 then
CONSTANT ULong INVALID_HANDLE_VALUE = -1
CONSTANT ULong GENERIC_WRITE = 1073741824
CONSTANT ULong FILE_SHARE_WRITE = 2
CONSTANT ULong CREATE_ALWAYS = 2
ULong lul_file, lul_length, lul_written
Boolean lb_rtn
// (創建)打開檔案
lul_file = CreateFile("d:\abc.bmp", GENERIC_WRITE, &
FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0)
IF lul_file = INVALID_HANDLE_VALUE THEN
RETURN
END IF
// 寫檔案
lul_length = Len(lblb_bitmap)
lb_rtn = WriteFile(lul_file, lblb_bitmap, &
lul_length, lul_written, 0)
// 關閉檔案
CloseHandle(lul_file)
end if
End If
uj5u.com熱心網友回復:
借這個帖子說說PB截圖的問題:(1)PB按照螢屏像素截圖,方法為:
BitBlt(lul_hdcMem, 0, 0, aul_width, aul_height, lul_hdc, aul_xpos, aul_ypos, SRCCOPY)
這種截圖方法只能截取當前顯示屏上的內容,超出部分截出來是黑色的
(2)按照視窗截圖,方法為:
printwindow(awnd, lul_memdc, 0)
這種截圖方法可以通過視窗的句柄進行截圖,當視窗不是MDI子視窗時,可以截取被遮蓋或者超出螢屏外的部分,但是當視窗為MDI子視窗時,無法截取超出MDI客戶區的視窗部分。另外該函式只在XP及以上系統中可用
(3)發送訊息截圖,方法為:
constant long WM_PRINT = 791
constant long PRF_CHECKVISIBLE = 1
constant long PRF_NONCLIENT = 2
constant long PRF_CLIENT = 4
constant long PRF_ERASEBKGND = 8
constant long PRF_CHILDREN = 16
constant long PRF_OWNED = 32
send(awnd, WM_PRINT, lul_memdc,PRF_NONCLIENT + PRF_ERASEBKGND + PRF_CLIENT+ PRF_OWNED + PRF_CHILDREN)
這種方法可以按照控制元件或者視窗的句柄來截圖,在任何情況下,被遮蓋或者超出螢屏部分的視窗都可以被截到,但是對于不支持WM_PRINT訊息的控制元件,改方法無法截取,datawindow控制元件就無法通過該方法截圖。另外該方法截的視窗圖中,各個控制元件的疊放順序會發生改變(如:statictext控制元件總會被提到最前面)
這三種方法各有優缺點,但都還不是最好的,不知道大家還有沒有什么更好的方法?
uj5u.com熱心網友回復:
//lul_hBitmap由于已經通過selectobject函式選入背景關系設備lul_hdcmem中,因此不需要再呼叫DeleteObject函式來洗掉應該改為
DeleteObject(lul_hbitmap)
uj5u.com熱心網友回復:
還是沒有實作~~~~~轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/70830.html
標籤:API 調用
