create~rgn 형태의 함수로 영역을 생성하고, SetWindowRgn을 사용하여 영역을 윈도우에 적용 시키는 것까지는 아실겁니다.
다음에는 두 영역을 조합하여 하나의 새로운 영역을 생성하는 CombineRgn 함수 입니다.
CombineRgn 조합한 영역을 저장할 영역의 핸들,조합에 사용할 영역 핸들1,조합에 사용할 영역 핸들2,조합 방법입니다.
여기서 조합한 영역이 저장할 변수에는 이미 영역의 핸들이 지정되어 있어야 합니다. 그렇치 않으면 조합한 영역을 할당하지 못합니다.
조합 방법에 사용할 수 있는 상수는 다음과 같습니다.

상수 설명
RGN_AND 1 두 영역의 공통부분만 합침
RGN_COPY 5 첫번째 영역(hSrcRgn1)을 복사
RGN_DIFF 4 첫번째 영역(hrgnSrc1)에서 두번째 영역을 제외한 부분만 합침
RGN_OR 2 두 영역을 합침
RGN_XOR 3 두 영역을 공통 부분을 제외한 부분을 뺀 부분만 합침


다음은 예제의 초기 화면입니다.


CombineRgn으로 두 영역을 조합하여 SetWindowRgn을 사용하여 윈도우에 적용한 이미지 입니다.


가운데 뻥 뚤린 원이 되었죠.
이런 효과를 꼭 SetWindowRgn이 아닌 다른 함수를 사용해서 효과를 볼수 있읍니다.

소스입니다.
Option Explicit

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 CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 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 Const RGN_DIFF = 4

Private Sub Form_Load()
    Dim OutSide As Long ' 외부 영역
    Dim InSide As Long ' 내부 영역
    Dim Desc As Long ' 조합 결과 영역
   
    With Form1
        .ScaleMode = vbPixels
        OutSide = CreateEllipticRgn(0, 0, .ScaleWidth, .ScaleHeight) ' 영역 생성
        InSide = CreateEllipticRgn(0 + 20, 0 + 20, .ScaleWidth - 20, .ScaleHeight - 20)
        Desc = CreateEllipticRgn(0, 0, .ScaleWidth, .ScaleHeight)
        Call CombineRgn(Desc, OutSide, InSide, RGN_DIFF) ' 영역 조합
        DeleteObject OutSide ' 영역 삭제
        DeleteObject InSide
        Call SetWindowRgn(.hwnd, Desc, True) ' 영역 윈도우에 할당
    End With
End Sub

+ Recent posts