콤보 박스(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()은 콤보 박스의 길이는 조절하되 자연스럽게 표기하기 위해 수치 내의 표기 가능한 최대 아이템 건수를 보여주게 됩니다.
'Programming > Visual Basic 6' 카테고리의 다른 글
[VB6] 프로젝트 참조와 프로젝트 구성요소 이해하기 (0) | 2024.05.09 |
---|---|
[VB6] Windows에서 DLL 호출 시 검색 순서의 중요성 (0) | 2023.11.07 |
[VB6] InputBox의 공백("")과 취소(Cancel) 구분하기 (0) | 2022.12.28 |
[VB6] 시스템 시간을 밀리초(Millisecond)까지 가져오기 (0) | 2022.12.21 |
[VB6] Visual Basic 6 코드 입력창에서 사용되는 단축키 모음 (0) | 2022.12.20 |
[VB6] SendKeys 명령의 사용법과 특수키, 조합키 코드표 (0) | 2022.12.19 |
[VB6] 한글을 2바이트 계산하여 문자열 자르기 (Len, Left, Right, Mid 대체) (0) | 2022.12.17 |
[VB6] 폴더 생성 (경로에 포함 된 모든 폴더 생성) (2) | 2022.12.16 |
댓글