배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   Userform
제목:   Userform 뒤에 무엇이 보이는가?
     
 

새 페이지 2

  STEP> 살펴보기


오늘의 요리재료는 Userform API 함수입니다. 지난 뉴스레터에서도 Userform과 API 함수를 사용하여 Userform에 메뉴를 달아서 실행하는 것을 보여드렸는데, 자못 분위기는 썰렁하여 필자를 좌절시켰습니다.

이번에는 Userform을 투명하게 만드는 생쇼를 보여드리고자 합니다.

필요한 API함수로는 우선 Userform의 핸들을 구하는 FindWindow함수, 투명한 Userform을 만들기 위해 윈도우를 레이어드 윈도우라는 것으로 변환하는 GetWindowLong/SetWindowLong함수가 필요합니다.
그리고 투명하게 만드는 SetLayeredWindowAttributes함수가 있습니다.

이 함수는 Windows2000이후버전부터 추가된 것으로 아쉽게도 Windows98이하의 윈도우는 아쉽게도 사용할 수 없습니다.

Userform은 단순하게 하나의 수평 스크롤바 하나 달랑 있습니다. 스크롤 바를 움직일때 마다  Userform이 점점 투명해지거나 불투명해질 것입니다.

Option Explicit 

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
 
// 반투명효과를 주는 API함수(Windows2000이상에서만 가능하다)
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Long, ByVal dwFlags As Long) As Long 

// API 함수를 위한 상수
Private Const WS_EX_LAYERED = &H80000
Private Const LWA_COLORKEY = &H1
Private Const LWA_ALPHA = &H2
Private Const GWL_EXSTYLE = (-20)
Private hwnd  As Long 

Private Sub HScroll1_Change()   
    Dim lngAlpha As Long   

    Me.Caption = "투명도:" & CStr(HScroll1.Value) & "%"   

    // 투명도(0~255)를 0~100으로 환산
    lngAlpha = 255 - (255 * (HScroll1.Value / 100))   

    // 위의 알파값으로 투명도 함수 호출
    Call SetLayeredWindowAttributes(hwnd, RGB(0, 0, 255), lngAlpha, LWA_ALPHA) 

End Sub 

Private Sub UserForm_Initialize()
    Dim nIndex          As Long   

    If Val(Application.Version) < 9 Then
        hwnd = FindWindow("ThunderXFrame", Me.Caption)  // XL97이하    Else
        hwnd = FindWindow("ThunderDFrame", Me.Caption)  // XL2000이상
    End If   

    // 윈도우의 스타일을 구한다
    nIndex = GetWindowLong(hwnd, GWL_EXSTYLE)    

    // 윈도우의 스타일을 레이어드 윈도우로 변경한다
    Call SetWindowLong(hwnd, GWL_EXSTYLE, nIndex Or WS_EX_LAYERED)   

    // 윈도우의 투명도를 지정한다
    Call HScroll1_Change 

End Sub

<실행결과>
 
Userform 너머로 셀 포인터가 보입니다. 그런데 투명도를 100%로 하지는 말길 바랍니다. 안보여서 폼을 닫을 수 없을 것입니다. 필자는 VBE의 재설정 버튼으로 간신히 닫았습니다.