sendmessage api函數在powerbuilder中應用
sendmessage api函數在powerbuilder中應用
一、引言
在powerbulider巧妙地調用api函數sendmessage,可以完成pb中的一些用常規的方法而很難實
現的功能,特將對該api函數在powerbuilder中的使用,例舉幾個方面的運用,以期起到拋磚引玉的效果(以下代碼完全可以使用powerbuilder中的send函數替代sendmessage 這個api函數,因起稿比較匆忙,代碼未經測試)
二、函數說明
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的一些不足。