JanetTerra
Jul 4, 2011
=ShapedDemo1.bas=
This code accompanies the article [[ShapedWindow|Creating a Nonrectangular Window]]
[[code format="lb"]]
'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
[[code]]