物件被右鍵單擊就彈出乙個功能選單是windows應用程式一項不可缺少的功能。在powerbuilder
應用開發中,可在需彈出右鍵選單物件的rbuttondown事件中呼叫該選單的popmenu( )方法實現這一
功能。但多數情況下,應用中有多處要用到不同的彈出式選單,如一一用這種方法就需要做大量的工
作。能不能做乙個通用的選單,可以用任何物件的rbuttondown事件激發彈出,並在彈出前動態改變
彈出選單項的內容,當點選選單項時又可執行被右擊物件的相應使用者事件?由於這一技術最大的特點
是當函式建立成功後,可在任何應用的任何物件中隨心所欲的使用,隨時隨地彈出自己想要顯示的菜
單項,並執行相應的自己需要的功能指令碼,但目前各種資料上鮮有系統、成型的介紹。筆者抱著一種
探索的態度,作了一番仔細深入的研究,並小有收穫,願和大家共同**。
一、 建立彈出選單m_popup
建立乙個選單m_popup,定義選單條m_main,其下有十五個選單項,分別命名為m_item1,m_item2,
……m_item15,各項的顯示文字(text)分別為item1,item2,… …item15; 為m_popup選單定義乙個
powerobject型別的instance變數:anyobject 指令碼為: powerobject anyobject 給m_item1,m_item2,…
…m_item15各選單項的clicked事件下分別輸入指令碼:
anyobject.triggerevent("ue_item1") //m_item1的clicked事件
anyobject.triggerevent("ue_item2")
… …anyobject.triggerevent("ue_item15")
---- 4、定義幾個選單函式:
---- 1) setmenuitem(string itemstring),返回值為null。
---- 引數itemstring是由多個子串組成的。各個子串間用「|」間隔,每個子串為乙個選單項的顯示文字(text)。
---- 該函式功能是把itemstring分解為多個子串,並把子串賦給相應選單項的text。指令碼如下:
int itempos,itemorder=1,i string currentitem
if len(itemstring)=0 then return itempos=pos(itemstring,"|") do while itempos<>0
// itempos為間隔符"|"的位置
currentitem=left(itemstring,itempos
-1) //取出子串
itemstring=mid(itemstring, itempos+1)
this.m_main.item[itemorder].text=currentitem
itempos=pos(itemstring,"|")
itemorder++
loop
this.m_main.item[itemorder].text=itemstring
for i=1 to itemorder
this.m_main.item[i].visible=true
this.m_main.item[i].enabled=true
end if
for i=itemorder+1 to 15
this.m_main.item[i].visible=false
next
2)setitemdisable(integer itemorder) 返回值null。 該函式把第itemorder選單項置灰(disable)。 指令碼如下:
if itemorder<1 or itemorder>15
then
return this.m_main.item[itemorder].enabled=false
3)popupmenu(integer x, integer y) 返回值null。 該函式彈出選單條m_main。 指令碼如下: this.m_main.popmenu(x,y)
二、 rbuttondown事件激發彈出選單m_popup
---- 至此,我們就可以在視窗中任意物件如datawindow、 picture、 singlelineedit、 listbox、
picturelistbox、 dropdownpicturelistbox、 multilineedit、 listview、 treeview等的rbuttondown
事件中寫指令碼呼叫m_popup的函式來實現右鍵單擊彈出乙個選單。
下面以資料視窗dw_1為例,在其rbuttondown事件下寫入指令碼,使得右擊dw_1 可彈出選單:
重新整理/插入/刪除/修改。
步驟如下: 1、事先給視窗定義乙個m_popup 型instance變數om_1: m_popup om_1 2、dw_1的rbuttondown事件指令碼:
if not isvalid(om_1)
then om_1= create m_popup
end if //把選單的anyobject指向被右擊的物件(dw_1) om_1.anyobject=this
om_1.setmenuitem("重新整理|插入|刪除|修改") //可在此呼叫om_1.setitemdisable(itemorder)函式
disable某 選單項。
om_1.popupmenu(this.x+this.pointerx(), this.y+this.pointery())
3、 給dw_1定義使用者事件ue_item1、ue_item2、ue_item3 及 ue_item
4。 事件ue_item1指令碼:
dw_1.retrieve()
事件ue_item2指令碼:
long newrow newrow=dw_1.insertrow(0)
dw_1.scrolltorow(newrow)
事件ue_item3指令碼:
dw_1.deleterow(0)
事件ue_item4指令碼:
dw_1.update()
---- 這樣,只要使用者單擊dw_1彈出的右鍵選單,就可完成對dw_1的插入、刪除、修改等功能。
三、 推廣為全程函式
---- 如果應用中有許多地方要用此功能,我們可以把dw_1的rbuttondown事件指令碼改造成乙個全程函式。
---- 1、將變數om_1定義為global變數: ---- m_popup om_1
---- 2、定義乙個全程函式 ---- pupmenu(powerobject sender,string itemstring,integer x,integer y)
返回值null。其中引數sender為被右擊的物件,itemstring為彈出選單的選單項字串,x、y為選單彈
出的座標位置。 指令碼如下:
if not isvalid(om_1)
then om_1= create m_popup
end if
om_1.anyobject=sender
用rhino做乙個地球
利用全球的地形圖,根據灰度生成高度不一的柱體 將球的uv展開 柱體鋪滿uv,使用曲面流動到球上 準備一張地形圖,這裡隨便找了乙個全球地形圖,有灰度區分高度的最好,顏色的區分的相對的高程不夠真實。開啟rhino,繪製乙個球,將球的uv展開。根據uv的大小繪製乙個面,用於在grasshopper中拾取作...
用html做乙個目錄 用555做乙個高壓發生器
用555做乙個高壓發生器。如圖,ne555為脈衝發生晶元 以此晶元外圍電路為準,頻率約1.7khz,占空比 10 q2為n溝道場效電晶體,q1為npn三極體,t1為高壓線圈。如圖所示 晶元為ne555,為脈衝發生晶元,脈衝頻率由c1 r1和r2來調整。開關管q2為n溝道場效電晶體。r3為場效電晶體的...
用C 做乙個懸浮視窗
用c 做乙個懸浮視窗 含三種移動無標題窗體的辦法 2006年08月24日 星期四 16 36 今天看幾個c 原始碼,再到愚翁專欄 第一步 建立乙個窗體,設定其屬性 this.formborderstyle system.windows.forms.formborderstyle.none this....