|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
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") |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|