Private m_FormRegion As Long
Private Sub Form_Resize()
Dim wid As Single
Dim hgt As Single
Dim border_width As Single
Dim title_height As Single
If WindowState = vbMinimized Then Exit Sub
' If we already have a region, destroy it.
If m_FormRegion <> 0 Then
DeleteObject m_FormRegion
m_FormRegion = 0
End If
' Create the outer region.
wid = ScaleX(Width, vbTwips, vbPixels)
hgt = ScaleY(Height, vbTwips, vbPixels)
m_FormRegion = CreateRectRgn(0, 0, wid, hgt)
' Find the client area.
border_width = (wid - ScaleWidth) / 2
title_height = hgt - border_width - ScaleHeight
' Recursively cut holes in the region.
CutHoles m_FormRegion, 3, _
border_width, title_height, _
ScaleWidth, ScaleHeight
' Restrict the window to the region.
SetWindowRgn hWnd, m_FormRegion, True
End Sub
|
' Recursively cut holes in this region.
Private Sub CutHoles(ByRef outer_rgn As Long, ByVal level _
As Integer, ByVal xmin As Long, ByVal ymin As Long, _
ByVal xmax As Long, ByVal ymax As Long)
Const RGN_DIFF = 4
Dim inner_rgn As Long
Dim combined_rgn As Long
Dim dx As Long
Dim x1 As Long
Dim x2 As Long
Dim dy As Long
Dim y1 As Long
Dim y2 As Long
' See if we should stop.
If level < 1 Then Exit Sub
' Divide the area.
dx = (xmax - xmin) / 3
x1 = xmin + dx
x2 = xmin + 2 * dx
dy = (ymax - ymin) / 3
y1 = ymin + dy
y2 = ymin + 2 * dy
' Cut out regions.
inner_rgn = CreateEllipticRgn(xmin, ymin, x1, y1)
combined_rgn = CreateRectRgn(0, 0, 0, 0)
CombineRgn combined_rgn, outer_rgn, inner_rgn, RGN_DIFF
DeleteObject outer_rgn
DeleteObject inner_rgn
outer_rgn = combined_rgn
inner_rgn = CreateEllipticRgn(x2, ymin, xmax, y1)
combined_rgn = CreateRectRgn(0, 0, 0, 0)
CombineRgn combined_rgn, outer_rgn, inner_rgn, RGN_DIFF
DeleteObject outer_rgn
DeleteObject inner_rgn
outer_rgn = combined_rgn
inner_rgn = CreateEllipticRgn(x1, y1, x2, y2)
combined_rgn = CreateRectRgn(0, 0, 0, 0)
CombineRgn combined_rgn, outer_rgn, inner_rgn, RGN_DIFF
DeleteObject outer_rgn
DeleteObject inner_rgn
outer_rgn = combined_rgn
inner_rgn = CreateEllipticRgn(xmin, y2, x1, ymax)
combined_rgn = CreateRectRgn(0, 0, 0, 0)
CombineRgn combined_rgn, outer_rgn, inner_rgn, RGN_DIFF
DeleteObject outer_rgn
DeleteObject inner_rgn
outer_rgn = combined_rgn
inner_rgn = CreateEllipticRgn(x2, y2, xmax, ymax)
combined_rgn = CreateRectRgn(0, 0, 0, 0)
CombineRgn combined_rgn, outer_rgn, inner_rgn, RGN_DIFF
DeleteObject outer_rgn
DeleteObject inner_rgn
outer_rgn = combined_rgn
' Recursively cut more holes.
CutHoles outer_rgn, level - 1, x1, ymin, x2, y1
CutHoles outer_rgn, level - 1, xmin, y1, x1, y2
CutHoles outer_rgn, level - 1, x2, y1, xmax, y2
CutHoles outer_rgn, level - 1, x1, y2, x2, ymax
End Sub
|