pb的bitmap用法
PB基础知识整理版
PB基础知识.数据库的事务管理在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。
为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。
对事务的操作是这样进行的:先定义开始一个事务,然后对数据作修改操作,这时如果提交(COMMIT),这些修改就永久地保存下来,如果回退(ROLLBACK),数据库管理系统将放弃您所作的所有修改而回到开始事务时的状态。
此外有些数据库支持事务的"存储点(savepoint)这一概念:即在一个事务进程中任意一点您都可以进行当前状态的存储,回退时只是回到你所设定的存储点,而不必退回全部的事务。
如果您的事务可以分成几组对数据库的修改,那就可以设置多个存储点,根据需要您可以回退到任意一个存储点,而不使所有事务的修改数据全部丢失。
正确地管理事务可以保证数据的完整性,当您所做的工作全部完成和得到确认之前,没有任何数据物理地写进数据库。
让我们来看这样一个实例,我们有这样一个银行应用系统,前台使用者作出将储户甲的一百元存款划归储户乙帐下的操作;在后台的数据库中,这两个客户的记录分储在两张表中,当使用者在屏幕上作出如上操作时,在后台需要对两张表进行修改。
如果在数据库中对甲用户存款余款作减去一百元修改后,对乙用户加一百元的操作修改却失败时,前一张表也必须回到修改前的状态,否则数据库的内容不统一,甲储户白白损失一百元,信息必然是不正确的。
因此进行事务管理是必须的。
传统地,我们认为一个事务包括了对一个或多个表的修改,而随着分布式数据库和数据仓库的发展,事务可能包括了对一个或多个数据库的修改。
在上例中甲乙两用户就可能是异地用户,信息分储在不同地域的不同数据库中,上述的一个事务就涉及到了对不同数据库的操作。
PowerBuilder中的事务管理作为数据库的前台开发工具Power Builder支持事务管理的操作。
pb中数据窗口的应用
Pb中数据窗口的应用在通常的Server/Client方式MIS开发中,总是有没完没了的报表需要制作,调试报表花费的时间也是最多而且乏味,还常常不能满足客户的要求。
要是能够让用户自己调整报表的格式和内容,然后将它保存下来,程序下次启动时它自动调用保存了的报表格式那有多好。
本人通过如下方法最终实现了用的要求。
PB(PowerBuilder)有一种以PSR结尾的特殊的保存报表的文件格式(本文简称作PSR文件)。
根据数据窗口可以直接读取PSR文件生成报表的原理,程序通过生成PSR文件,实现动态报表格式的保存。
一、实现原理:PB中的报表其实就相当于是数据窗口。
第一步,动态报表的实现。
通过设置数据窗口对象(dataobject)中文本、列等的Resizeable 和moveable属性为1来实现对象位置的拖动控制,通过数据窗口的Modify函数实现对象值的更改(包括增加和删除)。
第二步,报表格式的保存。
在一个应用当中,数据窗口对象的名称总是唯一的,将每一个数据窗口对象转化成PSR文件存于数据库表中。
在窗口打开时,程序先校验报表格式是否存在。
如果存在,先将报表格式读取出来放在一个临时文件当中,然后设置数据窗口(datawindow)的数据对象(dataobject)为这个报表文件,然后提取数据;如果不存在,直接提取数据即可。
二、实现过程:1、建立一个数据库表用以保存报表格式文件。
表名:dyn_reportDwobjectVarchar2(20)数据窗口对象名称Primary keyRptitleVarchar2(80)报表的标题名称MemoLong raw 报表格式2、建立一个窗口w_temp。
定义实例变量如下:string is_dwtype,is_dwobject //保存报表中对象的类型及名称控件名称控件含义Dw_print数据窗口对象Cb_exit退出按钮Cb_savereport 报表格式保存按钮3、在窗口的OPEN事件中加入如下代码, 校验报表格式是否存在,如果存在读取定义好的报表格式到数据窗口。
非常全面的AndroidBitmap知识点梳理
非常全面的AndroidBitmap知识点梳理原文出处:/article/android-bitmap-tips.html在日常开发中,可以说和Bitmap低头不见抬头见,基本上每个应用都会直接或间接的用到,而这里面又涉及到大量的相关知识。
所以这里把Bitmap的常用知识做个梳理,限于经验和能力,不做太深入的分析。
1区别decodeResource()和decodeFile()这里的区别不是指方法名和参数的区别,而是对于解码后图片尺寸在处理上的区别:decodeFile()用于读取SD卡上的图,得到的是图片的原始尺寸decodeResource()用于读取Res、Raw等资源,得到的是图片的原始尺寸 * 缩放系数可以看的出来,decodeResource()比decodeFile()多了一个缩放系数,缩放系数的计算依赖于屏幕密度,当然这个参数也是可以调整的:我们分具体情况来看,现在有一张720×720的图片: inScaled属性如果inScaled设置为false,则不进行缩放,解码后图片大小为720×720; 否则请往下看。
如果inScaled设置为true或者不设置,则根据inDensity和inTargetDensity计算缩放系数。
默认情况把这张图片放到drawable目录下, 默认:以720p的红米3为例子,缩放系数 = inTargetDensity(具体320 / inDensity(默认160)= 2 = density,解码后图片大小为1440×1440。
以1080p的MX4为例子,缩放系数 = inTargetDensity(具体480 / inDensity(默认160)= 3 = density, 解码后图片大小为2160×2160。
*dpi文件夹的影响把图片放到drawable或者raw这样不带dpi的文件夹,会按照上面的算法计算。
android学习之bitmap的用法
bitmap的用法需求:从服务器下载一张图片,显示在ImageView控件上,并将该图片保存在移动设备的SD上。
步骤:(一)获得输入流//urlPath:服务器路径;public InputStream getUrlInputStream(String urlPath) throws IOException{URL url=new URL(urlPath);HttpURLConnection conn=(HttpURLConnection) url.openConnection();InputStream in=conn.getInputStream();if(in!=null){return in;}else{Log.i("test", "输入流对象为空");return null;}}(二)将输入流转化为Bitmap流public Bitmap getMyBitmap(InputStream in){Bitmap bitmap=null;if(in!=null){bitmap=BitmapFactory.decodeStream(in);//BitmapFactory的作用:create Bitmap objects from various sources,including files,streams and byte-arrays;return bitmap;}else{Log.i("test", "输入流对象in为空");return null;}}(三)给ImageView对象赋值public void setWidgetImage(Bitmap bitmap){ImageView img=new ImageView(this);if(bitmap!=null){img.setImageBitmap(bitmap);}}(四)获取SD卡上的文件存储路径public void createSDFile(){File sdroot=Environment.getExternalStorageDirectory();File file=new File(sdroot+"/Android/date/包名/文件名");if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){/*** 相关操作*/}}注意:SD卡的权限(五)将图片保存到SD卡上public boolean readToSDCard(File file,Bitmap bitmap) throws FileNotFoundException{ FileOutputStream os=new FileOutputStream(file);return press(pressFormat.PNG, 90, os);//press()的作用:write a compressed version of the bitmap to the specified outputstream;//true:表示操作成功,false:表示操作失败}。
60个PB数据窗口技巧
60个PB数据窗口技巧数据窗口是一种用于展示数据的工具,它可以帮助用户更好地理解和分析数据。
下面是60个PB数据窗口技巧,帮助您更高效地使用数据窗口。
1.在数据窗口左下角的栏中输入关键词,可以快速筛选显示您所需的数据。
2.使用鼠标右键单击数据窗口的列头,可以自定义列的显示与隐藏。
3.在数据窗口的列头拖动可以更改列的顺序和宽度。
4.在数据窗口的列头双击,可以按该列进行排序。
5. 使用Ctrl键与鼠标左键选择多列,可以同时对这些列进行操作。
6.点击数据窗口的行头,可以选择整行。
7. 使用Shift键与鼠标左键选择多行,可以同时对这些行进行操作。
8.双击数据窗口的行头,可以自动调整该行的高度,使其适应内容。
9.在数据窗口的列头右键单击,可以进行更多的列操作,如冻结列、设置列格式等。
10. 使用Ctrl+Enter键,可以在当前单元格中插入换行符。
11. 使用Ctrl+D键,可以复制当前单元格的内容到下一个单元格。
12.在数据窗口的列头左键单击,可以选择一整列。
13. 使用Ctrl+Shift键与鼠标左键选择多个非连续的列。
14.在数据窗口的列头上方的空白区域右键单击,可以选择整个数据窗口。
15.在数据窗口左上角的复选框,可以选择或取消选择整个数据窗口。
16. 使用Ctrl+C键,可以复制选中的单元格或整行到剪贴板。
17. 使用Ctrl+V键,可以粘贴剪贴板中的内容到当前单元格或行。
18. 使用Shift+Enter键,可以在当前单元格下方插入一行。
19. 使用Ctrl+K键,可以在当前单元格中插入一个链接。
20. 使用Ctrl+Space键,可以选择整列。
21. 使用Shift+Space键,可以选择整行。
22.在数据窗口的列头右键单击,可以选择“筛选”,进行高级筛选操作。
23.在数据窗口的列头右键单击,可以选择“合并”,将相邻的相同内容的单元格合并为一个。
24.在数据窗口的列头右键单击,可以选择“拆分”,将合并的单元格拆分回原来的单元格。
PB知识点整理(word文档物超所值)
变量类型•局部变量(Local ):在定义该变量的函数、事件中使用。
局部代码执行完即销毁。
•实例变量(Instance ):属于一个对象的一个实例。
实例不被销毁,变量一直存在。
如无特殊声明,则其他对象都可以访问该变量。
•共享变量(Shared ):被同一对象的多个实例中共同使用(无论有几个实例,都只有一个值),整个应用不被销毁,变量一直存在。
其他对象无法访问该变量。
•全局变量(Global ):属于整个应用。
整个应用不被销毁,变量一直存在。
所有对象都可以访问该变量。
•按变量的作用范围和生命周期来划分作用范围生命周期局部变量所在的事件或函数所在的事件或函数实例变量所在对象的具体实例所在对象的具体实例共享变量所在对象的所有实例整个应用程序全局变量整个应用程序整个应用程序提倡多使用局部变量,适当使用Instance,尽量少用Shared 和Global,变量、常量的声明•变量说明:datatype variablename•变量名建议使用:变量类型+数据类型+”_”+其它,如:–String gs_dwmc–Int ii_count–Long sl_userid–Datetime ldt_today–String ls_xm,ls_bj–Long ll_classid = 1•常量变量说明:CONSTANT datatype variablename = value数组•String ls_city[] //下标默认从1开始•String ls_city[10] //下标默认从1开始•String ls_city[2 to 20] //下标从2到20•String ls_city[2,10]•数组初始化:int li_i[9]={2,3,4,5,6,7,8,9,10}•数组循环赋值:int i,li_i[9]for i=1 to 9li_i[i] = i+1next结构str_student lstr_studentlstr_student.id=1lstr_student.xm=‘张三’lstr_student.xb=‘1’lstr_student.csrq=date(‘1975-01-01’)Openwithparm(w_test,lstr_student)str_student lstr_studentlstr_student=message.powerobject加减乘除•算术运算:+, - , *, /, ^•关系运算:=, <>, >, <, >=, <=, like•逻辑运算:NOT, AND, OR•字符串连接:ls_name = ls_name + ‘医院’常用的函数•Messagebox:显示出错、警告、提示及其他重要信息。
Bitmap用法总结
Bitmap用法总结1、Drawable → Bitmappublic static Bitmap drawableToBitmap(Drawable drawable) {Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight(),drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);Canvas canvas = new Canvas(bitmap);// canvas.setBitmap(bitmap);drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());drawable.draw(canvas);return bitmap;}2、从资源中获取BitmapResources res=getResources();Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);3、Bitmap → byte[]private byte[] Bitmap2Bytes(Bitmap bm){ByteArrayOutputStream baos = new ByteArrayOutputStream();press(pressFormat.PNG, 100, baos);return baos.toByteArray();}4、byte[] → Bitmapprivate Bitmap Bytes2Bimap(byte[] b){if(b.length!=0){return BitmapFactory.decodeByteArray(b, 0, b.length);}else {return null;}}5、保存bitmapstatic boolean saveBitmap2file(Bitmap bmp,String filename){ CompressFormat format= pressFormat.JPEG;int quality = 100;OutputStream stream = null;try {stream = new FileOutputStream("/sdcard/" + filename);} catch (FileNotFoundException e) {// TODO Auto-generated catch blockGenerated by Foxit PDF Creator © Foxit Software For evaluation only.e.printStackTrace();}return press(format, quality, stream);}6、将图片按自己的要求缩放// 图片源Bitmap bm = BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.dog));// 获得图片的宽高int width = bm.getWidth();int height = bm.getHeight();// 设置想要的大小int newWidth = 320;int newHeight = 480;// 计算缩放比例float scaleWidth = ((float) newWidth) / width;float scaleHeight = ((float) newHeight) / height;// 取得想要缩放的matrix参数Matrix matrix = new Matrix();matrix.postScale(scaleWidth, scaleHeight);// 得到新的图片Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);// 放在画布上canvas.drawBitmap(newbm, 0, 0, paint);相关知识链接:/thread-3162-1-1.html7、bitmap的用法小结BitmapFactory.Options option = new BitmapFactory.Options();option.inSampleSize = 2; //将图片设为原来宽高的1/2,防止内存溢出Bitmap bm = BitmapFactory.decodeFile("",option);//文件流URL url = new URL("");InputStream is = url.openStream();Bitmap bm = BitmapFactory.decodeStream(is);android:scaleType:android:scaleType是控制图片如何resized/moved来匹对ImageView的size。
bitmap
位图位图图像(bitmap), 亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的。
这些点可以进行不同的排列和染色以构成图样。
当放大位图时,可以看见赖以构成整个图像的无数单个方块。
扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。
然而,如果从稍远的位置观看它,位图图像的颜色和形状又显得是连续的。
在体检时,工作人员会给你一个本子,在这个本子上有一些图像,而图像都是由一个个的点组成的,这和位图图像其实是差不多的。
由于每一个像素都是单独染色的,您可以通过以每次一个像素的频率操作选择区域而产生近似相片的逼真效果,诸如加深阴影和加重颜色。
缩小位图尺寸也会使原图变形,因为此举是通过减少像素来使整个图像变小的。
同样,由于位图图像是以排列的像素集合体形式创建的,所以不能单独操作(如移动)局部位图。
一般情况下,位图是工具拍摄后得到的。
如数码相机拍摄的照片.分辨率是一个笼统的术语,它指一个图像文件中包含的细节和信息的大小,以及输入、输出、或显示设备能够产生的细节程度。
操作位图时,分辨率既会影响最后输出的质量也会影响文件的大小。
处理位图需要三思而后行,因为给图像选择的分辨率通常在整个过程中都伴随着文件。
无论是在一个300 dpi的打印机还是在一个2570dpi的照排设备上印刷位图文件,文件总是以创建图像时所设的分辨率大小印刷,除非打印机的分辨率低于图像的分辨率。
如果希望最终输出看起来和屏幕上显示的一样,那么在开始工作前,就需要了解图像的分辨率和不同设备分辨率之间的关系。
显然矢量图就不必考虑这RGB位图颜色的一种编码方法,用红、绿、蓝三原色的光学强度来表示一种颜色。
这是最常见的位图编码方法,可以直接用于屏幕显示。
CMYK位图颜色的一种编码方法,用青、品红、黄、黑四种颜料含量来表示一种颜色。
常用的位图编码方法之一,可以直接用于彩色印刷。
编辑本段位图图像属性索引颜色/颜色表位图常用的一种压缩方法。
Android画图学习总结(二)——Bitmap
Android画图学习总结(二)——Bitmap通过前一篇的学习,对Android 画图核心部分有了一定的了解,后面篇幅,我们将详细介绍Android中的各种画图对象的使用,首先介绍我们最常用的Bitmap(位图)。
位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的。
按照对位图的操作,分为以下几个功能分别介绍:1.从资源中获取位图2.获取位图的信息3.显示位图4.位图缩放5.位图旋转1. 从资源中获取位图在前一篇幅介绍了:先获取Resource,然后可以通过资源ID获取Drawable,也可以通过资源ID获取资源文件的数据流。
使用第一种方法比较容易,下面详细说明第二种方法。
通过Resource的函数:InputStream openRawResource(int id)获取得到资源文件的数据流后,也可以通过2种方法来获取Bitmap,如下:以上方法在编程的时候可以自由选择,在Android SDK中说明可以支持的图片格式如下:p ng (preferred), jpg (acceptable), gif (discouraged),虽然bmp格式没有明确说明,但是在Android SDK Support Media Format中是明确说明了。
2. 获取位图的信息要获取位图信息,比如位图大小、是否包含透明度、颜色格式等,获取得到Bitmap就迎刃而解了,这些信息在Bitmap的函数中可以轻松获取到。
Android SDK中对Bitmap有详细说明,阅读起来也比较容易,不在此详细说明,这里只是辅助说明以下2点:∙在Bitmap中对RGB颜色格式使用Bitmap.Config定义,仅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如说RGB_555,在开发中可能需要注意这个小问题;∙Bitmap还提供了compress()接口来压缩图片,不过AndroidSAK只支持PNG、JPG格式的压缩;其他格式的需要Android开发人员自己补充了。
pb的bitmap用法 -回复
pb的bitmap用法-回复[pb的bitmap用法]Bitmap是一种用于表示图像的数据结构,它由像素点构成,并按照特定的格式存储图像信息。
在计算机图形学和图像处理领域中,Bitmap被广泛应用于图像文件的存储和处理。
在本文中,我们将一步一步回答关于pb 的bitmap用法的问题。
第一步:什么是pb的bitmap?pb的bitmap是一种基于位图的数据结构,它用于存储图像的像素信息。
在pb中,bitmap由一组32位整数组成,每个整数表示一个像素点的颜色值。
通过将bitmap与pb的界面结合使用,我们可以实现图像的绘制和显示。
第二步:如何使用pb的bitmap?使用pb的bitmap主要涉及以下几个方面:1. 创建bitmap对象:首先,我们需要创建一个bitmap对象来存储图像的像素信息。
在pb中,可以通过调用`bitmap.create(width, height)`方法来创建一个指定宽度和高度的bitmap对象。
2. 设置像素信息:接下来,我们可以通过调用`bitmap.setPixel(x, y, color)`方法来设置图像的像素信息。
这个方法会将指定位置(x, y)的像素点的颜色值设置为指定的color值。
3. 绘制bitmap:一旦我们设置好了图像的像素信息,就可以通过调用`pb.drawBitmap(bitmap, x, y)`方法来将bitmap绘制到pb的界面上。
这个方法会将bitmap绘制在指定位置(x, y)。
4. 清空bitmap:如果需要清空bitmap的像素信息,可以通过调用`bitmap.eraseColor(color)`方法来将所有的像素点的颜色值设置为指定的color值。
第三步:实际应用示例为了更好地理解pb的bitmap用法,以下给出一个实际应用的示例。
假设我们要在pb的界面上绘制一个简单的图形,如一个红色的正方形。
下面是具体的步骤:1. 创建bitmap对象:我们可以通过调用`bitmap.create(100, 100)`方法来创建一个宽度和高度都为100像素的bitmap对象。
PB数据窗口画笔函数
数据窗口画笔函数6.5.1 聚合函数聚合函数对指定列的一组值进行操作因此它们使用受到了一些限制聚合函数不能应用在下述场合1.过滤器 2.有效性规则3.另一个聚合函数的参数聚合函数包括函数返回值功能Avg 与列的数据类型相同计算指定列的数据平均值Count Long 计算指定列指定范围的总行数CumulativePercent Double 计算指定列到当前行的累计百分比CumulativeSum 与列的数据类型相同计算从头开始到当前行包括当前行位置的累进和First 与列的数据类型相同确定指定列首行的值Large 与returnexp的数据类型相同查找指定列第几个大值所在的行并根据结果返回returnexp表达式的值Last 与列的数据类型相同确定指定列末行的值Max 与列的数据类型相同得到指定列数据的最大值Median 与列的数据类型相同计算指定列的中值Min 与列的数据类型相同得到指定列数据的最小值Mode 与列的数据类型相同计算某列指定范围内出现频率最多的值Percent Double 计算指定列当前行值占本列指定范围合计值的百分比Small 与returnexp的数据类型相同查找指定列第几个小值所在的行并根据结果返回returnexp表达式的值StDev Double 计算指定列标准偏差的估计值StDevP Double 计算指定列的标准偏差Sum 与指定列的数据类型相同计算指定列的合计值Var Double 计算指定列方差的估计值VarP Double 计算指定列的方差需要注意的是在有效性规则或过滤表达式中不能使用聚合函数6.5.2 数据类型检查与转换函数数据类型检查与转换函数可以用于定义数据窗口对象的过滤条件有效性规则以及计算域这些函数包括Asc Integer 将字符串的第一个字符转换成ASCII码整数Char String 将整数转换成字符Integer Integer 将字符串转换成整数IsDate Boolean 检查字符串的值是否是有效的日期IsNull Boolean 检查某列或某个表达式的值是否为空值(NULL)IsNumber Boolean 检查字符串的值是否是有效的数值数据IsTime Boolean 检查字符串的值是否是个有效的时间Long Long 将字符串转换成长整数(Long型)Number 数值类型将字符串转换成数值类型数据6.5.3 数据窗口信息函数数据窗口信息函数包括CurrentRow Long 得到数据窗口当前行得到输入焦点的行的行号Describe String 得到数据窗口对象的属性值GetRow Long 返回数据窗口相应带中的当前行号GetText String 得到漂浮在数据窗口当前单元上的编辑框的内容IsRowModified Boolean 检查相应行是否被修改IsRowNew Boolean 检查相应行是否是新插入的行IsSelected Boolean 检查相应行是否被选中选中行加亮显示LookUpDisplay String 得到指定列代码表中与数据值相应的显示值Page Integer 得到当前页的页号PageAcross Integer 得到当前水平方向页的页号例如如果当前报表是预览窗口的两倍宽度那么PageAcross()函数返回2PageCount Integer 得到打印预览或报表预览的总页数当数据窗口或报表的宽度不超过预览窗口时该页数也是打印的总页数当数据窗口或报表的宽度超过预览窗口时打印页数大于PageCount()函数得到的页数PageCountAcross Integer 得到水平方向页的总数RowCount Long 得到主缓冲区中当前可用的总行数RowHeight Long 得到相应行的高度6.5.4 日期时间函数日期时间函数包括Date Date 把其值是有效日期的字符串转换成Date型数据DateTime DateTime 把日期和时间值组合成DateTime型值Day Integer 得到日期型数据中的号数(1到31之间的整数值)DayName String 得到指定日期是一周中的星期几(例如Sunday, Monday...)DayNumber Integer 得到日期型数据是一星期中的第几天(用1~7 表示星期天为1 星期一为2 ...)DaysAfter Long 得到两个日期间的天数Hour Integer 得到时间值中的小时采用24小时制Minute Integer 得到时间值中的分钟有效值在00~59之间Month Integer 得到日期值中的月份有效值在1~12之间Now Time 得到客户机的当前系统时间返回值为Time类型RelativeDate Date 得到指定日期前多少天或后多少天的日期RelativeTime Time 得到指定时间前多少秒或后多少秒的时间采用24小时制Second Integer 得到时间值中的秒有效值在00~59之间SecondsAfter Long 得到两个时间之间的时间间隔以秒为单位Time Time 将表示时间的字符串转换成time类型的值Today Date 得到系统日期和时间返回值为DateTime类型Year Integer 得到日期值中的年度(有效取值1000到3000)6.5.5 数值运算函数数值运算函数包括Abs ( n) n的数据类型计算绝对值ASin(n) Double 反正弦函数ACos(n) Double 反余弦函数ATan(n) Double 反正切函数Ceiling(n) n的数据类型返回大于n的最小整数Cos ( n) Double 余弦函数Exp ( n) Double 计算e的n次方Fact ( n) Double 计算n的阶乘Int ( n) Integer 得到小于等于n的最大整数Log ( n) Double 计算n的自然对数LogTen ( n) Double 计算n的常用对数以10为底Max ( x, y ) x y中更精确的数据类型求最大值Min ( x, y ) x y中更精确的数据类型求最小值Mod ( x, y ) x y中更精确的数据类型求余数Pi ( n ) Double 求n与Pi(3.14159265358979323...)的乘积Rand ( n ) n的数据类型得到1与n之间的一个伪随机数Round(x,n) Decimal 将x四舍五入到n位Sign ( n ) Integer 确定n是整数负数还是零Sin ( n ) Double 正弦函数Sqrt ( n ) Double 计算平方根Tan ( n ) Double 正切函数Truncate(x,n) Decimal 截断数值到指定的小数位6.5.6 字符串操作函数字符串操作函数包括Fill ( chars, n) String 建立一个由指定字符串填充的指定长度的字符串LastPos(string1,string2{,searchlength})Long 查找目标字符串在原字符串中最后一次出现的位置Left ( string, n) String 得到字符串左部指定个数的字符LeftTrim ( string) String 删除字符串左部的空格Len ( stringorblob) Long 返回字符串的长度Lower ( string ) String 将字符串中的大写字母转换为小写字母Match ( string, textpattern) Boolean确定字符串中是否包含指定模式的字符Mid(string, start {,length}) String 取字符串的子串Pos(string1,string2{,start }) Long 在一个字符串中查找所包含的另一个字符串的起始位置Replace(string1,start,n, string2 )String 将一个字符串中指定个数的字符串替换为另一个字符串Right ( string, n ) String 从字符串尾部取指定个数字符RightTrim ( string ) String 删除字符串尾部空格Space ( n ) String 生成一个由空格组成的指定字符个数的字符串String ( data {, format } ) String 以指定格式格式化数据Trim ( string ) String 删除字符串首部和尾部的空格Upper ( string ) String 将字符串中的小写字母转换为大写字母WordCap ( string ) String 将单词的首字母设置为大写其他字母设置为小写比如执行WordCap(ROBERT E. LEE)后该函数返回Robert E. Lee6.5.7 交叉表函数交叉表函数仅适用于交叉表Crosstab 风格的数据窗口对象它们可以在这类数据窗口对象的过滤条件有效性规则及计算域中使用交叉表函数包括CrosstabAvg Double 计算交叉表指定表达式的平均值CrosstabCount Long 计算交叉表指定表达式值的个数CrosstabMax Double 计算交叉表指定表达式的最大值CrosstabMin Double 计算交叉表指定表达式的最小值CrosstabSum Double 计算交叉表指定表达式的合计6.5.8 其他画笔函数没有归入前面各节的其他数据窗口画笔函数包括Bitmap 显示指定的位图Case 与返回表达式的类型相同根据条件返回不同表达式result1到resultn之间的一个的值If 与truevalue或falsevalue的类型相同根据条件返回不同值与If语句有相似之处ProfileInt Integer 返回指定配置文件中指定节指定键的整数值ProfileStringString 返回指定配置文件中指定节指定键的字符串型值RGB Long 将颜色分量组合成表示颜色的长整数。
pb数据窗口缓冲区
pb数据窗口缓冲区PowerBuilder是当今最先进的数据库开发工具之一,它以开放性、可移植性以及易用性而闻名于世。
PowerBuilder的突出特点是给应用开发人员提供了非常方便的开发环境和工具,而数据窗口技术则是其中最耀眼的闪光点。
利用数据窗口,开发人员可以完成绝大多数数据操作任务。
本文从数据窗口中数据的修改状态的角度出发,介绍利用数据窗口进行应用开发的一些技巧。
1 数据窗口缓冲区在应用中,每个数据窗口控件都要检索4个内存缓冲区,它们是:·主缓冲区(PrimaryBuffer):存放检索出来的数据,但不包括过滤掉和删除掉的数据。
·过滤缓冲区(FilterBuffer):存放从主缓冲区中过滤掉的数据。
·删除缓冲区(DeleteBuffer):存放从主缓冲区中删除掉的数据。
·原始缓冲区(OriginalBuffer):存放从数据库里检索到的原始数据,它由PowerBuild在内部维护,可以利用该缓冲区中的数据进行数据恢复,在应用程序中实现Undo功能。
2 行与列的修改状态行与列的修改状态在PowerBuilder中为dwItemStatus枚举类型值,它们包含:·NotModified!:指定行或列处的信息与最初检索出的相同。
·DataModified!:指定列或行中某列处的信息在检索出后发生了改变。
·New!:指定行是新行,但此行的列并未赋值。
本状态只适用于行,不适用于单个列。
·NewModified!:指定行是新行且行中的列已经赋值。
新行的状态成为NewModified!,既可能是用户输入或使用SetItem函数造成的,也可能是由于它的某列具有缺省值。
本状态只适用于行,不适用于单个列。
数据窗口中行或列的修改状态决定Update()函数将为该行或该列产生何种类型的SQL语句。
对主缓冲区和过滤缓冲区中的行,Update为状态是NewModified!的行产生Insert语句,为状态是DateModified!的行产生Update语句,只有状态是DataModified!的列才会包含在Update语句中。
PB中制作位图菜单
PB中制作位图菜单下面通过一个实例来叙述如何通过API函数实现位图菜单。
在本实例中,假设在创建一个应用对象Application之后,再分别创建一个菜单对象m_main和窗口对象w_main。
在菜单对象m_main中有如下菜单项:File/New、File/Open、File/Save、File/Exit、Edit/Copy、Edit/Cut、Edit/Paste和Edit/Delete。
在窗口对象w_main中,将其"Title"属性设置为"位图菜单",并且将菜单"w_main"关连到窗口"w_main"上。
1)首先为窗口w_main声明局部外部函数FUNCTION ulong LoadImageA(ulong hintance, string filename,uint utype, int x,int y,uint fload) & LIBRARY "USER32.DLL"//该函数实现装入图象数据的功能FUNCTION boolean SetMenuItemBitmaps(ulong hmenu,uint upos,uint flags,&ulong handle_bm1,ulong handle_bm2) LIBRARY "USER32.DLL"//该函数设置菜单位图FUNCTION int GetSystemMetrics( int nIndex ) LIBRARY "USER32.DLL"//该函数获取菜单的位图尺寸FUNCTION ulong GetMenuItemID(ulong hMenu,uint uItem) LIBRARY "USER32.DLL"//该函数获取菜单项目的ID号FUNCTION int GetSubMenu (ulong hMenu,int pos) LIBRARY "USER32.DLL"//该函数获取子菜单项的句柄FUNCTION ulong GetMenu(ulong hWindow) LIBRARY "USER32.DLL"//该函数获取应用的菜单项FUNCTION boolean ModifyMenu(ulong hMnu, ulong uPosition, ulong uFlags, &ulong uIDNewItem, long lpNewI) alias for ModifyMenuA LIBRARY "USER32.DLL"//该函数用来更新菜单项2)其次为窗口w_main声明实例变量//Win32常量CONSTANT Integer IMAGE_BITMAP = 0CONSTANT Integer LR_LOADFROMFILE = 16CONSTANT Integer SM_CXMENUCHECK = 71CONSTANT Integer SM_CYMENUCHECK = 72CONSTANT Integer MF_BITMAP = 4CONSTANT Integer MF_BYPOSITION = 10243)最后给窗口w_main的Open事件添加脚本long ll_MainHandlelong ll_SubMenuHandleinteger li_MenuItemIDlong ll_Xlong ll_Ylong ll_BitmapNewlong ll_BitmapOpenlong ll_BitmapSavelong ll_BitmapExitlong ll_BitmapCopylong ll_BitmapCutlong ll_BitmapPastelong ll_BitmapDelete//取得菜单句柄ll_MainHandle = GetMenu(Handle(this))//取得第一个菜单项的句柄ll_SubMenuHandle = GetSubMenu(ll_MainHandle,0)//装入图像数据ll_BitmapNew = LoadImageA(0,'new.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE)ll_BitmapOpen = LoadImageA(0,'open.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE)//取得第一个子菜单项的ID并修改菜单li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,0)ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapNew) //取得第二个子菜单项的ID并修改菜单li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,1)ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapOpen) //取得菜单缺省check-mark位图的尺寸ll_x = GetSystemMetrics(SM_CXMENUCHECK)ll_y = GetSystemMetrics(SM_CYMENUCHECK)//按系统尺寸装入图像ll_BitmapSave = LoadImageA(0,'save.bmp', IMAGE_BITMAP ,ll_x,ll_y,LR_LOADFROMFILE) ll_BitmapExit= LoadImageA(0,'exit.bmp', IMAGE_BITMAP ,ll_x,ll_y,LR_LOADFROMFILE) //设置菜单位图SetMenuItemBitmaps(ll_SubMenuHandle,2,MF_BYPOSITION,ll_BitmapSave,ll_BitmapSave) SetMenuItemBitmaps(ll_SubMenuHandle,3,MF_BYPOSITION,ll_BitmapExit,ll_BitmapExit)//取得第二个菜单项的句柄Ll_SubMenuHandle = GetSubMenu(ll_MainHandle,1)//装入图像数据ll_BitmapCopy = LoadImageA(0,'copy.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE)ll_BitmapCut = LoadImageA(0,'cut.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE)//取得第一个子菜单项的ID并修改菜单li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,0)ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapCopy)上面的代码知识如何设置File与Edit子菜单项的脚本。
麦子学院Android开发教程Bitmap和Drawable用法详解
本文章来给大家介绍Android中Bitmap和Drawable用法详解,有需要了解的同学可进入参考。
一、相关概念1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象2、Canvas画布,绘图的目的区域,用于绘图3、Bitmap位图,用于图的处理4、Matrix矩阵二、Bitmap1、从资源中获取BitmapResources res = getResources();Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);2、Bitmap → byte[]代码如下public byte[] Bitmap2Bytes(Bitmap bm) {ByteArrayOutputStream baos = new ByteArrayOutputStream();Bitmap bmp = ()press(pressFormat.PNG, 100, baos);return baos.toByteArray();}3、byte[] → Bitmap代码如下public Bitmap Bytes2Bimap(byte[] b) {if (b.length != 0) {return BitmapFactory.decodeByteArray(b, 0, b.length);} else {return null;}}Bitmap缩放代码如下public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {int w = bitmap.getWidth();int h = bitmap.getHeight();Matrix matrix = new Matrix();float scaleWidth = ((float) width / w);float scaleHeight = ((float) height / h);matrix.postScale(scaleWidth, scaleHeight);Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); return newbmp;}5、将Drawable转化为Bitmap代码如下public static Bitmap drawableToBitmap(Drawable drawable) {// 取 drawable 的长宽int w = drawable.getIntrinsicWidth();int h = drawable.getIntrinsicHeight();// 取 drawable 的颜色格式Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888: Bitmap.Config.RGB_565;// 建立对应 bitmapBitmap bitmap = Bitmap.createBitmap(w, h, config);// 建立对应 bitmap 的画布Canvas canvas = new Canvas(bitmap);drawable.setBounds(0, 0, w, h);// 把 drawable 内容画到画布中drawable.draw(canvas);return bitmap;}public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) { int w = bitmap.getWidth();int h = bitmap.getHeight();Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);Canvas canvas = new Canvas(output);final int color = 0xff424242;final Paint paint = new Paint();final Rect rect = new Rect(0, 0, w, h);final RectF rectF = new RectF(rect);paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(color);canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(bitmap, rect, rect, paint);return output;}6、获得圆角图片代码如下public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {final int reflectionGap = 4;int w = bitmap.getWidth();int h = bitmap.getHeight();Matrix matrix = new Matrix();matrix.preScale(1, -1);Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w, h / 2, matrix, false);Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2), Config.ARGB_8888);Canvas canvas = new Canvas(bitmapWithReflection);canvas.drawBitmap(bitmap, 0, 0, null);Paint deafalutPaint = new Paint();canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint);canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null);Paint paint = new Paint();LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,0x00ffffff, TileMode.CLAMP);paint.setShader(shader);// Set the Transfer mode to be porter duff and destination inpaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));// Draw a rectangle using the paint with our linear gradientcanvas.drawRect(0, h, w, bitmapWithReflection.getHeight()+ reflectionGap, paint);return bitmapWithReflection;}三、Drawable代码如下Bitmap bm=xxx; //xxx根据你的情况获取BitmapDrawable bd= new BitmapDrawable(getResource(), bm);因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
详解AndroidBitmap的使用
详解AndroidBitmap的使⽤⼀图⽚表⽰原理图⽚是由每个像素点来组成像素点就是⼩⽅块图⽚的⼤⼩等于宽*⾼*每个像素点的⼤⼩⼆加载图⽚OOM异常解决办法其中big.jpg是⼀张21.2MB的⾼清图public class MainActivity extends AppCompatActivity implements View.OnClickListener {ImageView mImageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);findViewById(R.id.load).setOnClickListener(this);mImageView = findViewById(R.id.image);}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.load:load();break;}}private void load() {try {BitmapFactory.Options option = new BitmapFactory.Options();option.inJustDecodeBounds = true; //只会解析图⽚的⼤⼩不会加载图⽚的内容BitmapFactory.decodeStream(getAssets().open("big.jpg"), null, option);// 获取图⽚的宽⾼int width = option.outWidth;int height = option.outHeight;// 获取屏幕的宽⾼int screenWidth = getScreenWidth();int screenHeight = getScreenHeight();// 把图⽚的宽⾼和屏幕的宽⾼进⾏对⽐int scaleX = width / screenWidth;int scaleY = height / screenHeight;int scale = scaleX > scaleY ? scaleX : scaleY;option.inJustDecodeBounds = false; //加载图⽚的内容// 如果设置为>1 请求解码器对原始数据进⾏⼦采样例如inSampleSize==4返回图像的宽度/⾼度是原始图像的1/4 // 任何值<=1都与1相同option.inSampleSize = scale;Bitmap bitmap = BitmapFactory.decodeStream(getAssets().open("big.jpg"), null, option);int byteCount = bitmap.getByteCount();Log.i("HUANG", "byteCount=" + byteCount);mImageView.setImageBitmap(bitmap);} catch (IOException e) {e.printStackTrace();}}/** 得到设备屏幕的宽度 (像素) **/private int getScreenWidth() {return getResources().getDisplayMetrics().widthPixels;}/** 得到设备屏幕的⾼度 (像素) **/private int getScreenHeight() {return getResources().getDisplayMetrics().heightPixels;}}三图⽚处理原理Android⾥⾯所有的显⽰效果都是绘制出来的⽤Android封装好的绘图类去绘制图⽚Canvas: 画布Paint: 画笔Matrix: 图形矩阵 3*3Bitmap: 要绘制的图⽚四图⽚的旋转平移缩放其中mm.jpg是⼀张57KB的图属于正常范围不需要额外处理public class MainActivity extends AppCompatActivity implements View.OnClickListener {ImageView mImageView, mCopyView;Bitmap mBitmap;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);findViewById(R.id.change).setOnClickListener(this);mImageView = findViewById(R.id.image);mCopyView = findViewById(R.id.copy);try {mBitmap = BitmapFactory.decodeStream(getAssets().open("mm.jpg"));mImageView.setImageBitmap(mBitmap);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.change:change();break;}}// 图⽚的旋转平移缩放// 注意: 旋转平移缩放这三种效果在本案例中只能同时存在⼀种分别打开注释看效果private void change() {if (null == mBitmap) return;// 新建空⽩的图⽚要和原图的⼤⼩⼀样Bitmap bitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), mBitmap.getConfig()); Canvas canvas = new Canvas(bitmap); //画布传参必须是⼀个空⽩的图⽚否则报错Paint paint = new Paint(); //画笔Matrix matrix = new Matrix(); //矩阵// 旋转30度以图⽚的中⼼为圆⼼matrix.setRotate(30, mBitmap.getWidth() / 2, mBitmap.getHeight() / 2);// X轴平移80//matrix.setTranslate(80, 0);// Y轴缩为原来的0.5//matrix.setScale(1F, 0.5F, mBitmap.getWidth() / 2, mBitmap.getHeight() / 2);canvas.drawColor(Color.WHITE); //绘制背景为⽩⾊canvas.drawBitmap(mBitmap, matrix, paint); //绘制图⽚mCopyView.setImageBitmap(bitmap);}}五图⽚的涂鸦操作其中mm.jpg是⼀张57KB的图属于正常范围不需要额外处理public class MainActivity extends AppCompatActivity implements View.OnTouchListener {ImageView mImageView;Bitmap mNewBitmap;Canvas mCanvas;Paint mPaint;Matrix mMatrix;int mStartX, mStartY; //按下点的坐标@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);mImageView = findViewById(R.id.image);try {Bitmap bitmap = BitmapFactory.decodeStream(getAssets().open("mm.jpg"));// 不能直接在原图上进⾏绘制必须新建空⽩的图⽚mNewBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); mCanvas = new Canvas(mNewBitmap);mPaint = new Paint();mPaint.setColor(Color.YELLOW);mMatrix = new Matrix();// 把原图绘制在空⽩的图⽚上mCanvas.drawBitmap(bitmap, mMatrix, mPaint);mImageView.setImageBitmap(mNewBitmap);mImageView.setOnTouchListener(this); //设置触摸监听} catch (IOException e) {e.printStackTrace();}}@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN: //按下mStartX = (int) event.getX();mStartY = (int) event.getY();break;case MotionEvent.ACTION_MOVE: //移动// 获取移动点的坐标int moveX = (int) event.getX();int moveY = (int) event.getY();// 画线mCanvas.drawLine(mStartX, mStartY, moveX, moveY, mPaint);// 把新图设置给ImageViewmImageView.setImageBitmap(mNewBitmap);// 把移动点置为开始点mStartX = moveX;mStartY = moveY;break;case MotionEvent.ACTION_UP: //弹起break;}return true; //事件⾃⼰来处理}}六图⽚的颜⾊处理图⽚是有颜⾊核⼼原理就是重绘图⽚改变图⽚的颜⾊就是对画笔进⾏操其中mm.jpg是⼀张57KB的图属于正常范围不需要额外处理public class MainActivity extends AppCompatActivity implements View.OnClickListener {ImageView mImageView;Bitmap mBitmap, mNewBitmap;Canvas mCanvas;Paint mPaint;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);mImageView = findViewById(R.id.image);try {mBitmap = BitmapFactory.decodeStream(getAssets().open("mm.jpg"));mImageView.setImageBitmap(mBitmap);mNewBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), mBitmap.getConfig());mCanvas = new Canvas(mNewBitmap);mPaint = new Paint();findViewById(R.id.change).setOnClickListener(this);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.change:int randomR = (int) (Math.random() * 256); //0-255 随机数int randomG = (int) (Math.random() * 256); //0-255 随机数int randomB = (int) (Math.random() * 256); //0-255 随机数int randomA = (int) (Math.random() * 256); //0-255 随机数float colorR = (255 - randomR) / (float) 255;float colorG = (255 - randomG) / (float) 255;float colorB = (255 - randomB) / (float) 255;float colorA = (255 - randomA) / (float) 255;Log.i("HUANG", "randomR=" + randomR);Log.i("HUANG", "randomG=" + randomG);Log.i("HUANG", "randomB=" + randomB);Log.i("HUANG", "randomA=" + randomA);Log.i("HUANG", "colorR=" + colorR);Log.i("HUANG", "colorG=" + colorG);Log.i("HUANG", "colorB=" + colorB);Log.i("HUANG", "colorA=" + colorA);ColorMatrix matrix = new ColorMatrix(); //颜⾊矩阵 5*4matrix.set(new float[]{colorR, 0, 0, 0, 0, //red0, colorG, 0, 0, 0, //green0, 0, colorB, 0, 0, //blue0, 0, 0, colorA, 0 //alpha});ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);mPaint.setColorFilter(filter);mCanvas.drawBitmap(mBitmap, new Matrix(), mPaint);mImageView.setImageBitmap(mNewBitmap);break;}}}七内存泄漏和内存溢出内存泄漏(MemoryLeak)有些对象只有有限的⽣命周期当它们的任务完成之后它们将被回收如果在对象的⽣命周期本该结束的时候这个对象还被⼀系列的引⽤这就会导致内存泄漏随着泄漏的累积 App将消耗完内存内存泄漏最终会导致内存溢出内存泄漏的原因1. 资源对象没关闭(Cursor File...)2. 没有及时调⽤recycle()释放不再使⽤的Bitmap3. ⼴播注册没取消4. ...内存溢出(OutOfMemoryError OOM)内存溢出是指当对象的内存占⽤已经超出分配内存的空间⼤⼩内存溢出的原因1. Bitmap过⼤2. 内存泄露导致3. ...⼋ ImageView中scaleType属性值含义以上就是详解Android Bitmap的使⽤的详细内容,更多关于Android Bitmap的资料请关注其它相关⽂章!。
60个PB数据窗口技巧
60个数据窗口技巧1.如何让存储文件目录的列,显示图片? 答:选择对应的column的display as picture属性为true2、如何复制grid类型的所选择的行的数据到系统剪切板?答:string ls_selectedls_selected=dw_1.Object.DataWindow.Selected.Dataclipboard(ls_selected)3、如何复制graph风格的datawindow中的图形到剪切板?答:dw_1.clipbord("gr_1")4、如何设置的DW底色?在DW的editsource中改变color的值5、如何将Grid风格改成自由格式?在DW的editsource中将processing=1的1改为06、要新建一个表A但风格和现有表格B风格一样,怎么将A表快速设置成表B风格?复制B表C,在C表的DW中的editsource中将表名和字段名改成A表的,即可7、如何实现gird风格的datawindow的多栏表头?答:添加 text到header带区,并设置band属性为foreground保存,edit source 修改text的x和width 属性表达式如下:x="100~t integer(describe('firstcol.x')" width="100~tinteger(describe('lastcol.x')) -integer(describe('firstcol.x')) +integer(describe('lastcol.width'))8、如何过滤dddw编辑风格的显示值为指定值的记录?答:dw_1.setfilter("lookupdisplay('column_name')='"+ls_display_value_your+"'")dw_1.filter()9、如何设置datawindow的某一列为空?答:string ls_temp[]setnull(ls_temp)dw_1. O B J E C T.columnname.primary.current=ls_temp10、如何设置datawindow的单双行不同颜色间隔?答:在detail带区的color属性表达式中写上if(mod(getrow(),2)=1 ,rgb(255,0,0),rgb(0,255,0)),如果是当前行以第三种颜色表示,表达式如下:if(getrow()=current(),rgb(255,0,0),if(mod(getrow(),2)=1 ,rgb(0,0,255),rgb(0,255,0)))11、如何获取指定名称的datawindow O B J E C T?答:DWObject ldwo_use,ldwo_abcldwo_use = dw_1.Objectldwo_abc = ldwo_use.__get_attribute("t_1",FALSE)//t_1为datawindow中text对象的名称注﹕不是版本的问题,是你没找对位置。
PB数据窗口基础
PB数据窗口数据窗口控件-datawindowPB9.0提供了28个属性、35个默认事件、162个函数。
注意与数据窗口对象的区分。
【其他】■脚本的执行效率*尽量不要在RetrieveRow事件下编写脚本(包括注释)。
*如果数据窗口的DoubleClicked事件中编写了脚本,那么在数据窗口的C1icked事件中的脚本应该尽量短,否则双击事件中的脚本永远不可能得到执行。
一般来说,Cliked中脚本的执行时间和两次击鼠标之间的间隔时间之和,不应该大于操作系统中所设定的鼠标双击时间间隔,否则双击事件永远不可能触发,双击时仅仅是接连两次触发c1icked事件。
*在数据窗口中录入数据时,事件EditChanged是触发频率最高的,每一个按钮都触发该事件;触发频率仅次于该事件的是ItemChanged事件和ItemFocusChanged,只要修改了单元中的内容,每次触发ItemFocusChanged事件都会触发ItemChanged事件。
在这些事件下编写过长的脚本会非常影响录入工作的效率。
同样,事件RowFocusChanged的触发频率也是相当高的。
一般来说是可以避免在这四个事件中编写脚本的。
■dw o参数使用数据窗口的某些事件中可以使用一个称为dwo的变量,该变量保存数据窗口中的部分信息,用数据窗口的属性可以读取这些信息dwo.type:读取在dwo中保存的对象类型。
对象类型可能有bitmap、button、column、compute、graph、groupbox、line、ole、ellipse、rectangle、roundrectangle、report、tableblob、text、datawindow(当用户没有单击特定对象时):column的列名dwo.Primary[row]:column的数据dwo.Selected:选中column的数据■数据缓冲区数据窗口在运行时要创建四个缓冲区,分别是主缓冲区、删除缓冲区、过滤缓冲区和原始缓冲区,这四个缓冲区各司其职、共同配合,来保证数据窗口对数据的正确处理。
浅谈如何利用PB实现图片透明叠加
浅谈如何利用PB实现图片透明叠加一、基本思路程序的原理是先创建两个用于起屏蔽作用的模板DC(装载单色掩码位图,且这二者正好是相反的关系,通过NotSrcCopy实现),分别与源DC和目标DC进行与操作(SrcAnd),这时就能将源DC和目标DC中要透明的区域和不要透明的区域正好各自划分成黑色部分(即象素颜色为0)(具体为源DC中透明区域为黑色,目标DC中不要透明区域为黑色),最后将“操作后”的源DC和目标DC二者再进行“异或”(SrcXor)操作即可实现二者的透明叠加。
这里面关键的就是利用0和无论其他什么值(0、1)进行“异或”操作的结果都仍是原值(即仍是0、1),这样就可以保证象素最后XOR的结果是保留了叠加的效果。
类似的我们还可以1和其他任何值相“与”的结果仍是原值来实现同样的效果。
这里面关键是创建的起屏蔽作用的模板DC,其就是利用CREATEBITMAP、SETBKCOLOR、BITBLT 结合创建的。
详见下述代码。
二、具体实现(一)基本工作创建一个WINDOW窗口和三个PICTURE控件,分别用于显示源图片、目标图片、合成结果图片。
声明本地外部函数:Function ulong CreateCompatibleDC(ulong hdc) LIBRARY "gdi32.dll"Function ulong CreateBitmap(ulong nWidth,ulong nHeight,ulong nPlanes,ulong nBitCount,ulong lpBits) LIBRARY "gdi32.dll"Function ulong CreateCompatibleBitmap(ulong hdc,ulong nWidth,ulong nHeight) LIBRARY "gdi32.dll"Function ulong SelectObject(ulong hdc,ulong hObject) LIBRARY "gdi32.dll"Function ulong SetBkColor(ulong hdc,ulong crColor) LIBRARY "gdi32.dll"Function ulong BitBlt(ulong hDestDC,ulong x,ulong y,ulong nWidth,ulong nHeight,ulong hSrcDC,ulong xSrc,ulong ySrc,ulong dwRop) LIBRARY "gdi32.dll"Function ulong DeleteObject(ulong hObject) LIBRARY "gdi32.dll"Function ulong DeleteDC(ulong hdc) LIBRARY "gdi32.dll"Function ulong GetDC(ulong hwnd) LIBRARY "user32.dll"Function ulong ReleaseDC(ulong hwnd,ulong hdc) LIBRARY "user32.dll"Function ulong LoadImage(ulong hInst,ref string lpsz,ulong un1,ulong n1,ulong n2,ulong un2) LIBRARY "user32.dll" ALIAS FOR "LoadImageA"(二)具体代码Long OrigColorLong OrigModeLong saveDCLong maskDCLong invDCLong resultDCLong hSaveBmpLong hMaskBmpLong hInvBmpLong hResultBmpLong hSavePrevBmpLong hMaskPrevBmpLong hInvPrevBmpLong hDestPrevBmpLong hsrcdcLong hDestDCLong nWidth,nHeightLong transcolorlong ret,hBitmapstring ls_tmphsrcdc = CreateCompatibleDC(getdc(handle(p_1)))hDestDC = getdc(handle(p_3))nWidth = UnitsToPixels(p_1.width, XUnitsToPixels!)nHeight = UnitsToPixels(p_1.height, YUnitsToPixels!)//这里由于PB默认采用PB UNIT单位,而API处理度量单位采用象素单位因此需要进行单位转换transcolor = 0//此处设置要透明的RGB颜色,此处为黑色;ls_tmp = "srce.bmp"hBitmap = LoadImage(0, ls_tmp, 0, 0, 0, 16)saveDC = CreateCompatibleDC(hDestDC)maskDC = CreateCompatibleDC(hDestDC)invDC = CreateCompatibleDC(hDestDC)resultDC = CreateCompatibleDC(hDestDC)hMaskBmp = CreateBitmap(nWidth, nHeight, 1, 1, 0)hInvBmp = CreateBitmap(nWidth, nHeight, 1, 1, 0)hResultBmp = CreateCompatibleBitmap(hDestDC, nWidth, nHeight)hSaveBmp = CreateCompatibleBitmap(hDestDC, nWidth, nHeight)ret = SelectObject(hsrcdc, hBitmap)hSavePrevBmp = SelectObject(saveDC, hSaveBmp)hMaskPrevBmp = SelectObject(maskDC, hMaskBmp)hInvPrevBmp = SelectObject(invDC, hInvBmp)hDestPrevBmp = SelectObject(resultDC, hResultBmp)OrigColor = SetBkColor(hSrcDC, TransColor)ret = BitBlt(maskDC, 0, 0, nWidth, nHeight, hSrcDC, 0, 0, 13369376 )//注:13369376为BitBlt函数的参数-SRCCOPY,表示将源矩形区域直接拷贝到目标矩形区域TransColor = SetBkColor(hSrcDC, OrigColor)ret = BitBlt(invDC, 0, 0, nWidth, nHeight, maskDC, 0, 0, 3342344)//注:3342244为BitBlt函数的参数-NOTSRCCOPY,表示将源矩形区域颜色取反后拷贝到目标矩形区域ret = BitBlt(resultDC, 0, 0, nWidth, nHeight, hDestDC, 0, 0, 13369376)ret = BitBlt(resultDC, 0, 0, nWidth, nHeight, maskDC, 0, 0, 8913094)//注:8913094为BitBlt函数的参数-SRCAND,表示通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并ret = BitBlt(saveDC, 0, 0, nWidth, nHeight, hSrcDC, 0,0, 13369376)ret = BitBlt(saveDC, 0, 0, nWidth, nHeight, invDC, 0, 0, 8913094)ret = BitBlt(resultDC, 0, 0, nWidth, nHeight, saveDC, 0, 0, 6684742)/注:6684742为BitBlt函数的参数-SRCINVERT,表示通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并ret = BitBlt(hDestDC, 0, 0, nWidth, nHeight, resultDC, 0, 0, 13369376)ret = SelectObject(saveDC, hSavePrevBmp)ret = SelectObject(resultDC, hDestPrevBmp)ret = SelectObject(maskDC, hMaskPrevBmp)ret = SelectObject(invDC, hInvPrevBmp)ret = DeleteObject(hSaveBmp)ret = DeleteObject(hMaskBmp)ret = DeleteObject(hInvBmp)ret = DeleteObject(hResultBmp)ret = DeleteDC(saveDC)ret = DeleteDC(invDC)ret = DeleteDC(maskDC)ret = DeleteDC(resultDC)ret = ReleaseDC(handle(p_1),hsrcdc)ret = ReleaseDC(handle(p_3),hDestDC)至此,图片透明叠加效果全部完成,效果图见:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
pb的bitmap用法
PB(PowerBuilder)中的bitmap可以通过以下步骤进行使用:
1. 创建一个位图(bitmap)对象。
2. 定义位图的数据类型,可以是8位无符号整数(uint8)或16位无符号整数(uint16)。
3. 初始化位图,可以使用位图编辑器或编程方式进行初始化。
4. 在应用程序中,可以使用位图对象进行图像处理、显示等操作。
例如,可以将位图显示在窗口、控件或打印机上,也可以将位图保存到文件中。
5. 如果需要将位图数据保存到数据库中,可以使用PowerBuilder 的数据窗口(DataWindow)控件,将位图数据作为二进制数据类型存储在数据库中。
以上是PB中bitmap的基本用法,具体实现方式可能因PowerBuilder版本和开发环境而有所不同。
建议参考PowerBuilder的官方文档或相关教程进行深入学习。