找了一天没有找到,谢谢,
不要告诉我这都需要自己去编写

解决方案 »

  1.   

    http://www.xfbbs.com/Book/VB/VB0010/htmapi58.htm
      

  2.   

    以下代码调试通过:'模块中:Option Explicit
    Public Const CB_GETLBTEXTLEN = &H149
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Const SM_CYVSCROLL = 20
    Public Const CB_SETDROPPEDWIDTH = &H160
    Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
       
    Public Sub SetComboWidth(cboIn As ComboBox)
        
        Dim nCount As Long
        Dim nNumChars As Long
        Dim nLongestComboItem As Long
        Dim nNewDropDownWidth As Long
        Dim nOldScaleMode As Integer
        Dim nLongestComboItemIndex As Integer
        Dim oOldFont As Font
        
        For nCount = 0 To cboIn.ListCount - 1
            nNumChars = SendMessage(cboIn.hwnd, CB_GETLBTEXTLEN, nCount, CLng(0))
            If nNumChars > nLongestComboItem Then
                nLongestComboItem = nNumChars
                nLongestComboItemIndex = nCount
            End If
        Next
        
        nOldScaleMode = cboIn.Parent.ScaleMode
        Set oOldFont = cboIn.Parent.Font
        
        cboIn.Parent.ScaleMode = vbPixels
        Set cboIn.Parent.Font = cboIn.Font
        
        nNewDropDownWidth = cboIn.Parent.TextWidth(cboIn.List(nLongestComboItemIndex))
        cboIn.Parent.ScaleMode = nOldScaleMode
        Set cboIn.Parent.Font = oOldFont
        
        If cboIn.ListCount > 8 Then
            nNewDropDownWidth = nNewDropDownWidth + GetSystemMetrics(SM_CYVSCROLL) + 7
        Else
            nNewDropDownWidth = nNewDropDownWidth + 7
        End If
        SendMessage cboIn.hwnd, CB_SETDROPPEDWIDTH, nNewDropDownWidth, CLng(0)
    End Sub'窗体中:
    Private Sub Combo1_DropDown()
        Call SetComboWidth(Combo1)
    End SubPrivate Sub Form_Load()
        Combo1.AddItem "aisrujwkjwirjlkasitu"
        Combo1.AddItem "qw84isdut8iewi"
        Combo1.AddItem "e8w439ioeit9weie5po4i39"
    End Sub
      

  3.   

    另外搞个类似tooltip的label来显示全文吧
      

  4.   

    我有很多的这样的控件,如果每个都这样出tooltip那么不就太麻烦了??
      

  5.   

    一般来说tooltip的label只有一个,根据你的鼠标指向的控件决定label显示的内容以及位置
      

  6.   

    楼主试了我的代码吗?
    Private Sub Combo1_DropDown()
        Call SetComboWidth(Combo1)
    End Sub
    当下拉Combo1时,会自动调整下拉框的宽度以适应文本
      

  7.   

    楼主试了我的代码吗?
    Private Sub Combo1_DropDown()
        Call SetComboWidth(Combo1)
    End Sub
    当下拉Combo1时,会自动调整下拉框的宽度以适应文本
    ///////////////////////////////////////////////////////////////////
    我的软件已经基本完成了,但是有很多的界面,并且每个界面都有十几个COMBOBOX控件,每个去响应这样的消息的话代码量太大了,并且容易出错误.我想试试lsftest() 的方法
      

  8.   

    请问如何让tooltip的label显示COMBO下拉列表中鼠标所指的那行的内容?
      

  9.   

    //请问如何让tooltip的label显示COMBO下拉列表中鼠标所指的那行的内容?
    因为combobox没有鼠标事件,所以只有用api来搞,反正我是不会-_-!
      

  10.   

    还有一个问题就是DataCombo没有DropDown消息
      

  11.   


    1.在标准模块中声明
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Const CB_SETDROPPEDWIDTH = &H1602.在窗体中自定义函数
    Private Function SetCboWidth(ByVal cbo As ComboBox, ByVal lngWidth As Long) As Boolean
    On Error Resume Next
        
        ' cbo为要加宽的ComboBox,lngWidth为宽度
        SendMessage cbo.hwnd, CB_SETDROPPEDWIDTH, lngWidth, 0End Function3.当某cbo需要加宽时,例:
    Private Sub cboEdit_DropDown()    SetCboWidth cboEdit, 180End Sub
      

  12.   

    http://community.csdn.net/Expert/topic/5046/5046735.xml?temp=.1589472
      

  13.   

    我想试试lsftest() 的方法
    ==================一个简单的例子:'模块:
    Option ExplicitPublic Const GWL_WNDPROC = (-4)Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Const WM_CTLCOLORLISTBOX = &H134
    Public prevWndProc As Long
    Dim t As BooleanFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        
        WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
        If Msg = WM_CTLCOLORLISTBOX Then
        If t Then
        t = Not t
        Else
        Debug.Print Form1.Combo1.List(Form1.Combo1.ListIndex)
        t = Not t
        End If
       End If
    End Function
    '程序:
    Option ExplicitPrivate Sub Form_Load()
        prevWndProc = GetWindowLong(Combo1.hWnd, GWL_WNDPROC)
        SetWindowLong Combo1.hWnd, GWL_WNDPROC, AddressOf WndProc
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        SetWindowLong Combo1.hWnd, GWL_WNDPROC, prevWndProc
    End Sub
      

  14.   

    上面只是回应楼主所问“请问如何让tooltip的label显示COMBO下拉列表中鼠标所指的那行的内容?
    ”的可行性。。但实际上如果“我的软件已经基本完成了,但是有很多的界面,并且每个界面都有十几个COMBOBOX控件,每个去响应这样的消息的话代码量太大了,并且容易出错误.
    ”,则此法不太合适。
      

  15.   

    我现在的方法是把所有的DataCombo重新去排一下位置(不过这个工作就不是我来完成了,我找我们这儿的任务不是很多的人去排一下,把显示的东西很多的DataCombo显示的位置拉大一些,把显示的东西少的就摆的拥挤一些,反正我用了版本库进行备份,就算弄出问题我只需要检出正确的分支就可以了.)
    不过不是谢谢大家的讨论特别是happy_sea(开心海) 和lsffest,
    我想让帖子再多放几天再给你俩结账
      

  16.   

    其实我想应该有更好的方法。。如果所有combo或datacombo的所有内容都是预先知道的,那么可以先把这所有内容都做成应该资源文件放着,然后用combo数组或datacombo数组,用户选择时估计当前控件的索引号和我上面代码里用的方法得到现在用户鼠标正指向那个选项,马上从资源文件中查找相应内容显示但用datacombo的,一般都是无法预先知道内容,那就只好等datacombo里都有数据了,然后把所有combo,datacombo的内容都搞到一个字符串去,其他的事跟上面差不多不过这方法要看具体情况。。