서론
Visual Basic 6.0(VB6)은 오래된 개발 환경이지만, 여전히 많은 프로젝트에서 사용되고 있습니다. 특히 MSFlexGrid 컨트롤은 테이블 형태의 데이터를 표시할 때 자주 사용됩니다. 이 글에서는 MSFlexGrid에서 마우스 휠과 Ctrl 키를 사용하여 스크롤 및 확대/축소 기능을 구현하는 방법을 소개합니다. 이 기능은 사용자 경험을 개선하고, 데이터를 더 쉽게 확인할 수 있도록 도와줍니다.
주요 기능 및 요구 사항
- 기본 스크롤: 마우스 휠로 그리드 내용을 위아래로 스크롤합니다.
- 확대/축소: Ctrl 키를 누른 상태에서 마우스 휠을 움직이면 셀 내용을 확대하거나 축소할 수 있습니다.
이 기능을 구현하기 위해 윈도우 메시지 후킹(Window Hooking) 기법을 사용합니다.
코드 예제
1. Form1 코드
Option Explicit
Private Sub Form_Load()
' MSFlexGrid 초기화
With MSFlexGrid1
.Cols = 5
.Rows = 20 ' 더 많은 행을 추가하여 스크롤 가능하게 설정
.TextMatrix(0, 0) = "Header 1"
.TextMatrix(0, 1) = "Header 2"
.TextMatrix(0, 2) = "Header 3"
.TextMatrix(0, 3) = "Header 4"
.TextMatrix(0, 4) = "Header 5"
Dim i As Integer, j As Integer
For i = 1 To .Rows - 1
For j = 0 To .Cols - 1
.TextMatrix(i, j) = "R" & i & "C" & j
Next j
Next i
End With
' 폼의 윈도우 프로시저 후킹
HookForm Me.hWnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
' 윈도우 프로시저 후킹 해제
UnhookForm
End Sub
Public Sub MouseWheel(Direction As Integer)
If (GetAsyncKeyState(vbKeyControl) And &H8000) <> 0 Then
' Ctrl 키가 눌려있는 경우 확대/축소
ZoomGrid Direction
Else
' 일반 스크롤
ScrollGrid Direction
End If
End Sub
Private Sub ScrollGrid(Direction As Integer)
Dim newRow As Long
With MSFlexGrid1
If Direction > 0 Then ' Scroll up
newRow = .TopRow - 1
If newRow < 1 Then newRow = 1
Else ' Scroll down
newRow = .TopRow + 1
If newRow > .Rows - 1 Then newRow = .Rows - 1
End If
.TopRow = newRow
End With
End Sub
Private Sub ZoomGrid(Direction As Integer)
Static currentFontSize As Integer
If currentFontSize = 0 Then currentFontSize = MSFlexGrid1.Font.Size
If Direction > 0 Then ' Zoom in
currentFontSize = currentFontSize + 1
Else ' Zoom out
currentFontSize = currentFontSize - 1
If currentFontSize < 1 Then currentFontSize = 1 ' 최소 폰트 크기 제한
End If
MSFlexGrid1.Font.Size = currentFontSize
End Sub
---2. Module1 모듈 코드
Option Explicit
Public Const GWL_WNDPROC = -4
Public Const WM_MOUSEWHEEL = &H20A
Public lpPrevWndProc As Long
Public hWndForm As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndProc As Long, ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetAsyncKeyState Lib "user32" _
(ByVal vKey As Long) As Integer
Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_MOUSEWHEEL Then
Dim zDelta As Integer
zDelta = (wParam And &HFFFF0000) \ &H10000
' 마우스 휠 이벤트 처리
Form1.MouseWheel zDelta
WindowProc = 0 ' 이벤트 처리 완료
Exit Function
End If
WindowProc = CallWindowProc(lpPrevWndProc, hWnd, uMsg, wParam, lParam)
End Function
Public Sub HookForm(hWnd As Long)
lpPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
hWndForm = hWnd
End Sub
Public Sub UnhookForm()
If lpPrevWndProc <> 0 Then
SetWindowLong hWndForm, GWL_WNDPROC, lpPrevWndProc
lpPrevWndProc = 0
End If
End Sub
---코드 설명
폼 초기화 및 후킹:
- 폼이 로드될 때 MSFlexGrid를 초기화하고
HookForm함수로 윈도우 프로시저를 후킹합니다. - 폼이 언로드될 때는
UnhookForm을 호출하여 후킹을 해제합니다.
- 폼이 로드될 때 MSFlexGrid를 초기화하고
마우스 휠 이벤트 처리:
MouseWheel서브루틴은 마우스 휠 움직임을 처리합니다.- Ctrl 키가 눌린 상태에서는
ZoomGrid함수로 폰트 크기를 조절하여 그리드 셀 내용을 확대/축소합니다. - 일반적으로는
ScrollGrid함수로 그리드 내용을 스크롤합니다.
윈도우 프로시저 후킹:
WindowProc함수는 후킹된 윈도우 프로시저로, 마우스 휠 이벤트를 감지하고 적절한 처리를 합니다.
마무리
이 글에서 소개한 방법을 사용하면 VB6의 MSFlexGrid에서 마우스 휠과 Ctrl 키를 사용한 스크롤 및 확대/축소 기능을 쉽게 구현할 수 있습니다. 이 방법은 사용자가 데이터를 더 효율적으로 탐색할 수 있도록 돕는 데 큰 도움이 될 것입니다. VB6 개발을 하면서 이와 같은 추가 기능을 통해 프로그램의 사용성을 높여보세요.
댓글 없음:
댓글 쓰기