구멍뚫린 폼을 만들어 볼까 합니다. 

예를들어 캡순이 프로그램 처럼 지정된 영역안에 있는 화면만 캡춰하여 이미지로 저장할 수 있는 기능을 만들고자 할때 가운데가 비어있는 사각틀을 만들어야 되겠죠?  그래서 그 사각틀을 만들어 볼까 합니다.


사각틀을 만드는 다른방법으로 SetLayeredWindowAttributes 를 사용하여 해당 색상을 투명하게 만들어 작업할 수도 있습니다.


폼 투명도 주기



아래 그림과 같이 윈도우 폼은 일반적으로 타이틀이나 테두리 부분이 있는 비클라이언트 영역과 컨트롤 등을 배치하여 작업을

하는 클라이언트 영역으로 나뉩니다.




여기에서는 폼사이즈에 변경에 관계없이 클라이언트 영역만 안보이게 하여 아래 그림과 같이 만들어 보겠습니다.




Private Declare Function GetWindowRect Lib "user32" _

                        (ByVal hwnd As Long, _

                         lpRect As RECT) As Long

                         

Private Declare Function GetClientRect Lib "user32" _

                        (ByVal hwnd As Long, _

                         lpRect As RECT) As Long

                         

Private Declare Function CreateRectRgn Lib "gdi32" _

                        (ByVal X1 As Long, _

                         ByVal Y1 As Long, _

                         ByVal X2 As Long, _

                         ByVal Y2 As Long) As Long

                         

Private Declare Function OffsetRgn Lib "gdi32" _

                        (ByVal hRgn As Long, _

                         ByVal x As Long, _

                         ByVal y As Long) As Long

                         

Private Declare Function CombineRgn Lib "gdi32" _

                        (ByVal hDestRgn As Long, _

                         ByVal hSrcRgn1 As Long, _

                         ByVal hSrcRgn2 As Long, _

                         ByVal nCombineMode As Long) As Long

                         

Private Declare Function SetWindowRgn Lib "user32" _

                        (ByVal hwnd As Long, _

                         ByVal hRgn As Long, _

                         ByVal bRedraw As Boolean) As Long

                         

Private Declare Function DeleteObject Lib "gdi32" _

                        (ByVal hObject As Long) As Long


Private Type RECT

        Left As Long

        Top As Long

        Right As Long

        Bottom As Long

End Type


Private Const RGN_AND = 1

Private Const RGN_OR = 2

Private Const RGN_XOR = 3

Private Const RGN_DIFF = 4

Private Const RGN_COPY = 5


Private Sub Form_Resize()


  Const Degree    As Long = 0


  Dim WindowRect  As RECT

  Dim ClientRect  As RECT

  Dim hRgn1       As Long

  Dim hRgn2       As Long

  Dim lMoveX      As Long

  Dim lMoveY      As Long


  GetWindowRect Me.hwnd, WindowRect


  GetClientRect Me.hwnd, ClientRect


  lMoveX = ((WindowRect.Right - WindowRect.Left) - ClientRect.Right) \ 2

  lMoveY = ((WindowRect.Bottom - WindowRect.Top) - ClientRect.Bottom) - lMoveX


  hRgn1 = CreateRectRgn(0, 0, WindowRect.Right - WindowRect.Left, WindowRect.Bottom - WindowRect.Top)


  hRgn2 = CreateRectRgn(0, 0, ClientRect.Right - Degree * 2, ClientRect.Bottom - Degree * 2)


  OffsetRgn hRgn2, lMoveX + Degree, lMoveY + Degree


  CombineRgn hRgn1, hRgn1, hRgn2, RGN_XOR


  SetWindowRgn Me.hwnd, hRgn1, True


  DeleteObject hRgn1

  DeleteObject hRgn2


End Sub

 

폼의 비 클라이언트 영역을 포함한 크기로 Region을 만들고(hRgn1), 구멍의 크기를 클라이언트 영역으로 잡고(hRgn2),

OffsetRgn을 이용하여 hRgn2의 위치를 타이틀과 테두리의 크기를 뺀 위치만큼 이동시키고 이를 CombineRgn으로 XOR하여 

겹치지 않는 영역만 남게하여 폼에 적용하고 생성한 Region을 지우는 겁니다.


GetWindowRect, GetClientRect의 설명은 아래 링크를 참고하세요. 

폼 크기, 위치 구하기

 

Tip.

Form_Resize 안에 Degree 값을 증가시키면 사각틀 안쪽이 좁아지게 됩니다.





'VB6 > Interface' 카테고리의 다른 글

폼 타이틀바 Show/Hide  (0) 2013.03.28
바탕화면 아이콘 Show/Hide  (0) 2013.03.28
폼 위치, 크기 구하기  (0) 2013.03.27
폼 투명도 주기  (0) 2013.03.27
폼 타이틀바 이동효과  (0) 2013.03.26

+ Recent posts