본문 바로가기
Programming/Visual Basic 6

[VB6] 콤보박스(ComboBox) 길이 제한 해제 및 조절하기

by 너울림 2023. 1. 6.

콤보박스(ComboBox) 길이 제한 해제 및 조절하기

 

콤보 박스(ComboBox) 길이 제한 해제 및 조절하기


포스팅 개요

VB6에서의 콤보 박스는 정말 애증이 필요한 컨트롤입니다. 많이 사용하면서도 기능은 빈약하고 기본 컨트롤이면서 다른 컨트롤에 맞춰 배치하기가 정말 어렵습니다. 오늘 포스팅에서는 이 콤보 박스의 장단점과 드롭다운 상태에서 아이템 리스트 길이 제한, 표기 건수 제한을 모두 해제하는 함수를 소개해드리겠습니다.

  • 콤보 박스의 장점으로는 기본 컨트롤로 별다른 참조가 필요 없어 접근성이 좋고 옵션 변경이 쉬운 편입니다.
  • 콤보 박스의 단점으로는 컨트롤의 크기 변경이나 디자인 변경이 힘들어 깔끔한 배치가 어렵습니다.
  • 아이템을 등록하고 리스트를 펼칠 때 아이템 수가 8개가 넘어가면 스크롤이 강제로 생깁니다.
  • 콤보 박스의 너비(Width)는 자유롭게 수정되지만 높이(Height)는 읽기 전용으로 수정이 불가능합니다.
    꼼수로 컨트롤의 폰트 종류나 크기를 조절하여 제한적인 높이 조절이 가능합니다

테스트 코드 및 예제

예제는 폼에 콤보박스 2개를 생성하여 적용하시면 됩니다. 여기서 중요한 부분은 DLL 프로시저 선언 부분과 콤보 박스의 DropDown이벤트에 사용되는 사용자 함수입니다.

  • 사용자 함수 SetDropdownHeight() 부분은 따로 모듈로 생성하셔서 사용하셔도 됩니다.
  • SetDropdownHeight() 함수는 Max_Extent 인수로 최대 크기를 값을 넘겨 받습니다. 다만 너무 크게 잡을 경우 디자인이 일그러져 보일 수 있으니 최대 크기는 폼 높이(Me.ScaleHeight)를 기준으로 조절하시면 됩니다.
  • 아래 예제 소스는 콤보 박스 2개만 생성하시고 폼(Form) 코드창에  그대로 붙여넣기 하시면 테스트가 가능합니다.
Option Explicit

' *** SetDropdownHeight 관리를 위한 DLL 프로시저 선언 ***
Private Declare Function MoveWindow& Lib "user32" (ByVal hWnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long)

Private Sub Form_Load()
    Dim i%
    
    '콤보박스에 초기값 입력
    For i = 1 To 50
        Combo1.AddItem "Item-" & Format(i, "000")
        Combo2.AddItem "Item-" & Format(i, "000")
        
    Next
    
    Combo1.ListIndex = 0
    Combo2.ListIndex = 0
    
End Sub

Private Sub Combo2_DropDown()
    '콤보박스 길이
    Call SetDropdownHeight(Combo2, Me.ScaleHeight, Me)
End Sub

' *** 콤보박스 길이 조정 함수 ***
Private Sub SetDropdownHeight(Cbo As ComboBox, ByVal Max_Extent As Integer, Fr As Form)

    Dim max_fit As Integer
    Dim item_ht As Integer
        
    If Cbo.ListCount > 8 Then
        item_ht = Fr.ScaleY(Cbo.Height, Fr.ScaleMode, vbPixels) - 8
        max_fit = (Max_Extent - Cbo.Top - Cbo.Height) \ Fr.ScaleY(item_ht, vbPixels, Fr.ScaleMode)

        If Cbo.ListCount <= max_fit Then
            MoveWindow Cbo.hWnd, Fr.ScaleX(Cbo.Left, Fr.ScaleMode, vbPixels), Fr.ScaleY(Cbo.Top, Fr.ScaleMode, vbPixels), Fr.ScaleX(Cbo.Width, Fr.ScaleMode, vbPixels), Fr.ScaleY(Cbo.Height, Fr.ScaleMode, vbPixels) + (item_ht * Cbo.ListCount) + 2, 0
        Else
            MoveWindow Cbo.hWnd, Fr.ScaleX(Cbo.Left, Fr.ScaleMode, vbPixels), Fr.ScaleY(Cbo.Top, Fr.ScaleMode, vbPixels), Fr.ScaleX(Cbo.Width, Fr.ScaleMode, vbPixels), Fr.ScaleY(Cbo.Height, Fr.ScaleMode, vbPixels) + (item_ht * max_fit) + 2, 0
        End If
        
    End If
    
End Sub

 


실행 결과

사용자 함수 SetDropdownHeight()은 콤보 박스의 길이는 조절하되 자연스럽게 표기하기 위해 수치 내의 표기 가능한 최대 아이템 건수를 보여주게 됩니다.

예제 소스 코드 실행 모습
예제 소스 코드 실행 모습

 

댓글