网络小僧 发表于 2011-11-25 09:53:42

求方法去除Combo右边的三角块区域

本帖最后由 网络小僧 于 2011-11-25 10:12 编辑

想实现一个Combo的特殊效果,如下图:


如何把Combo1的右边的三角形区域这个点击的去掉,就是变成一个Input一样的输入框
(但不可输入,只能读取下拉菜单,且下来菜单可直接读取INI里的配置信息。)
同时点击Button1的时候Combo1就会下拉,需实现的PS效果图如下:




求高人解答下


帖上这个代码,方便大家实践操作,呵呵~

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$sIni=@TempDir&"\temp.ini"
$sData = "Key1=下拉A" & @LF & "Key2=下拉B" & @LF & "Key3=下拉C"
If Not FileExists(@TempDir&"\temp.ini") Then IniWriteSection($sIni, "Section", $sData)
$Form1 = GUICreate("Form1", 280, 134, 192, 124)
$combo1 = GUICtrlCreateCombo("", 24, 40, 153, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$var = IniReadSection($sIni, "section")
If @error Then
    MsgBox(4096, "", "错误, 读取INI文件失败.")
Else
    For $i = 1 To $var
GUICtrlSetData(-1, $var[$i],$var)
    Next
EndIf
$Button1 = GUICtrlCreateButton("Button1", 192, 38, 57, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
   Exit
      ;Case $Button1
;此处实现显示下拉效果,同时MSGBOX提示所选的值
EndSwitch
WEnd

水木子 发表于 2011-11-25 09:57:32

何必搞得这么麻烦呢? 直接用 $CBS_DROPDOWNLIST 样色就可以啦!

网络小僧 发表于 2011-11-25 09:58:00

这个样式 后 无法点击出现下拉啊

水木子 发表于 2011-11-25 10:05:40

回复 3# 网络小僧
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>

GUICreate('', 300, 150)
$combo1 = GUICtrlCreateCombo("", 30, 50, 150, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, "下拉A|下拉B|下拉C", "下拉A")
$Button1 = GUICtrlCreateButton("Button1", 180, 48, 80, 25)
GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case -3
                        Exit
                Case $Button1
                        _GUICtrlComboBox_ShowDropDown($combo1, True)

        EndSwitch
WEnd

网络小僧 发表于 2011-11-25 10:13:44

水木子 兄弟你没看清楚我的要求啊 呵呵 我要的是把那个三角形隐藏掉

代码我更新了直接读取INI的 你看看

xiehuahere 发表于 2011-11-25 13:01:28

我的想法:

【方法一】
上面用一个 edit 控件,点击 button 后在其下面创建一个 list 控件。鼠标选择 list 中的一个item后,删除 list 控件,并将此 item 内容写入 edit 控件。
如果要让list控件中随鼠标移动而变化item高亮并同步更新到edit控件,可能需要捕获WM_MOUSEMOVE消息并判断鼠标位置,稍微复杂点。

【方法二】
画个白色矩形区域覆盖三角块区域,并做到始终在最上层显示。

wsfda 发表于 2011-11-25 13:02:08

没有3角你打算怎么谈出下拉呢

xiehuahere 发表于 2011-11-25 13:30:20

本帖最后由 xiehuahere 于 2011-11-25 21:28 编辑

回复 1# 网络小僧


    可能丑陋一点,仅供参考:#Include <GuiEdit.au3>
#Include <GuiListBox.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
$sIni=@TempDir&"\temp.ini"
$sData = "Key1=下拉A" & @LF & "Key2=下拉B" & @LF & "Key3=下拉C"
If Not FileExists(@TempDir&"\temp.ini") Then IniWriteSection($sIni, "Section", $sData)
$Form1 = GUICreate("Form1", 280, 134, 192, 124)
$Edit1 = GUICtrlCreateEdit("", 24, 40, 153, 25, $ES_READONLY)
GUICtrlSetBkColor(-1, 0xffffff)
$var = IniReadSection($sIni, "section")
If @error Then MsgBox(4096, "", "错误, 读取INI文件失败.")
GUICtrlSetData(-1, $var)
$Button1 = GUICtrlCreateButton("Button1", 192, 38, 57, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

$list = -1
$isSelected = 0
$index = -1

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                        GUICtrlSetState($Button1, $GUI_DISABLE)
                        If $var <> 0 Then
                                $list = GUICtrlCreateList("", 24, 65, 153, 18*$var, -1, $WS_EX_STATICEDGE)
                                GUICtrlSetBkColor(-1, 0xffffff)
                                $data = ""
                                For $i = 1 To $var
                                                $data &= $var[$i] & '|'
                                Next
                                If $index = -1 Then
                                                GUICtrlSetData(-1, $data, $var)
                                Else
                                                GUICtrlSetData(-1, $data, $var[$index+1])
                                EndIf
                        EndIf
                Case $GUI_EVENT_PRIMARYDOWN
                        If $list <> -1 Then
                                $Pos = GUIGetCursorInfo($Form1)
                                If $Pos = $list Then
                                        $isSelected = 1
                                        $index = _GUICtrlListBox_GetCurSel($list)
                                        GUICtrlSetData($Edit1, _GUICtrlListBox_GetText(GUICtrlGetHandle($list), $index))
                                EndIf
                        EndIf
                Case $GUI_EVENT_PRIMARYUP
                        If $list <> -1 And $isSelected Then
                                $index = _GUICtrlListBox_GetCurSel($list)
                                GUICtrlSetData($Edit1, _GUICtrlListBox_GetText(GUICtrlGetHandle($list), $index))
                                GUICtrlDelete($list)
                                $list = -1
                                $isSelected = 0
                                GUICtrlSetState($Button1, $GUI_ENABLE)
                        EndIf
        EndSwitch
WEnd【方法二】
我暂时还不会。

amxi 发表于 2011-11-25 15:16:10


GUICtrlCreateCombo("text ",5,5,80,30,$WS_TABSTOP)
GUICtrlSetData(-1, "item2|item3")


去除了右边三角图,但是也去除了下拉表,但不影响数据使用,按方向键显示

xms77 发表于 2011-11-25 16:35:09

回复 8# xiehuahere
样子有点丑,呵呵!

xiehuahere 发表于 2011-11-25 16:49:47

回复 10# xms77


    显示风格可以自己设置的嘛。
   来,listbox 控件加个细黑框。$list = GUICtrlCreateList("", 24, 65, 153, 16*$var, -1, $WS_EX_STATICEDGE)

网络小僧 发表于 2011-11-25 17:03:44

有什么方法可以把那个三角形挡住呢 比如用张图片

网络小僧 发表于 2011-11-25 17:04:23

挡住最好 直接用个图片 求方法 我直接放个图片上去 一会地步的COMBO又上来了 挡不住啊

afan 发表于 2011-11-25 19:13:57

这个想法还真另类……
创建个Input框,弹出个List窗口~

xiehuahere 发表于 2011-11-25 21:29:53

回复 13# 网络小僧


    这种方法我也试过,确实这样。
   同样求解,帮你顶!
页: [1] 2
查看完整版本: 求方法去除Combo右边的三角块区域