设计控制项时遇到的问题
第一个问题: 最近在写控制项时常遇到个问题,就是用API去抓取滑鼠状态后,要如何才能在模组中使用控制项中设定的属性或方法,
因为不太清楚这部分我是参考网路上能找的到的资料,再依自己的需求修改,例如我要写个控制项的鼠标滚轮事件~
OCX:
Private Sub UserControl_GotFocus()
Dim ltemp As Long
Oldwinproc = GetWindowLong(UserControl.hwnd, GWL_WNDPROC)
ltemp = GetLong(UserControl.hwnd)
End Sub
Module:
Public Function GetLong(hwnd As Variant) As Long
SetWindowLong hwnd, GWL_WNDPROC, AddressOf FlexScroll
End Function
Private Function FlexScroll(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'支持滚轮的滚动
Select Case wMsg
Case WM_MOUSEWHEEL
Select Case wParam
Case -7864320 '向下滚
SendKeys "{PGDN}"
Case 7864320 '向上滚
SendKeys "{PGUP}"
End Select
End Select
FlexScroll = CallWindowProc(Oldwinproc, hwnd, wMsg, wParam, lParam)
End Function
可是当wParam的值有变化时~要怎么通知OCX触发后续动作?
目前能想到的方法是控制项介面多加一个隐藏的TextBox,然后在GetLong后面多加一个传物件的参数,把OCX的TextBox传过去,
再模组下宣告一个全域的物件变数把它接下来,然后在CASE下把wParam写过去,之后到OCX下新增一个TextBox的Change事件,
当TextBox的Text属性被更改时触发,这样才能做出来,想问有经验的人正常要怎么做这段?
Private Sub DataIn_Change()
If CLng(Val(DataIn.Text)) <> 0 Then Call UserControl_MouseWheel(CLng(Val(DataIn.Text)))
If CLng(Val(DataIn.Text)) <> 0 Then DataIn.Text = 0
End Sub
Public Sub UserControl_MouseWheel(Cancel As Long)
RaiseEvent MouseWheel(Cancel)
End Sub
试过这样是可以在Form中正常使用~
第二个问题:
要写自订的属性页时,更改后的值要怎么传回去给控制项?
标准属性页是都会写Changed = True,但是这个东西怎去跟控制项的属性做关联?