| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 513 人关注过本帖
标题:设计控制项时遇到的问题
只看楼主 加入收藏
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
结帖率:97.66%
收藏
已结贴  问题点数:40 回复次数:4 
设计控制项时遇到的问题
第一个问题:
最近在写控制项时常遇到个问题,就是用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,但是这个东西怎去跟控制项的属性做关联?
搜索更多相关主题的帖子: 如何 资料 
2011-04-09 15:57
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:10 

'取高位
Private Function HIWORD(LongIn As Long) As Integer
    ' 取出32位值的高16位
    If LongIn And &H80000000 Then
        HIWORD = (LongIn And &H7FFF0000) \ &H10000 Or &H8000
    Else
        HIWORD = (LongIn And &HFFFF0000) \ &H10000
    End If
End Function

'取低位
Private Function LOWORD(LongIn As Long) As Integer
    ' 取出32位值的低16位
    If LongIn And &H8000& Then
        LOWORD = LongIn And &HFFFF& Or &H8000
    Else
        LOWORD = LongIn And &HFFFF&
    End If
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
debug.print HIWORD(wParam ),loword(wParam ) '调试下就知道了。
     Select Case wParam
     Case -7864320 '向下滚
     SendKeys "{PGDN}"
     Case 7864320 '向上滚
     SendKeys "{PGUP}"
     End Select
     End Select
     FlexScroll = CallWindowProc(Oldwinproc, hwnd, wMsg, wParam, lParam)
End Function

2011-04-09 20:16
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
回复 2楼 bczgvip
谢谢,刚试过了,这方法解了第一个问题的一小部份,但是重点是怎才能把每个wParam撷取到的值,回传到UserControl1里面,这样才能因应事件被触发后,
能继续UserControl1的后续动作。因为UserControl1可以Call模块里宣告为Public的函式,但是相反的模块无法Call到UserControl1里的东西。

简单的说我希望wParam得出的值能出现在Form中~或是UserControl中~而不是只能在模块中才有~
图片附件: 游客没有浏览图片的权限,请 登录注册


相同的这个思路问题也发生在UserControl1和属性页的设计上,就是第二个问题。在属性页获取到的新设定值,要如何回传到UserControl1中?

[ 本帖最后由 wube 于 2011-4-10 02:17 编辑 ]

不要選我當版主
2011-04-10 01:29
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:30 
类钩子.zip (4.42 KB)
2011-04-10 03:37
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
没想过用钩子做,研究研究,谢谢~

不要選我當版主
2011-04-10 07:06
快速回复:设计控制项时遇到的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012206 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved