改變ComboBox中ListBox的寬度
作者: cww 我們知道ComboBox是由一個EditBox(TextBox)和ListBox所組成,當(dāng)我們按ComBox右方的 向下鍵,便能出現(xiàn)ListBox,內(nèi)有許多的選項給我們選,而該ListBox的寬度,是和ComboBox 的度相同,而這個程式使之可以放寬,以容更多的字。 原本這看來似乎也沒麼什麼困難,只要取得該ListBox的hWnd便可以使用MoveWindow來更 動大小,可是問題就是在ListBox中hwnd的取得。我有一篇文章提到取得ComboBox 中Edit Box的hwnd,(詳見如何攔截ComboBox的mouse右鍵),使用的是EnumChildWindows來做, 但是,取得ListBox的方式則不然,因?yàn)檫@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 注釋:以下程式會設(shè)定ListBox的大小,再將之送往原來的Window Procedure If Msg = WM_CTLCOLORLISTBOX Then 注釋:請?zhí)幚鞰ouse Move的動作 If Not EverChange Then Dim rect5 As RECT hwndList = lParam 注釋:當(dāng)收到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 注釋:設(shè)定ComboBox中ListBox的寬度加50 Pixel 注釋:記錄原本的Window Procedure的位址 preWinProc = GetWindowLong(Combo1.hwnd, GWL_WNDPROC) 注釋:設(shè)定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 |
|