コンボボックスの項目表示数を指定             <TOP>


コンボボックスのリスト項目表示数を指定します。

SendMessage ウィンドウにメッセージを送信
MoveWindow 指定されたウィンドウの位置およびサイズを変更

GetWindowRect ウィンドウの座標をスクリーン座標系で取得
ScreenToClient
マウスカーソルの現在の位置に相当するスクリーン座標を取得し、クライアント座標に変換
CB_SHOWDROPDOWN(&H14F) コンボボックスのリスト部、表示・非表示切替
CB_GETITEMHEIGHT(&H154) コンボボックス内の項目の高さを取得
 

 

'================================================================
'= コンボボックスの項目表示数を指定
'=    MoveWindow3.bas
'================================================================
#include "Windows.bi"

#define CB_GETITEMHEIGHT &H154          'コンボボックス内の項目の高さを取得する
#define CB_SHOWDROPDOWN &H14F           'コンボボックスのリストボックスの表示または非表示を切り替える

Type POINTAPI
   x As Long
   y As Long
End Type

Type RECT
    Left   As Long
    Top    As Long
    Right  As Long
    Bottom As Long
End Type

' ウィンドウにメッセージを送信
Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any)

' 指定されたウィンドウの位置およびサイズを変更
Declare Function Api_MoveWindow& Lib "user32" Alias "MoveWindow" (ByVal hWnd&, ByVal X&, ByVal Y&, ByVal nWidth&, ByVal nHeight&, ByVal bRepaint&)

' ウィンドウの座標をスクリーン座標系で取得
Declare Function Api_GetWindowRect& Lib "user32" Alias "GetWindowRect" (ByVal hWnd&, lpRect As RECT)

' マウスカーソルの現在の位置に相当するスクリーン座標を取得し、クライアント座標に変換
Declare Function Api_ScreenToClient& Lib "user32" Alias "ScreenToClient" (ByVal hWnd&, lpPoint As POINTAPI)

Var Shared Combo1 As Object
Var Shared Text1 As Object
Var Shared Edit1 As Object
Var Shared Button1 As Object

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

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    For i = 1 To 20
        Combo1.AddString "Item-" & Trim$(Str$(i))
    Next
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var pt As POINTAPI
    Var rc As RECT
    Var cWidth As Long
    Var newHeight As Long
    Var oldMapMode As Long
    Var numItemsToDisplay As Long
    Var itemHeight As Long

    numItemsToDisplay = Val(Edit1.GetWindowText)
    If numItemsToDisplay > 20 Then Edit1.SetWindowText "" : Exit Sub

    Text1.SetWindowText "Items displayed = " & Trim$(Str$(numItemsToDisplay))

    oldMapMode = GetMapMode
    SetMapMode 1
   
    cWidth = Combo1.GetWidth
  
    itemHeight = Api_SendMessage(Combo1.GethWnd, CB_GETITEMHEIGHT, 0, ByVal 0)
   
    newHeight = itemHeight * (numItemsToDisplay + 2)
   
    Ret = Api_GetWindowRect(Combo1.GethWnd, rc)
   
    pt.x = rc.Left
    pt.y = rc.Top

    Ret = Api_ScreenToClient(GethWnd, pt)

    Ret = Api_MoveWindow(Combo1.GethWnd, pt.x, pt.y, Combo1.GetWidth, newHeight, True)
   
    Ret = Api_SendMessage(Combo1.GethWnd, CB_SHOWDROPDOWN, True, ByVal 0)
   
    SetMapMode oldMapMode
End Sub

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