2024년 8월 9일 금요일

VB6에서 MSFlexGrid 마우스 휠로 스크롤 및 확대/축소 기능 구현 방법

서론

Visual Basic 6.0(VB6)은 오래된 개발 환경이지만, 여전히 많은 프로젝트에서 사용되고 있습니다. 특히 MSFlexGrid 컨트롤은 테이블 형태의 데이터를 표시할 때 자주 사용됩니다. 이 글에서는 MSFlexGrid에서 마우스 휠과 Ctrl 키를 사용하여 스크롤 및 확대/축소 기능을 구현하는 방법을 소개합니다. 이 기능은 사용자 경험을 개선하고, 데이터를 더 쉽게 확인할 수 있도록 도와줍니다.

주요 기능 및 요구 사항

  1. 기본 스크롤: 마우스 휠로 그리드 내용을 위아래로 스크롤합니다.
  2. 확대/축소: 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

---

코드 설명

  1. 폼 초기화 및 후킹:

    • 폼이 로드될 때 MSFlexGrid를 초기화하고 HookForm 함수로 윈도우 프로시저를 후킹합니다.
    • 폼이 언로드될 때는 UnhookForm을 호출하여 후킹을 해제합니다.
  2. 마우스 휠 이벤트 처리:

    • MouseWheel 서브루틴은 마우스 휠 움직임을 처리합니다.
    • Ctrl 키가 눌린 상태에서는 ZoomGrid 함수로 폰트 크기를 조절하여 그리드 셀 내용을 확대/축소합니다.
    • 일반적으로는 ScrollGrid 함수로 그리드 내용을 스크롤합니다.
  3. 윈도우 프로시저 후킹:

    • WindowProc 함수는 후킹된 윈도우 프로시저로, 마우스 휠 이벤트를 감지하고 적절한 처리를 합니다.

마무리

이 글에서 소개한 방법을 사용하면 VB6의 MSFlexGrid에서 마우스 휠과 Ctrl 키를 사용한 스크롤 및 확대/축소 기능을 쉽게 구현할 수 있습니다. 이 방법은 사용자가 데이터를 더 효율적으로 탐색할 수 있도록 돕는 데 큰 도움이 될 것입니다. VB6 개발을 하면서 이와 같은 추가 기능을 통해 프로그램의 사용성을 높여보세요.


댓글 없음:

댓글 쓰기

-


Sidewinder


World


FishMusic


LaughingBaby