PB 如何从粘贴板取图

fipamw 2010-01-17 12:48:30
我调用了一个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


在网上找了这么一段,但就是报错,不行
请高手帮忙一下,谢谢
...全文
1606 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyu1121 2011-12-31
  • 打赏
  • 举报
回复
还是没有实现~~~~~
yyoinge 2011-02-12
  • 打赏
  • 举报
回复
//lul_hBitmap由于已经通过selectobject函数选入上下文设备lul_hdcmem中,因此不需要再调用DeleteObject函数来删除

应该改为
DeleteObject(lul_hbitmap)
yyoinge 2011-02-12
  • 打赏
  • 举报
回复
借这个帖子说说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控件总会被提到最前面)


这三种方法各有优缺点,但都还不是最好的,不知道大家还有没有什么更好的方法?
yyoinge 2011-02-12
  • 打赏
  • 举报
回复
//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
JY创建美好 2011-01-19
  • 打赏
  • 举报
回复
关注,前几天正要搞这个,这两天又在忙别的,哪天也研究一下
shengli333 2010-12-24
  • 打赏
  • 举报
回复
我這里也有類似的問題,大家看來看看啊!
http://blog.csdn.net/shengli333/archive/2010/12/24/6096000.aspx
ahder 2010-03-20
  • 打赏
  • 举报
回复
学习 .
duzhy 2010-03-19
  • 打赏
  • 举报
回复
1楼说的程序非常强大,什么时候能写出这样的PB程序就可以了。
chennavy 2010-03-18
  • 打赏
  • 举报
回复
标记下,下载来学习一下2010年3月18日 23时16分06秒
hblwd 2010-01-30
  • 打赏
  • 举报
回复
1楼里就有答案,貌似还是进口的,楼主用心就可以完美解决。
fjfzyufan 2010-01-19
  • 打赏
  • 举报
回复
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
fipamw 2010-01-18
  • 打赏
  • 举报
回复
能不能贴出具体的代码,谢谢
fjfzyufan 2010-01-18
  • 打赏
  • 举报
回复
试了, 确实不行.
这个方法是拷贝字符串的.
用这个方法拷贝图片非常麻烦.
要用copyimage 拷贝为内存图片,
然后将内存图片再保存为文件.
fipamw 2010-01-18
  • 打赏
  • 举报
回复
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,不知道为什么
fipamw 2010-01-18
  • 打赏
  • 举报
回复
这样报错呀,有没有人真正实验过的呀,指教一下,急呀
fjfzyufan 2010-01-18
  • 打赏
  • 举报
回复
你给的例子应该行的吧

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中的内容保存到文件就行了.
fipamw 2010-01-18
  • 打赏
  • 举报
回复
哪位高手请教一下
fipamw 2010-01-17
  • 打赏
  • 举报
回复
这个我下了,不好用。不是截整个屏幕,是自定义屏幕。
QQ有个控件能实现,就像QQ截屏一样,很好用。
但QQ截屏后是保存到粘贴板的,我要再把粘贴板的数据保存成图片。
就是不知道怎么保存,在网上找了很久都找不到

请高手们指教一下,谢谢
jlwei888 2010-01-17
  • 打赏
  • 举报
回复
http://download.csdn.net/source/1626134
《PowerBuilder 9.0进阶开发篇》(实例与技巧篇)配书光盘使用说明 本光盘内容为本书所有实例的源代码。如下: 第1章 窗口、控件与界面 1.1 类Outlook工具栏界面实现 -- Outlook 1.2 制作Splash窗口 -- Splash 1.3 制作美观的状态条 -- StatusBar 1.4 创建图标栏应用 -- Systray 1.5 MDI窗口显示背景图片 -- MDIBmp 1.6 窗口中控件显示ToolTips -- ToolTips 1.7 打造不一样的命令按钮 -- PictureButton 1.8 透明文本的实现 -- TransparentST 1.9 导航图界面的制作 -- FlowChat 1.10 制作图文并茂的菜单 -- BmpMenu 1.11 窗口内控件大小与窗口大小同步 -- Autosize 1.12 动态创建控件 -- DynamicControl 1.13 控件融合技术 -- SplitBar 第2章 数据窗口 2.1 数据窗口PDF格式文档输出 -- PDF 2.2 数据窗口组合条件查询 -- Query 2.3 数据窗口通用排序 -- UniversalSort 2.4 数据窗口通用显示列定制窗口的实现 -- ColumnVisible 2.5 数据窗口中实现增量查询 -- zlcx 2.6 数据窗口的多表更新 -- UpdateMultable 2.7 单击标题栏对数据窗口排序 -- TitleSort 2.8 动态数据窗口 -- DynamicDataWindow 2.9 复合数据窗口 -- AddTitle 2.10 数据窗口打印处理 -- PrintPreview/PrintPreview3 (PrintPreview和PrintPreview3内容是相同的,但在实现上有些区别) 2.11 数据窗口统计图类型的动态改变 -- GraphType 2.12 数据窗口统计图数值动态显示的实现 -- GraphValue 2.13 数据窗口中按钮的封装 -- DwButton 第3章 PowerScript 3.2 实现客户端程序的自动升级 -- CSUPgrade 3.3 进制转换 -- NumberConvert 3.4 注册表函数应用 -- Regedit 3.5 人民币大写转换函数 -- AmountUppder 3.6 在应用程序中关闭外部程序 -- CloseApp 3.7 在应用程序中启动控制面板项目 -- RunControl 3.8 非Tab分隔符文本文件导入数据窗口 -- ImportFile 3.9 编译后的程序带参数运行 -- CommandParm 3.10 取当月的最后一天函数 -- GetLastDay 3.11 限制同一程序多次运行 -- OnlyOnce 本章所使用的资源文件 -- pic 第4章 数据库与SQL 4.2 PowerBuilder + ASA8的C/S编程 -- Client-Server 4.4 动态SQL及其应用 -- DynamicSQL 4.5 存取二进制大对象 -- Blob 4.6 PowerBuilder应用取服务器时间 -- GetServerTime 4.7 PowerBuilder扩展属性系统表及其应用 -- SystemTable 4.8 连接任意ODBC数据源 -- ODBCList 4.9 可定制参数的数据库连接 -- ServerSet 第5章 打印专题 通用打印例子 -- Print 第6章 用户对象 6.1.1 创建定制的用户对象(创建弹压式按钮) -- ToggleButton 6.1.2 创建标准的可视用户对象(扩展的数据窗口) -- Datawindow 6.1.3 创建可视外部用户对象(状态条) -- StatusBar 6.2.2 创建通用不可视用户对象(FTP应用) -- Ftp 第7章 API 7.2.1 改变窗口的显示风格 -- ChangeWindow 7.2.2 使窗口的图片透明化 -- TransWindow 7.2.3 改变窗口的关闭形式 -- CloseStyle 7.2.4 PB中实现图形的复制与粘贴以及图像的简单处理 -- PictureBox 7.3.1 获得系统的内部进程 -- System Thread 7.3.2 获得系统基本信息 -- SystemInformation 7.4.1 检测物理网络的连通情况 -- Mping 7.4.2 关闭、重启、注销计算机 -- ExitWindow 7.5.1 使用Visual C++开发动态链接库 -- DllForPb9 7.5.2 使用Delphi开发动态链接库 -- SetScreen 7.5.3 使用Visual Basic开发ActiveX动态链接库 -- CPUInfo 第8章 pipeline 数据管道 -- pipeline 第9章 DDE、OLE、COM使用技术 9.1.3 DDE客户端实现步骤 -- DDE 9.2.5 不可视的OLE对象 -- pbtowordandexcel 9.2.6 ActiveX控件 -- Media 9.2.7 使用外部OLE控件处理数据库中的二进制数据 -- DBOLE 9.2.8 OLE精彩应用——开发具有XP风格的菜单 -- XPMenu 9.3.3 PowerBuilder中的COM组件实现 -- pb9com 第10章 编译发行 编译 -- TestInstall 第11章 Jaguar 包含开发Jaguar组件和调用Jaguar组件的两个例子的源程序 第12章 PBNI PBNI应用技术 -- PBNI 本光盘所收集内容的著作权为作者所有;作者授权清华大学出版社独家出版该光盘;清华大学出版社享有该光盘的专有出版权。 注意事项: 1. 第4章部分例程需要配置名为pbbook的ODBC数据源; 第5章例程需要配置名为PrintDB的ODBC数据源。 2. 某些例程可能会因环境原因而无法运行,但源代码可供参考。 3. 部分例程所在目录有说明文件,请注意阅读。 4. 如有疑问,欢迎到以下网站探讨: PB编程俱乐部 http://www.kejx.com 或 http://kjx.126.com 摆渡人工作室 http://www.pbsite.com 技术支持: 电 话:010-62791976-220或010-62791977-220(编辑部) 传 真:010-62788903 E-mail:kjx@163.com(柯建勋) ztao@pbsite.com(张涛) oyzx_sp@263.net(编辑) 通信地址:北京市清华大学校内金地公司 邮 编:100084
数据窗口源码介绍 (举例见d_dbit_example.srd,测试数据库为PB自带的EAS Demo DB V120) 1.第一行:release 12; 数据窗口所属PB的版本号,如果想把高版本的datawindow导入低版本的PB中要修改此数字; 2.datawindow()行 通常用修改processing属性,可以把你的数据窗口由grid变成freeform或其它类型 例:freeform:0 grid:1 3.header()行 可以整行复制粘贴,并命名为header[1],header[2],这样可以让数据窗口有多个header 4.table()行 这里全是定义的数据属性,是setitem,update,object.data等方法访问的根源 如果存在table()里的column,数据窗口里可以不存在任何对象,仍然可以访问数据窗口的数据 如果想创建一个空的数据窗口,可以只定义: release 12; table() 5.table(column行) 是第几个column,它的ID就是多少,其中也定义了是否可以update时和更新到数据表的字段名 6.table(retrieve行) 检索数据时使用的SQL语句,可以通过setsqlselect或modify("table.sqlselect")方法去动态修改 修改后要重新定义数据窗口的更新属性 7.column()行 id即是对应table(column行)里的行次,名称(name)可以随便命名,也可以没有,则默认为table(column行)里的name 8.compute()行 计算列,可以通过表达式计算显示特定值(具体函数可以见共享里的画笔函数). 9.text()行 有时可以代替计算列; 通过定义text的表达式,可以实现一列中显示两个字段值,注意结果必须要转换成string类型(而column和compute则不行); 10.htmltable()行 按照格式导出(saveas)html文件,为了保证格式的完整,数据窗口的单位最好设置成pixels GenerateCSS='1' //保持格式及颜色 Border='0' //不要table边框 CellSpacing='0' //单元格无间距(此项在界面上经常设置不上) 注: (1)Grid生成标签,Freeform生成
+ 标签; (2)生成htmltable时,不知为何会在CSS中的开始自动加一个分号";",导致excel等浏览器打开不能正常显示格式; (3)band为foreground或background的对象导不出来,可以动态修改后再导出. 11.export.xml()行 定义导出xml文件的格式,并为模板保存名称 使用时一定要设置usetemplate值 12.import.xml()行 定义导入xml文件的格式,并为模板保存名称 使用时一定要设置usetemplate值 13.表达式介绍 略 14.其它也略

680

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder API 调用
社区管理员
  • API 调用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧