서론
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 개발을 하면서 이와 같은 추가 기능을 통해 프로그램의 사용성을 높여보세요.
댓글 없음:
댓글 쓰기