当前位置:编程学习 > VB >>

急呀,请问我用CreateWindowEx创建的SysIPAddress32控件,怎么添加KeyPress事件呀?

自定义控件的代码都在这儿了,我怎么暴露一个KeyPress事件给用户使用呢?

Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal X As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetStockObject Lib "gdi32.dll" (ByVal nIndex As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Const DEFAULT_GUI_FONT As Long = 17
'窗口样式常数
Private Const WM_USER As Long = &H400
Private Const WS_CHILD As Long = &H40000000
Private Const WS_VISIBLE As Long = &H10000000
Private Const WS_BORDER As Long = &H800000
Private Const WS_TABSTOP As Long = &H10000
Private Const WS_EX_CLIENTEDGE As Long = &H200&

Private Const WM_SETFONT As Long = &H30
' 常数
Private Const IPM_SETADDRESS As Long = (WM_USER + 101)
Private Const IPM_GETADDRESS As Long = (WM_USER + 102)
' 样式
Private Const IP_BOX_STYLE = WS_CHILD Or WS_VISIBLE Or WS_BORDER Or WS_TABSTOP

Private IpBoxHwnd As Long
Private m_ipAdder As String

Function CountIF(lzExpr As String, nChar As String)
    Dim X As Integer, iCount As Integer
    Dim sByte() As Byte
    sByte = lzExpr
    For X = LBound(sByte) To UBound(sByte)
        If sByte(X) = Asc(nChar) Then iCount = iCount + 1
    Next
    X = 0: Erase sByte
    CountIF = iCount
    iCount = 0
End Function

Private Function GetAddress() As String
    Dim IpPtr As Long
    Dim mIPAddr(3) As Byte
    
    m_ipAdder = ""
    SendMessage IpBoxHwnd, IPM_GETADDRESS, 0, ByVal VarPtr(IpPtr) '获取指针
    CopyMemory mIPAddr(0), IpPtr, Len(IpPtr) ' 复制指针
    GetAddress = mIPAddr(3) & "." & mIPAddr(2) & "." & mIPAddr(1) & "." & mIPAddr(0)
End Function

Sub CreateTextBox()
    Dim X As Long, y As Long
    Dim hFont As Long

    xWidth = UserControl.ScaleWidth
    yHeight = UserControl.ScaleHeight
    
    IpBoxHwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "SysIPAddress32", "" _
    , IP_BOX_STYLE, 0, 0, xWidth, yHeight, UserControl.hwnd, 0, App.hInstance, ByVal 0&)
    If IpBoxHwnd = 0 Then
        Exit Sub
    Else
        hFont = GetStockObject(DEFAULT_GUI_FONT) ' 获取默认字体
        SendMessage IpBoxHwnd, WM_SETFONT, hFont, 1 '设置默认字体
    End If
End Sub

Private Sub UserControl_Initialize()
    Call CreateTextBox
    Address = "0.0.0.0" '默认
End Sub

Private Sub UserControl_Resize()
    If IpBoxHwnd <> 0 Then
        MoveWindow IpBoxHwnd, 0, 0, UserControl.ScaleWidth, UserControl.ScaleHeight, True
    End If
End Sub

Public Property Get Address() As String
    Address = GetAddress '返回IP地址
End Property

Public Property Let Address(ByVal NewIP As String)
    Dim mByte(3) As Byte, vIp As Variant
    Dim IpPrt As Long

    If CountIF(NewIP, ".") < 3 Then
        Err.Raise 102, , "Ip 地址格式错误" & vbCrLf _
        & "正确的格式应该为: 255.255.255.255"
        Exit Property
    Else
        vIp = Split(NewIP, ".") ' IP地址分隔符
        mByte(0) = vIp(3)
        mByte(1) = vIp(2)
        mByte(2) = vIp(1)
        mByte(3) = vIp(0)
        '删除临时
        Erase vIp
        CopyMemory IpPrt, mByte(0), 4
        SendMessage IpBoxHwnd, IPM_SETADDRESS, 0, ByVal IpPrt
    End If
    
End Property
--------------------编程问答-------------------- 大家帮帮忙呀,怎么没人回答我呀。。。
补充:VB ,  控件
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,