篇一:PowerBuilder(类、事件、数据类型、API)
基本目录整理: 事件含义
5种类: custom class :不可见用户自定义类 ,如实现函数的多态
standard class :标准不可见控件 扩展类
custom visual :用户自定义 可见类
External Visual: 外部可视类,如ocx引入
Standard Visual: PB标准可视控件扩展
“Control”和“Object”的区别:
在PB里,“Control”和“Object”都是类,只不过前者是可视类,后者是不可视类,叫法不同罢了。无论使用哪种方式创建的,对于PB库画板来说,都是UserObject,通过Insert-Object-UserObject或Insert-Control-UserObject都可以把它插入到Window里,当然,这个对象应该是可视的。另外的插入办法是通过PB的IDE左侧的对象树,直接用鼠标Drag就可以了,这种方法不仅可以插入可视的UserObject,还可以插入不可视的类(可以通过View-Non Visual object llist看到它)
对于拷贝来的代码,可以用一下方式判读是从哪里继承来的:
双击该对象,观察样式
1:如果仅仅是一个DataWindow或其它控件,说明该对象是从Standsrt Visual 继承的;
2:如果是多个控件的复合体,说明它是从Custom Visual继承的
3:如果是一个PB中不存在的控件,说明它可能是从External Visual 继承的 4:如果它没有Layout视图,说明它是从Custom Class 中继承的
5:如果它LayOut视图,但没有什么控件,说明它是从Standard Class中继承的
还有一个办法是右击该对象,选择Edit source,看看它的声明,Global type XXX from YYY,YYY就是祖先的类型
总的来说,从横向和纵向来看:
横向--standard,custom
纵向--visual,nonvisual
既然是标准,就有pb基本控件的事件,属性等,反之custom则得自定义很多事件和属性
投机的检查代码:
选择Edit source,看看它的声明,Global type XXX from YYY,YYY就是祖先的类型
如果是external visual就可以看到以下代码:
global type b from userobject
integer width = 288 integer height = 168
userobjects objecttype = externalvisual!
事件的含义
单选或多选按钮消息(前缀:pbm_bm) pbm_bmgetcheck 单选按钮或多选按钮是否被选。
pbm_bmgetstate 按钮是否加亮。
pbm_bmsetcheck 将无线按钮或确认框的选中状态改为未选中状态,反之亦然。 pbm_bmsetstate 加亮或不加亮按钮。
pbm_bmchange 改变按钮的风格,例如,改为单选按钮或组合框。
单选或多选按钮通知消息(前缀:pbm_bn) pbm_bnclicked 按钮控件被点中。 pbm_bndisable 使按钮控件无效。
pbm_bndoubleclicked 按钮控件被双点。
pbm_bndragdrop 一个对象被放到按钮控件。
pbm_bndragenter 一个对象被拖到按钮控件。
pbm_bndragleave 一个对象被拖离按钮控件。
pbm_bndragover 一个对象被拖经按钮控件。
pbm_bnhilite 按钮控件被加亮。
pbm_bnpaint 按钮控件被绘制。
pbm_bnsetfocus 按钮控件获得聚焦。
pbm_bnunhilite 按钮控件不被加亮。
通用对话框消息(前缀:pbm_cb) pbm_cbaddstring 将字符串加到通用对话框。
pbm_cbdeletestring 从通用对话框删除一个字符串。
pbm_cbdir 加一个目录列表到通用对话框。
pbm_cbfindstring 搜索以一组字符开头的字符串。
pbm_cbfindstringexact 搜索与所提供的字符完全匹配的字符串。 pbm_cbgetcount 列表框中的项数。
pbm_cbgetcursel 当前被选项的数目。
pbm_cbgetdroppedcontrolset 列表框在屏幕上的坐标位置。
pbm_cbgeteditsel 编辑器控件中被选字符的范围。
pbm_cbgetextendedui 缺省或扩展的用户界面。
pbm_cbgetitemdata 重画的列表框中的4字节(32位)项。
pbm_cbgetitemheight 列表框中某一项的高度。
pbm_cbgetlbtext 列表框中的文本。
pbm_cbgetlbtextlen 列表框中文本的长度。
pbm_cbinsertstring 向列表框中增加新的字符串或4字节项。
pbm_cblimittext 限制能被输入到列表框中的字符数。
pbm_cbresetcontent 删除列表框中所有元素。
pbm_cbselectstring 搜索匹配的字符串并显示。
pbm_cbsetcursel 在列表框中选择并显示一项。
pbm_cbseteditsel 在列表框的编辑区域中选择一块文本。
pbm_cbsetextendedui 设置缺省或扩展的用户界面。
pbm_cbsetitemdata 在列表框中设定4字节(32位)项。
pbm_cbsetitemheight 设置列表框中项的高度。
pbm_cbshowdropdown 转换(显示或隐藏)列表框中拖放区域。
通用对话框通知消息(前缀:pbm_cbn) pbm_cbndblclk 用户在列表中某一项上双点。
pbm_cbndragdrop 一个对象被放到通用对话框控件上。
pbm_cbndragenter 一个对象被拖到通用对话框控件上。
pbm_cbndragleave 一个对象被拖离通用对话框控件。
pbm_cbndragover 一个对象被拖经通用对话框控件。
pbm_cbndropdown 列表框的下放区域即将被显示。
pbm_cbneditchange 编辑器控件中的文本发生变化。
pbm_cbneditupdate 列表框编辑器控件中的文本即将被改变。
pbm_cbnerrspace 列表框满,不能再向其中加入项。
pbm_cbnkillfocus 通用列表框失去聚焦。
pbm_cbnselchange 列表框中被选文本被改变。
pbm_cbnselendcancel 用户按下了"取消"按钮。
pbm_cbnselendok 用户按下了"确认"按钮。
pbm_cbnsetfocus 通用对话控件拥有聚焦。
数据窗口消息(前缀:pbm_dw) pbm_dwclosedropdown 关闭下拉式数据窗口。
pbm_dwscrollend 在数据窗口中卷滚到最后一行。
篇二:SendMessage API函数在PowerBuilder中应用
SendMessage API函数在PowerBuilder中应用
一、引言
在Powerbulider巧妙地调用API函数SendMessage,可以完成Pb中的一些用常规的方法而很难实
现的功能,特将对该api函数在Powerbuilder中的使用,例举几个方面的运用,以期起到抛砖引玉的效果
二、函数说明
SendMessage函数说明:
说明
调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。SendMessageBynum, SendMessageByString是该函数的“类型安全”声明形式 返回值
Long,由具体的消息决定
参数表
参数 类型及说明
hwnd Long,要接收消息的那个窗口的句柄
wMsg Long,消息的标识符
wParam Long,具体取决于消息
lParam Any,具体取决于消息
Powerbuilder中已使用函数Send函数对其进行了封装
函数原形:Send ( handle, message#, lowword, long )
Send函数说明:
说明
调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。
返回值
Long,由具体的消息决定
参数表
参数 类型及说明
handle Long,要接收消息的那个窗口的句柄
message# Long,消息的标识符
lowword Long,具体取决于消息
long long,具体取决于消息
3、 应用举例
定义外部函数引用声明:
funcation long SendMessage (long hwnd As Long,long wMsg , long wParam,long lParam) Library "user32.dll" Alias for "SendMessageA"
funcation long ReleaseCapture() Library "user32.dll"
定义实例变量:
Constant long LB_ITEMFROMPOINT = 425
Constant long HTCAPTION = 2
Constant long WM_NCLBUTTONDOWN = 161
Constant long EM_GETLINE = 404
Constant long EM_GETLINECOUNT = 399
Constant long EM_GETLINECOUNT = 186
Constant long EM_GETLINE = 196
Constant long TVM_SETITEMHEIGHT = 4379
Constant long EM_LINESCROLL = 182
Constant long EM_LIMITTEXT=197
1、列表框中鼠标移动时检测位置项
Powerscript:
在列表框的自定义事件ue_mousemove(pbm_mousemove)中写入如下代码: pos = unitstopixels(parent.pointerx(),XUnitsToPixels!)+
unitstopixels(parent.pointery(),yUnitsToPixels!) * 65536
idx = SendMessage(handle(this), LB_ITEMFROMPOINT, 0, pos)
If idx < 65536 Then sle_1.Text = lb_1.text(idx)
2、在列表框中查找匹配的项目
Powerscript:
窗口的open事件:
lb_1.AddItem ("软件")
lb_1.AddItem("电脑游戏")
lb_1.AddItem("电视机")
lb_1.AddItem("电视台")
lb_1.AddItem("电脑")
lb_1.AddItem("电脑游戏软件")
singlelineedit控件的modified事件:
long li_index
li_index= SendMessage(handle(this), EM_GETLINECOUNT, -1, sle_1.text) lb_1.selectitem(li_index)
3、为ListBox添加水平滚动条
Powerscript:
窗口的open事件:
lb_1.AddItem("软件")
lb_1.AddItem("电脑游戏")
lb_1.AddItem("电视机")
lb_1.AddItem("电视台")
lb_1.AddItem("电脑")
lb_1.AddItem("电脑游戏软件")
SendMessage (handle(this), EM_GETLINE, 250, 0)
4、实现拖动无标题栏窗体
Powerscript:
在窗口的自定义事件ue_lbuttondown(pbm_lbuttondown)
long ReturnVal
x = ReleaseCapture()
ReturnVal = SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
5、获取多行文本框行数
Powerscript:
Commandbutton的clicked事件
Messagebox(“”, SendMessage(handle(mle_1), EM_GETLINECOUNT, 0, 0))
6、设置树型列表控件标题行高度
Powerscript:
tv_1的constructor事件:
SendMessage(handle(tv_1), TVM_SETITEMHEIGHT, 60, 0)
7、突破Powerbuilder中的多行文本框32k的限制
Powerscript:
SendMessage(handle(mle_1), EM_LIMITTEXT, 65534, 0)
8、用程序代码控制文本框的滚行与滚列
Powerscript:
SendMessage(handle(sle_1), EM_LINESCROLL, 0, 1)//下卷一行 SendMessage(handle(sle_1), EM_LINESCROLL, 0, -1)//上卷一行 SendMessage(handle(sle_1), EM_LINESCROLL, 1, 0)//右卷一列 SendMessage(handle(sle_1), EM_LINESCROLL, -1, 0)//左卷一列
三、结束语
在编写Powerbuilder应用时,应该充分调用相关的api函数来扩充pb的一些不足。
篇三:pb函数Post
Post()
功能将指定消息加入到某个窗口的消息队列中,这个窗口既可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。
语法Post( handle, messageno, word, long )
参数handle:long类型,指定窗口的系统句柄,将向该窗口邮寄消息messageno:UnsignedInteger类型,指定要邮寄的消息号 word:long类型,指定与消息一起邮寄的word类参数值。如果messageno参数指定的消息不使用该参数,那么将这个参数的值设置为0long:long类型或string,指定与消息一起邮寄的long型参数值或字符串返回值Boolean。如果任何参数的值为NULL,Post()函数返回NULL。
用法Post()函数用于向窗口发送非PowerBuilder预定义事件的消息,这个窗口可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。Post()函数把发送的消息放置在指定窗口消息队列的尾部,然后返回到应用程序中,它并不等待相应事件事件处理程序的执行。这一点与Send()函数不同,Send()函数直接触发指定窗口相应的事件,执行事件处理程序后返回到调用应用中。因此,我们说Post()函数采用的是异步方式,Send()函数采用的是同步方式。Post()函数的参数handle指定接收消息的窗口句柄,对PowerBuilder窗口来说,使用Handle()函数可以得到该句柄。对其它应用程序的窗口来说,可以调用系统API函数查找窗口并得到相应窗口的句柄。如果应用程序要邮寄PowerBuilder定义事件(包括预定义事件和用户定义事件),那么使用PostEvent()函数既简单有方便。当应用程序在long参数位置指定一个字符串时,Post()函数复制一个该字符串的副本,然后将副本的地址传送给指定窗口。 ProfileInt()
功能从初始化文件(.ini)中读取整型设置值。
语法ProfileInt ( filename, section, key, default )
参数filename:string类型,指定初始化文件的名称,可以包括路径,省略路径时,该函数按操作系统的标准路径搜索指定文件section:string类型,指定要得到的值所在的节(Section)key:string类型,指定要得到的值的名称,不用区分大小写default:integer类型,当指定的文件、节名、项目名不存在或不能转换为整数时,函数返回该参数指定的值返回值Integer。函数执行成功时,在指定的文件、节名、项目名不存在任何错误的情况下,函数返回相应项的值;如果指定的文件、节名、项目名不存在或不能转换为整数时,函数返回default参数指定的缺省值。如果发生错误,函数返回-1。如果任何参数的值为NULL,ProfileInt()函数返回NULL。