コンボボックスをドロップダウンで開く             <TOP>


コンボボックスをドロップダウンで開く

SendMessage ウィンドウにメッセージを送信

CB_SHOWDROPDOWN コンボボックスのリストボックスの表示または非表示を切り替える

 

コンボボックスの▼をクリックして開き、該当行を選択するのは面倒です。

例では、EditBoxに文字を入力し[Enter]を押下すると、カーソルはComboBoxがドロップダウン状態で移動します。

F-Basicの場合、SendMessageの前にSetMousePointer 0(マウス砂時計解除)を入れないと目的動作ができないようです。

 


'================================================================
'= コンボボックスをドロップダウンで開く
'=    (ComboDropdown.bas)
'================================================================
#include "Windows.bi"

' ウィンドウにメッセージを送信。この関数は、指定したウィンドウのウィンドウプロシージャが処理を終了するまで制御を返さない
Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, ByVal lParam&)

#define CB_SHOWDROPDOWN &H14F           'コンボボックスのリストボックスの表示または非表示を切り替える

Var Shared Edit1 As Object
Var Shared Combo1 As Object

Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    For i = 1 To 10
        Combo1.AddString String$(20, Chr$(&H40 + i))
    Next
    Edit1.SetFocus
End Sub

'================================================================
'=
'================================================================
Declare Sub Edit1_Change edecl ()
Sub Edit1_Change()
    Var Epos As Integer
    Var Ret As Long

    ED$ = GetDlgItemText("Edit1")
    Epos = InStr(ED$, Chr$(13,10))
    If Epos <> 0 Then
        ED$ = Mid$(ED$, 1, Epos - 1) & Mid$(ED$, Epos + 2)
        Edit1.SetWindowText ED$
        Combo1.SetFocus

        'マウス砂時計解除
        SetMousePointer 0
        Ret = Api_SendMessage(Combo1.GethWnd, CB_SHOWDROPDOWN, 1, ByVal 0)
    End If
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End