【发布时间】:2018-02-10 14:36:41
【问题描述】:
我想用 WinAPI 在 VBA 中创建一个 ListBox。我设法创建它,但 ListBox 不响应操作 - 没有滚动,没有选择。这些都不起作用。它看起来像它被禁用了。如何让它响应动作?
以下代码用于创建和填充ListBox。
WinAPI 函数
Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Declare Function CreateWindow Lib "user32.dll" Alias "CreateWindowExA" ( _
ByVal dwExStyle As WindowStylesEx, _
ByVal lpClassName As String, _
ByVal lpWindowName As String, _
ByVal dwStyle As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hWndParent As Long, _
ByVal hMenu As Long, _
ByVal hInstance As Long, _
ByVal lpParam As Long) As Long
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Any) As Long
创建列表框:
Private hlist As Long
hlist = WinAPI.CreateWindow( _
dwExStyle:=WS_EX_CLIENTEDGE, _
lpClassName:="LISTBOX", _
lpWindowName:="MYLISTBOX", _
dwStyle:=WS_CHILD Or WS_VISIBLE Or WS_VSCROLL Or WS_SIZEBOX Or LBS_NOTIFY Or LBS_HASSTRINGS, _
x:=10, _
y:=10, _
nWidth:=100, _
nHeight:=100, _
hWndParent:=WinAPI.FindWindow("ThunderDFrame", Me.Caption), _
hMenu:=0, _
hInstance:=Application.hInstance, _
lpParam:=0 _
)
填充列表框:
Dim x As Integer
For x = 10 To 1 Step -1
Call WinAPI.SendMessage(hlist, LB_INSERTSTRING, 0, CStr(x))
Next
结果:
【问题讨论】:
-
您希望在这里使用通用控件和低级 API 而不是使用 MSForms 的列表框来实现什么?
-
@T.M.它是
CreateWindowsEx- 看看Alias:) 虽然vbNullString有效,但列表框仍处于禁用状态。 -
只是一个想法:看看mrexcel.com/forum/excel-questions/… 它使用
WindowFromPoint来获得正确的句柄,因为显然“类名与 的相同客户区和上面列出的所有控件(框架、列表框、多页)”。 -
@T.M.没用... :(
-
这个新的列表框窗口是否在您的进程中作为父级?在我看来不像。