回复 17# 网络小僧
只有afan那个方法了,重新看了看combo的结构,没别的方法,如果创建combo必然带着下拉按键 好方法,谢谢共享 lz这个不应该用combo做,用listbox做,显示的时候只显示一行数据(单位高度),点击按钮,显示全部listbox(全高) 本帖最后由 netegg 于 2011-12-19 05:55 编辑
#AutoIt3Wrapper_au3check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <GUIListBox.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <EditConstants.au3>
#include <winapi.au3>
Opt('MustDeclareVars', 1)
$Debug_LB = False ; 检查传递给函数的类名, 设置为真并使用另一控件的句柄观察其工作
Global $hListBox, $edit, $msg
_Main()
Func _Main()
Local $hGUI, $button, $iflag = True
; 创建界面
$hGUI = GUICreate("(UDF Created) List Box Create", 400, 400)
$hListBox = _GUICtrlListBox_Create($hGUI, "String upon creation", 2, 2, 396, 30, $LBS_NOREDRAW)
$button = GUICtrlCreateButton("", 2, 100, 50, 20)
GUISetState()
_GUICtrlListBox_BeginUpdate($hListBox)
_GUICtrlListBox_ResetContent($hListBox)
_GUICtrlListBox_InitStorage($hListBox, 100, 4096)
_GUICtrlListBox_Dir($hListBox, @WindowsDir & "\win*.exe")
_GUICtrlListBox_AddFile($hListBox, @WindowsDir & "\Notepad.exe")
_GUICtrlListBox_Dir($hListBox, "", $DDL_DRIVES)
_GUICtrlListBox_Dir($hListBox, "", $DDL_DRIVES, False)
_GUICtrlListBox_EndUpdate($hListBox)
While 1
If GUIGetMsg() = $button Then
If $iflag Then
_WinAPI_MoveWindow($hListBox, 2, 2, 396, 60) ;60是弹出框的高度,自定
$iflag = Not $iflag
Else
_GUICtrlListBox_SetTopIndex($hListBox, _GUICtrlListBox_GetCurSel($hListBox))
_WinAPI_MoveWindow($hListBox, 2, 2, 396, 24)
;24是默认一个项目的高度,最好别改,或者在前面用getitemheight获取下
;确保收回的时候显示且仅显示一行完整数据
;另外,movewindow中的四个坐标可用getwindowsplacement获取
$iflag = Not $iflag
EndIf
EndIf
If GUIGetMsg() = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
GUIDelete()
EndFunc ;==>_Main
这段代码仅供参考
对了,有个问题没想出来,下方列表框如何显示滑动条似乎不太容易,再想想吧
还有,用edit+list也能实现,就是麻烦的多 进来学习一下了,谢谢 回复网络小僧
只有afan那个方法了,重新看了看combo的结构,没别的方法,如果创建combo必然带着下拉按键
netegg 发表于 2011-12-2 16:45 http://www.autoitx.com/images/common/back.gif
守夜到现在了,斗了一晚上地主,现在太兴奋了,一点睡意都没有,现在上来看看论坛有没有有点意思的问题,结果看到了这个问题还不错,远比那些‘看起来’就象干坏事的(如:如何欺骗;读取别的程序内存……)好点。
楼主既然要这种效果,可以连那个Button都不需要,直接点鼠标,就出来象Combo那样的下拉菜单,看看下面的代码效果,是不是合乎楼主的“完美解决”
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiConstants.au3>
#include <EditConstants.au3>
#include <Constants.au3>
#include <WinAPI.au3>
Global $hGui, $hProcA, $hProcB, $cInput, $cMenu, $aItem, $cRevItem
VoidMain()
Func VoidMain()
Local $cDummy
Opt("GUIOnEventMode", 1)
$hGui = GUICreate("PseuCombo Test", 400, 300)
GUISetOnEvent($GUI_EVENT_CLOSE, "SysEvent")
$cInput = GUICtrlCreateInput("Hit me strongly", 100, 100, 200, 20, $ES_CENTER + $ES_READONLY)
$cDummy = GUICtrlCreateDummy()
$cMenu = GUICtrlCreateContextMenu($cDummy)
For $i = 0 To UBound($aItem) - 1
$aItem[$i] = GUICtrlCreateMenuItem("Value" & $i + 1, $cMenu)
Next
$hProcA = DllCallbackRegister("WindowProc", "ptr", "hwnd;uint;long;ptr")
$hProcB = _WinAPI_SetWindowLong(GUICtrlGetHandle($cInput), $GWL_WNDPROC, DllCallbackGetPtr($hProcA))
GUISetState(@SW_SHOW, $hGui)
While True
Sleep(10)
WEnd
EndFunc
Func ShowContextMenu($hWnd, $cCtrlID)
Local $WinPos, $hMenu, $Return
$WinPos = WinGetPos($hGui)
$hMenu = GUICtrlGetHandle($cCtrlID)
$Return = DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0x0100, "int", $WinPos + 200, "int", $WinPos + 140, "hwnd", $hWnd, "ptr", 0)
Return $Return
EndFunc
Func SysEvent()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
GUIDelete($hGui)
Exit
EndSwitch
EndFunc
Func WindowProc($hWnd, $iMsg, $wParam, $lParam)
Switch $iMsg
Case $WM_RBUTTONDOWN, $WM_CONTEXTMENU
If $hWnd = GUICtrlGetHandle($cInput) Then
$cRevItem = ShowContextMenu($hGui, $cMenu)
For $i = 0 To UBound($aItem) - 1
If $cRevItem = $aItem[$i] Then
GUICtrlSetData($cInput, "Value" & $i + 1)
ExitLoop
EndIf
Next
Return 0
EndIf
Case $WM_LBUTTONDOWN
If $hWnd = GUICtrlGetHandle($cInput) Then
$cRevItem = ShowContextMenu($hGui, $cMenu)
For $i = 0 To UBound($aItem) - 1
If $cRevItem = $aItem[$i] Then
GUICtrlSetData($cInput, "Value" & $i + 1)
ExitLoop
EndIf
Next
EndIf
EndSwitch
Return _WinAPI_CallWindowProc($hProcB, $hWnd, $iMsg, $wParam, $lParam)
EndFunc
直接找个控件覆盖看不到三角不就行了 回复 25# augual
你想象了,效果不会很好的,会漏陷的 回复 24# happytc
这个方法不错。但点击窗体的关闭按钮时也会触发$WM_LBUTTONDOWN,也会显示菜单的。
标题
回复 27# xiehuahere忘了这个了,呵,解决这个问题简单啊:用opt设置点击的在窗体客户区域就可以了 呵呵,这些朋友越来越可爱了!! 感谢分享,试试看
页:
1
[2]