日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

改變ComboBox中ListBox的寬度...

 a_cheng 2009-10-22
改變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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約