在一個UserControl上有這樣的設置:當鼠標移到某個Control(Ctl)上時使該Ctl獲得Focus.
1. 問題: 把該UserControl加到一個Form上面,怎樣使當這個Form不是當前活動窗口時,不發生上述事件.(因為這樣的話,這個Form就變成了活動窗口,而原先另外一個窗口就看不見了)
我的思路是利用API返回當前Form的Name(或其它),然後再根據這個Name判斷要不要發生上述事件.請問是這樣的嗎?如果是的話,該用哪個API呢?
2. 還是同一個UserControl,其所有者(一個Form)的Form_KeyPress事件是這樣的:當按回車鍵時,Focus跳到Form上的下一個Control.但是我想當Focus在UserControl上時觸發UserControl的KeyPress,而不發生Form_KeyPress事件,就是說不用將Focus轉到下個Control.如果有哪位高手能幫得上我的話,小弟不用感激,必將銘記在心!(當然分是少不了的啦~)
在線等待中.............
1. 問題: 把該UserControl加到一個Form上面,怎樣使當這個Form不是當前活動窗口時,不發生上述事件.(因為這樣的話,這個Form就變成了活動窗口,而原先另外一個窗口就看不見了)
我的思路是利用API返回當前Form的Name(或其它),然後再根據這個Name判斷要不要發生上述事件.請問是這樣的嗎?如果是的話,該用哪個API呢?
2. 還是同一個UserControl,其所有者(一個Form)的Form_KeyPress事件是這樣的:當按回車鍵時,Focus跳到Form上的下一個Control.但是我想當Focus在UserControl上時觸發UserControl的KeyPress,而不發生Form_KeyPress事件,就是說不用將Focus轉到下個Control.如果有哪位高手能幫得上我的話,小弟不用感激,必將銘記在心!(當然分是少不了的啦~)
在線等待中.............
問個簡單點的吧?怎樣判斷usercontrol的所有者(Form)是不是當前的活動窗口????解決即結貼!!!謝謝
函数原型如下:
====================
WindowFromPoint
The WindowFromPoint function retrieves a handle to the window that contains the specified point.
HWND WindowFromPoint(
POINT Point // point
);WindowFromPoint 返回鼠标所指窗口的句柄,
Point参数是一个结构体,有X,Y两点,声明如下:
Public Type PointAPI
X As Long
Y As Long
End Type======================
GetWindowInfo
The GetWindowInfo function retrieves information about the specified window.BOOL GetWindowInfo(
HWND hwnd, // handle to window
PWINDOWINFO pwi // window information
);If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
--------------------
参数hwnd就用前面由 WindowFromPoint(Point) 返回的句柄
pwi 是 一个WindowInfo 结构体,定义如下:typedef struct tagWINDOWINFO {
DWORD cbSize;
RECT rcWindow;
RECT rcClient;
DWORD dwStyle;
DWORD dwExStyle;
//--------------------
DWORD dwWindowStatus;
//--------------------
UINT cxWindowBorders;
UINT cyWindowBorders;
ATOM atomWindowType;
WORD wCreatorVersion;
} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;上面的结构体中 dwWindowStatus 参数就是我们要用到的值
dwWindowStatus
The window status. If this member is WS_ACTIVECAPTION, the window is active. Otherwise, this member is zero.
如果 dwWindowStatus 的值是 0 的话,那么这个窗口就不活动的,也就不是我们所要的 :)
======================
我时间紧,就说这些了,剩下的我想楼主也该知道怎么做了。
求求你,给点分吧!
DWORD cbSize;
RECT rcWindow;
RECT rcClient;
DWORD dwStyle;
DWORD dwExStyle;
//--------------------
DWORD dwWindowStatus;
//--------------------
UINT cxWindowBorders;
UINT cyWindowBorders;
ATOM atomWindowType;
WORD wCreatorVersion;
} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;不好意思,這段東東我是什麼呀,怎麼用的???
謝謝你啦,這麼簡單的方法我怎麼就沒想到呢??(呵呵,你放心,少不了你的分)
第一個問題已經解決了,不過你先別急,我的第二個問題還沒解決啊.再等一會吧,看有沒有哪位好 心的大蝦能幫幫我,搞定它!!!!!!!!To: fleshboy(百菜)
謝謝!!能再幫我看看第二題嗎?
焦点不会自动在控件间转换,要么按Tab键,要么编程实现,要么设置快速访问键,要么使用鼠标。
而且只要你不设置Form.KeyPreview = True,窗体不会截获控件的击键事件。
用 Screen.ActiveForm is yourForm 判断。
求求你,给点分吧!錯啦錯啦,Screen.ActiveForm 只能判斷同這個程序裡的Form,
但如果我在運行這個程序時,又打開另外一個程序或別的什麼東西,只要鼠標移到usercontrol的
control上,它還是會得到焦點的.(而另外的那個程序就隱藏到它的下面了)
我把代碼貼出來:
這是Form上的代碼:
Private Sub Form_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyEscape
SendKeys "%{C}"
Case vbKeyReturn
SendKeys "{TAB}"
KeyAscii = 0
End Select
End Sub這是UserControl上的代碼:
Private Sub cboColor_KeyPress(KeyAscii As Integer)
Dim l_intPos As Integer
Dim l_strTmp As String
'轉換成大寫
If KeyAscii >= Asc("a") And KeyAscii <= Asc("z") Then KeyAscii = KeyAscii + Asc("A") - Asc("a")
l_strTmp = Trim(cboColor.Text)
'按回車鍵則添加記錄(空記錄或重復記錄除外)
If KeyAscii = vbKeyReturn And l_strTmp <> "" Then
For l_intPos = 0 To cboColor.ListCount - 1
If StrComp(l_strTmp,cboColor.List(l_intPos),vbTextCompare) = 0 Then
cboColor.Text = ""
Exit Sub
End If
Next
cboColor.AddItem l_strTmp, 0
cboColor.Text = ""
End If
End Sub現在的問題的是:在usercontrol上的cbocolor上按回車鍵時,運行的是Form_KeyPress而非
cboColor_KeyPress事件.請問這樣的沖突該怎樣解決呀???能不能使得在cbocolor上按回車鍵時就AddItem,而在其它地方按回車鍵時就Sendkeys "{tab}"呢????????
請問如何綁定?