PB12.5可正常从剪切板生成BMP图片,同样代码,PB12.6不可,生成的图片大小一样,但不可打开
12.5可正常从剪切板生成BMP图片,同样代码,而12.6不可,生成的图片大小一样,则不可打开
代码之前从csdn复制, 请高手帮忙指正,谢谢,附代码如下:
long lul_hBitmap
ulong lul_hdcmem, hdc
//判断剪贴板中的数据是否是BMP数据
constant ulong CF_BITMAP = 2
constant ulong DIB_RGB_COLORS = 0
constant ulong BITMAPTYPE = 19778
if IsClipboardFormatAvailable(CF_BITMAP) <> 1 then
messagebox("Stop","請用專門的截圖軟件,本次格式不正確,請再試")
return
end if
//(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
BitmapInfo lstr_Info
BitmapFileHeader lstr_Header
IF lul_hBitmap = 0 THEN return
lstr_Info.bmiHeader.biSize = 40
IF GetDIBits(lul_hdcMem, lul_hBitmap, 0, 0, 0, lstr_Info, DIB_RGB_COLORS) <= 0 THEN return
lul_pixels = lstr_Info.bmiHeader.biBitCount
lstr_Info.bmiColors[lul_pixels] = 0
lblb_bitmap = Blob(Space(lstr_Info.bmiHeader.biSizeImage/2)) //原来------ 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(7)) //原来------Blob(Space(14))
CopyBitmapFileHeader(lblb_header, lstr_Header, 14)
// 将文件内容转换为blob
lblb_info = Blob(Space(20 + lul_pixels * 2)) //原来------Blob(Space(40 + lul_pixels * 4))
CopyBitmapInfo(lblb_info, lstr_Info, 40 + lul_pixels * 4)
// 整合文件信息
lblb_bitmap = lblb_header + lblb_info + lblb_bitmap
//释放通过GetDC或GetWindowDC所检索出来的公用上下文设备
ReleaseDC(GetDesktopWindow(),hdc)
//删除通过CreteDC或CreateCompatibleDC所创建的上下文设备
DeleteDC(lul_hdcmem)
//(3)取到图片文件后,则开始保存到文件中
if len(lblb_bitmap) <= 0 then return
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
// (创建)打开文件
int li_rc
lul_file = CreateFile(ls_file, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0)
//IF lul_file = INVALID_HANDLE_VALUE THEN RETURN
// 写文件
lul_length = Len(lblb_bitmap)
lb_rtn = WriteFile(lul_file, lblb_bitmap, &
lul_length, lul_written, 0)
// 关闭文件
CloseHandle(lul_file)
//p_1.setpicture(lblb_bitmap)
//return 1