VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

动态绑定右键菜单

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
thornbird313



註冊時間: 2004-12-14
文章: 23


第 1 樓

發表發表於: 星期日 三月 12, 2006 2:42 pm    文章主題: 动态绑定右键菜单 引言回覆

在VFP程序中,有时我们会希望在TextBox及EditBox中加一个右键菜单,就像大多数Windows应用程序一样,点右键以后可以进行剪切、复制、粘贴等功能。最标准的做法当然是建立TextBox及EditBox类,然后程序中用到的控件都由这些类派生,这样就比较方便进行控制了。可以把右键菜单加到类的RightClick事件中。然而,有时程序中并不是所有的控件都由我们自定义的类派生的,那时就比较麻烦了。但可以通过VFP9的Windows消息绑定实现这一功能。

思路就是绑定WM_MOUSEMOVE(512)消息,然后获取鼠标下的控件,并进行判断,如果是TextBox或EditBox,则绑定右键菜单到其RightClick事件。具体实现代码如下:

DEFINE CLASS RightClickHandler AS Custom

nOldProc = 0

PROCEDURE Init
LOCAL i
DECLARE INTEGER GetWindowLong IN WIN32API ;
INTEGER hWnd, ;
INTEGER nIndex
DECLARE INTEGER CallWindowProc IN WIN32API ;
INTEGER lpPrevWndFunc, ;
INTEGER hWnd, ;
INTEGER Msg, ;
INTEGER wParam, ;
INTEGER lParam
THIS.nOldProc = GetWindowLong(_VFP.hWnd, -4)
= BINDEVENT(0, 1, THIS, "HandleWinMsg", 4)
ENDPROC

PROCEDURE Destroy
= UNBINDEVENTS(0, 1)
= UNBINDEVENTS(0, 24)
= UNBINDEVENTS(0, 512)
THIS.RemoveDll("GetWindowLong")
THIS.RemoveDll("CallWindowProc")
ENDPROC

PROCEDURE RemoveDll
LPARAMETERS tcDllName
LOCAL lcString
lcString = "CLEAR DLLS " + tcDllName
= EXECSCRIPT(lcString)
ENDPROC

PROCEDURE HandleWinMsg
LPARAMETERS hWnd, Msg, wParam, lParam
LOCAL lnRetVal, laArray[4]
DO CASE
CASE Msg = 1
= UNBINDEVENTS(hWnd, 24)
= UNBINDEVENTS(hWnd, 512)
= BINDEVENT(hWnd, 24, THIS, "HandleWinMsg", 4)
lnRetVal = 0
CASE Msg = 24
lnRetVal = CallWindowProc(THIS.nOldProc, hWnd, Msg, wParam, lParam)
= UNBINDEVENTS(hWnd, 24)
= UNBINDEVENTS(hWnd, 512)
= BINDEVENT(hWnd, 512, THIS, "HandleWinMsg", 4)
CASE Msg = 512
= AMOUSEOBJ(laArray, 1)
IF TYPE("laArray[1].BaseClass") = "C"
IF INLIST(UPPER(laArray[1].BaseClass), "TEXTBOX", ;
"EDITBOX") = .T.
IF laArray[1].Enabled = .T.
TRY
= UNBINDEVENTS(laArray[1], "RightClick", ;
THIS, "HandleRightClick")
CATCH
ENDTRY
TRY
= BINDEVENT(laArray[1], "RightClick", ;
THIS, "HandleRightClick")
CATCH
ENDTRY
ENDIF
ENDIF
ENDIF
lnRetVal = CallWindowProc(THIS.nOldProc, hWnd, Msg, wParam, lParam)
ENDCASE
RETURN lnRetVal
ENDPROC

PROCEDURE HandleRightClick
LOCAL laArray[1], loChangeLabel, lcString
IF AEVENTS(laArray, 0) = 0
RETURN
ENDIF
TEXT TO lcString NOSHOW
DEFINE POPUP shortcut SHORTCUT RELATIVE FROM MROW(),MCOL()
DEFINE BAR _med_undo OF shortcut PROMPT "\<Undo" ;
KEY CTRL+Z, "Ctrl+Z" ;
PICTRES _med_undo ;
MESSAGE "Undoes the last command or action" ;
SKIP FOR TYPE("_SCREEN.ActiveForm.ActiveControl") <> "O"
DEFINE BAR 2 OF shortcut PROMPT "\-"
DEFINE BAR _med_cut OF shortcut PROMPT "Cu\<t" ;
KEY CTRL+X, "Ctrl+X" ;
PICTRES _med_cut ;
MESSAGE "Removes the selection and places it " + ;
"onto the Clipboard" ;
SKIP FOR TYPE("_SCREEN.ActiveForm.ActiveControl") <> "O" OR ;
_SCREEN.ActiveForm.ActiveControl.SelLength = 0 OR ;
_SCREEN.ActiveForm.ActiveControl.ReadOnly = .T.
DEFINE BAR _med_copy OF shortcut PROMPT "\<Copy" ;
KEY CTRL+C, "Ctrl+C" ;
PICTRES _med_copy ;
MESSAGE "Copies the selection onto the Clipboard" ;
SKIP FOR TYPE("_SCREEN.ActiveForm.ActiveControl") <> "O" OR ;
_SCREEN.ActiveForm.ActiveControl.SelLength = 0
DEFINE BAR _med_paste OF shortcut PROMPT "\<Paste" ;
KEY CTRL+V, "Ctrl+V" ;
PICTRES _med_paste ;
MESSAGE "Pastes the contents of the Clipboard" ;
SKIP FOR TYPE("_SCREEN.ActiveForm.ActiveControl") <> "O" OR ;
_SCREEN.ActiveForm.ActiveControl.ReadOnly = .T. OR ;
EMPTY(_CLIPTEXT) = .T.
DEFINE BAR _med_clear OF shortcut PROMPT "Cle\<ar" ;
MESSAGE "Removes the selection and does not place " + ;
"it onto the Clipboard" ;
SKIP FOR TYPE("_SCREEN.ActiveForm.ActiveControl") <> "O" OR ;
_SCREEN.ActiveForm.ActiveControl.SelLength = 0 OR ;
_SCREEN.ActiveForm.ActiveControl.ReadOnly = .T.
DEFINE BAR 7 OF shortcut PROMPT "\-"
DEFINE BAR _med_slcta OF shortcut PROMPT "Se\<lect All" ;
KEY CTRL+A, "Ctrl+A" ;
MESSAGE "Selects all text or items in the current window" ;
SKIP FOR TYPE("_SCREEN.ActiveForm.ActiveControl") <> "O"
ACTIVATE POPUP shortcut
ENDTEXT
TRY
= EXECSCRIPT(lcString)
CATCH
ENDTRY
ENDPROC

ENDDEFINE



然后我们只要创建上面我们所定义的类,即可实现右键菜单了。可以把这些代码加入到主程序中。

PUBLIC goRightClickHandler
goRightClickHandler = CREATEOBJECT("RightClickHandler")
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作