| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vb >> 窗体 >> 文章正文
改变ComboBox中ListBox的宽度            【字体:
改变ComboBox中ListBox的宽度
作者:-    文章来源:-    点击数:    更新时间:2006-6-8

我们知道ComboBox是由一个EditBox(TextBox)和ListBox所组成,当我们按ComBox右方的
向下键,便能出现ListBox,内有许多的选项给我们选,而该ListBox的宽度,是和ComboBox
的度相同,而这个程式使之可以放宽,以容更多的字。

原本这看来似乎也没麽什麽困难,只要取得该ListBox的hWnd便可以使用MoveWindow来更
动大小,可是问题就是在ListBox中hwnd的取得。我有一篇文章提到取得ComboBox 中Edit
Box的hwnd,(详见如何拦截ComboBox的mouse右键),使用的是EnumChildWindows来做,
但是,取得ListBox的方式则不然,因为这ListBox是属於DeskTopWindow的,所以无法由
EnumChildWindows找子Window来做,而只好由ComboBox收到WM_CTLCOLORLISTBOX的讯息
时,lParam便是该ListBox的hWnd上面着手,因而有以下的作法。
'以下在.bas
Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
  (ByVal hwnd As Long, ByVal nIndex As Long) As Long
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 GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
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

Public Const WM_CTLCOLORLISTBOX = &H134
Public Const GWL_WNDPROC = (-4)


 Public preWinProc As Long
 Private hwndList As Long
 Private EverChange As Boolean
 Public AddOnWidth As Long
 Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
                         ByVal wParam As Long, ByVal lParam As Long) As Long
 '以下程式会设定ListBox的大小,再将之送往原来的Window Procedure
 If Msg = WM_CTLCOLORLISTBOX Then
    '请处理Mouse Move的动作
    If Not EverChange Then
       Dim rect5 As RECT
       hwndList = lParam '当收到WM_CTLCOLORLISTBOX时,lParam是ListBox的hwmd
       EverChange = True
       Call GetWindowRect(hwndList, rect5)
       x = rect5.Left
       y = rect5.Top
       dx = rect5.Right - rect5.Left + AddonWidth
       dy = rect5.Bottom - rect5.Top
       Call MoveWindow(hwndList, x, y, dx, dy, 1)
    End If
 End If
 '将之送往原来的Window Procedure
 wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
 End Function

 '以下程式在Form1, form1中有一Combo1
 Sub Form_Load()
 Dim ret As Long
 AddonWidth = 50 '设定ComboBox中ListBox的宽度加50 Pixel
 '记录原本的Window Procedure的位址
 preWinProc = GetWindowLong(Combo1.hwnd, GWL_WNDPROC)
 '设定Combo1的window Procedure到wndproc
 ret = SetWindowLong(Combo1.hwnd, GWL_WNDPROC, AddressOf wndproc)
 End Sub

 Private Sub Form_Unload(Cancel As Integer)
 Dim ret As Long
 '取消Message的截取,而使之又只送往原来的Window Procedure
 ret = SetWindowLong(Combo1.hwnd, GWL_WNDPROC, preWinProc)
 End Sub
 

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 用VB编写DirectX7.0游戏(下…

  • 用VB编写DirectX7.0游戏(上…

  • 使用OLE DB和ADO调用返回记录…

  • 使用VB调用Oracle程序包内的…

  • VB中用ADO对象动态创建数据库…

  • fffff

  • 如何用MSComm Control传Bina…

  • MultiLink的WinSock Server程…

  • 用VB制作浏览器

  • 用VB编写网络寻呼机

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |