教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> 编程基地 >> VB >> 改变ComboBox中ListBox的宽度 RSS订阅
改变ComboBox中ListBox的宽度
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   
改变ComboBox中ListBox的宽度


作者: cww 

  我们知道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


来源:upschool.cn
作者:
关键字:宽度
发表日期:2006-12-20 20:06:34

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:让一组相同的控制项有相同的行为(SuperClass)   下一篇:设定CapsLock ScrollLock NumLock


2009-1-10 9:27:06
本文的相类似文章
  • 在ListBox适当设定水平滚动条的宽度
  • 在运行时维护DBGRID的栏位宽度
  • 调整 Combo 下拉部分的宽度
  • 去除DW MX 2004表格宽度辅助
  • 通过Adodb.Stream取得图像(BMP JPG PNG GIF SWF)的高度和宽度
  • 多种Web浏览器零宽度GIF图象导致内存破坏漏洞
  • 如何获取图片的宽度属性
  • 一个获取图片宽度和高度的类
  • 调整 Combo 下拉部分的宽度
  • WPS中调整页面宽度以适合窗口的方法
  • 在学习中进步 在进步中成长 教程中国相随您的成长之路
    华腾联合科技股份有限公司版权所有
    广告联系:Rosibo@163.com