我用文本框,按钮,ListView模拟Combo,用以实现对数据库操作时,可以实现多列的下拉列表,供用户选择,现在的问题是,要想很好的模拟Combo,就要实现Mouse在ListView上移动时,能不能实现不让TextBox失去焦点?
如果用MSHflexgrid替换ListView,能不能实现当MouseMove时,让表格的当前行选中?现在难点在于,MouseMove时有X,Y,但是我如何知道对应的MSHFlexgrid的行是哪行呢?

解决方案 »

  1.   

    MSHFlexgrid中的MouseCol属性跟MouseRow就是获得当前鼠标的行和列
      

  2.   

    可以在textbox_change事件中实现,而不是lostfocus.自定义控件。
      

  3.   

    焦点问题,实际上在 listView 处理结束之后,让 TextBox 重新获得焦点就可以了。1 在 TextBox 获得焦点后,使 ListView 的 CauseValidation 属性 = True,其他控件的该属性均 = False。2 在 TextBox 的 Validate 事件中,设置一个标志 blnFlag = True。以标志焦点没有离开你的组合控件。3 如果必要,在 TextBox 的 LostFocus 事件中,恢复其他控件的 CauseValidation 属性。4 在鼠标离开 ListView 的所有事件中,如果  blnFlag = True,Text1.setFocus给你一个 ListBox 自动鼠标选中的例子。参考一下吧。
    Option Explicit
    Private Const LB_SETCURSEL = &H186
    Private Const LB_GETCURSEL = &H188
    Private Type POINTAPI
        X As Long
        Y As Long
    End TypePrivate Declare Function ClientToScreen Lib "user32" _
    (ByVal hwnd As Long, lpPoint As POINTAPI) As LongPrivate Declare Function LBItemFromPt Lib "COMCTL32.DLL" _
    (ByVal hLB As Long, ByVal ptX As Long, ByVal ptY As Long, _
    ByVal bAutoScroll As Long) As LongPrivate Declare Function SendMessage Lib "user32" Alias _
    "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, lParam As Long) As LongPublic Sub HighlightLBItem(ByVal LBHwnd As Long, _
    ByVal X As Single, ByVal Y As Single)Dim ItemIndex As Long
    Dim AtThisPoint As POINTAPI
    AtThisPoint.X = X \ Screen.TwipsPerPixelX
    AtThisPoint.Y = Y \ Screen.TwipsPerPixelY
    Call ClientToScreen(LBHwnd, AtThisPoint)
    ItemIndex = LBItemFromPt(LBHwnd, AtThisPoint.X, _
       AtThisPoint.Y, False)
    If ItemIndex <> SendMessage(LBHwnd, LB_GETCURSEL, 0, 0) Then
        Call SendMessage(LBHwnd, LB_SETCURSEL, ItemIndex, 0)
    End IfEnd Sub
      

  4.   

    问一下,我写的是自定义控件,我想让用户可以拖拉下拉列表(MSHFlexgrid或者ListView)的右下角(像拉窗体右下角一样),可以放大/缩小表格.大家有什么好办法?