ShapedDemo1.bas

This code accompanies the article Creating a Nonrectangular Window

'ShapedDemo1.bas - Janet Terra
'Demo to accompany
'Demo - Creating a Nonrectangular Window
'LBPE July, 2011
'Originally appeared in
'LB Newsletter #132, May, 2005
 
    Nomainwin
 
'Define the Window
    WindowWidth = 500
    WindowHeight = 500
    UpperLeftX = int((DisplayWidth-WindowWidth)/2)
    UpperLeftY = int((DisplayHeight-WindowHeight)/2)
 
    graphicbox #ShapeWindow.gb, 0, 0, 500, 500
    stylebits #ShapeWindow.gb, 0, _WS_BORDER, 0, 0
'Keep the Shaped Window in the Forefront
    stylebits #ShapeWindow, 0, 0, _WS_EX_TOPMOST, 0
 
    open "Shape Window" for window_popup as #ShapeWindow
    #ShapeWindow "trapclose [closeShapeWindow]"
 
'Obtain the Handles and Device Controls
    hBw = hWnd(#ShapeWindow)
    hBgb = hWnd(#ShapeWindow.gb)
    hDCw = GetDC(hBw)
    hDCgb = GetDC(hBgb)
 
'Draw the Shape
    #ShapeWindow.gb "Down"
    gosub [drawShape]
 
'Set background to Transparent
    call SetBkMode hDCgb, 1
'Release memory
    call ReleaseDC hBgb, hDCbg
 
'Format Text
    #ShapeWindow.gb "font Courier_New 14 Bold"
    #ShapeWindow.gb "color Black; place 120 150"
    #ShapeWindow.gb "\Alt-F4 to Close"
    #ShapeWindow.gb "flush"
    wait
 
 [closeShapeWindow]
'Delete API created objects before closing program
    call DelObject hBw
    close #ShapeWindow
    end
 
[drawShape]
'Original values for hRgn is meaningless
    hRgn = RectRegion(0, 0, 0, 0)
 
'hRgn1 = Elliptical Source Region
    hRgn1 = EllipticRegion(100, 50, 200, 250)
'Paint the Ellipse Red
    brushColor1 = 255 'Red Brush
    hBrush1 = createBrush(brushColor1)
    call SelObject hDCw, hBrush1
    call PaintRegion hDCw, hRgn1
    call DelObject hBrush1
 
'Set hRgn to the Combination of itself and hRgn1
    newRgn = CombineRgn(hRgn, hRgn, hRgn1, _RGN_OR)
 
'Delete hRgn1
    call DelObject hRgn1
 
'hRgn2 = Rectangular Source Region
    hRgn2 = RectRegion(150, 75, 300, 200)
'Paint the rectangle blue
    brushColor2 = 255 * 256^2 'Blue Brush
    hBrush2 = createBrush(brushColor2)
    call SelObject hDCw, hBrush2
    call PaintRegion hDCw, hRgn2
    call DelObject hBrush2
 
'Set hRgn to the Combination of itself and hRgn2
    newRgn = CombineRgn(hRgn, hRgn, hRgn2, _RGN_OR)
 
'Delete hRgn2
    call DelObject hRgn2
 
'Set hRgn as the Window
    call SetWindowRgn hBw, hRgn, 1
    return
 
    function GetDC(hW)
        calldll #user32, "GetDC", _
            hW as ulong, _
            GetDC as ulong
    end function
 
    function RectRegion(ulx, uly, width, height)
        calldll #gdi32, "CreateRectRgn", _
            ulx as long, _
            uly as long, _
            width as long, _
            height as long, _
            RectRegion as ulong
    end function
 
    function EllipticRegion(ulx, uly, width, height)
        calldll #gdi32, "CreateEllipticRgn", _
            ulx as long, _
            uly as long, _
            width as long, _
            height as long, _
            EllipticRegion as ulong
    end function
 
    function CombineRgn(hDest, hSource1, hSource2, combineMode)
        calldll #gdi32, "CombineRgn", _
            hDest as ulong, _
            hSource1 as ulong, _
            hSource2 as ulong, _
            combineMode as long, _
            CombineRgn as ulong
    end function
 
    function createBrush(brushColor)
        calldll #gdi32, "CreateSolidBrush", _
            brushColor as long, _
            createBrush as ulong
    end function
 
    sub PaintRegion hDC, hRgn
        calldll #gdi32, "PaintRgn", _
            hDC as ulong, _
            hRgn as ulong, _
            null as long
    end sub
 
    sub DelObject hObject
        calldll #gdi32, "DeleteObject",_
            hObject as ulong,_
            null as long
    end sub
 
    sub SelObject hDC, hBrush
        calldll #gdi32, "SelectObject", _
            hDC as ulong, _
            hBrush as ulong, _
            null as long
    end sub
 
    sub ReleaseDC hWnd, hDC
        calldll #user32,"ReleaseDC", _
            hWnd as ulong,_
            hDC as ulong, _
            null as long
     end sub
 
    sub SetWindowRgn hWnd, hRgn, redrawMode
        calldll #user32, "SetWindowRgn",_
            hWnd as ulong,_
            hRgn as ulong,_
            redrawMode as boolean,_
            SetWindowRgn as long
    end sub
 
    sub SetBkMode hDC, flag
        calldll #gdi32, "SetBkMode", _
            hDC as ulong,_
            flag as long, _
            null as long
     end sub