許多優秀的軟體在視窗菜單的左邊顯示一個小圖片,例如Word,這種菜單圖文並茂,使操作者感到非常直觀。而對於PowerBuilder來說,它為應用開發了幾百個簡單實用地函數,對於一般的開發應用已經足夠,並不需要擴充函數。然而,我們經常希望為終端使用者提供一些PowerBuilder並不能提供的功能,例如這種位元影像菜單,這時我們就需要外部函數。
外部函數是用其他語言編寫的並且儲存在動態連結程式庫(DLL)中的函數。一個DLL就是一個包含可以執行的Windows代碼的檔案。DLL在運行時被動態地裝入和連結,並且可被多個應用程式共用。DLL在記憶體中可以被移動或者固定,可預裝入或者命令裝入,也可以刪除或者永久裝入。開發人員在使用外部函數之前,必須先對其進行定義,外部函數根據範圍的不同而分為兩種類型:全域外部函數與局部外部函數。在PowerBuilder中定義外部函數的文法相當簡單,定義函數時根據有無傳回值分別使用兩種關鍵字:FUNCTION(函數)和SUBROUTINE(子程式)。
在PowerBuilder中,我們也可以通過Windows API函數來實現此項功能,利用Windows API函數能夠實現許多PowerBuilder不能實現的功能。
下面通過一個執行個體來敘述如何通過Windows 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 = 0
CONSTANT Integer LR_LOADFROMFILE = 16
CONSTANT Integer SM_CXMENUCHECK = 71
CONSTANT Integer SM_CYMENUCHECK = 72
CONSTANT Integer MF_BITMAP = 4
CONSTANT Integer MF_BYPOSITION = 1024