151 lines
5.0 KiB
Plaintext
151 lines
5.0 KiB
Plaintext
#include "fbgfx.bi"
|
|
#define rect 4
|
|
|
|
Windowtitle "Mouse events"
|
|
Screen 19,32
|
|
Dim Shared As Integer xres, yres
|
|
Screeninfo xres, yres
|
|
|
|
Type box
|
|
As Single x, y, z
|
|
As String caption
|
|
As Uinteger textcol, boxcol
|
|
End Type
|
|
|
|
Dim Shared As box label(rect,1)
|
|
Dim Shared As box button(rect,1)
|
|
Dim Shared As Boolean flag
|
|
Dim Shared As fb.event e
|
|
Dim As Uinteger background = Rgb(100,100,100)
|
|
|
|
Sub thickline(x1 As Double, y1 As Double, x2 As Double, y2 As Double,_
|
|
thickness As Double, colour As Uinteger, im As Any Pointer = 0)
|
|
Dim p As Uinteger = Rgb(255, 255, 254)
|
|
If thickness < 2 Then
|
|
Line(x1,y1)-(x2,y2), colour
|
|
Else
|
|
Dim As Double h = Sqr((x2-x1)^2+(y2-y1)^2), s = (y1-y2)/h, c = (x2-x1)/h
|
|
For x As Integer = 1 To 2
|
|
Line im,(x1+s*thickness/2,y1+c*thickness/2)-(x2+s*thickness/2,y2+c*thickness/2),p
|
|
Line im,(x1-s*thickness/2,y1-c*thickness/2)-(x2-s*thickness/2,y2-c*thickness/2),p
|
|
Line im,(x1+s*thickness/2,y1+c*thickness/2)-(x1-s*thickness/2,y1-c*thickness/2),p
|
|
Line im,(x2+s*thickness/2,y2+c*thickness/2)-(x2-s*thickness/2,y2-c*thickness/2),p
|
|
Paint im,((x1+x2)/2, (y1+y2)/2), p, p
|
|
p = colour
|
|
Next x
|
|
End If
|
|
End Sub
|
|
|
|
Function inbox(p1() As box, p2 As box) As Integer
|
|
Type pt2d : As Single x, y : End Type
|
|
Type ln2d : As pt2d v1, v2 : End Type
|
|
#macro isleft(L,p)
|
|
-Sgn((L.v1.x-L.v2.x)*(p.y-L.v2.y) - (p.x-L.v2.x)*(L.v1.y-L.v2.y))
|
|
#endmacro
|
|
Dim As Single n1 = p1(rect,0).z
|
|
Dim As Integer index, nextindex
|
|
Dim send As ln2d
|
|
Dim As Integer n, wn = 0
|
|
For n = 1 To 4
|
|
index = n Mod 5 : nextindex = (n+1) Mod 5
|
|
If nextindex = 0 Then nextindex = 1
|
|
send.v1.x = p1(index,n1).x : send.v2.x = p1(nextindex,n1).x
|
|
send.v1.y = p1(index,n1).y : send.v2.y = p1(nextindex,n1).y
|
|
If p1(index,n1).y <= p2.y Then
|
|
If p1(nextindex,n1).y > p2.y Then
|
|
If isleft(send,p2) > 0 Then wn += 1
|
|
End If
|
|
Else
|
|
If p1(nextindex,n1).y <= p2.y Then
|
|
If isleft(send,p2) < 0 Then wn -= 1
|
|
End If
|
|
End If
|
|
Next n
|
|
Return wn
|
|
End Function
|
|
|
|
Sub draw_box(p() As box, col As Uinteger, pnt As String = "paint", im As Any Pointer = 0)
|
|
Dim As Integer index, nextindex
|
|
Dim As Single n1 = p(rect,0).z
|
|
Dim As Double xc, yc
|
|
For n As Integer = 1 To 4
|
|
xc += p(n,n1).x : yc += p(n,n1).y
|
|
index = n Mod 5 : nextindex = (n+1) Mod 5
|
|
If nextindex = 0 Then nextindex = 1
|
|
thickline(p(index,n1).x,p(index,n1).y, p(nextindex,n1).x,p(nextindex,n1).y,4,col,im)
|
|
Next n
|
|
xc /= Ubound(p) : yc /= Ubound(p)
|
|
If pnt = "paint" Then Paint(xc,yc), col, col
|
|
End Sub
|
|
|
|
Sub highlightbox(box() As box, mp As box, col As Uinteger)
|
|
box(rect,0).z = 1
|
|
If inbox(box(),mp) Then draw_box(box(),col,"dont_paint")
|
|
End Sub
|
|
|
|
Sub checkbox(box() As box,mp As box)
|
|
flag = True
|
|
label(rect,1).caption = box(rect,1).caption
|
|
label(rect,1).textcol = box(rect,1).textcol
|
|
label(rect,1).boxcol = box(rect,1).boxcol
|
|
End Sub
|
|
|
|
Sub drawbox(x As Integer, y As Integer, box()As box, boxlength As Integer, _
|
|
boxheight As Integer, col As Uinteger, highlight As Uinteger, caption As String)
|
|
Dim As box startpoint
|
|
startpoint.x = x : startpoint.y = y
|
|
Dim As Integer mmx, mmy
|
|
Getmouse mmx, mmy
|
|
Dim As box mouse
|
|
mouse.x = mmx : mouse.y = mmy
|
|
box(rect,1).boxcol = col
|
|
box(rect,1).caption = caption
|
|
Dim As Uinteger outline, count = 1
|
|
outline = Rgb(255,255,255)
|
|
For x As Integer = 1 To 4
|
|
Select Case x
|
|
Case 1
|
|
box(1,count).x = startpoint.x
|
|
box(1,count).y = startpoint.y
|
|
Case 2
|
|
box(2,count).x = box(1,count).x + boxlength
|
|
box(2,count).y = box(1,count).y
|
|
Case 3
|
|
box(3,count).x = box(2,count).x
|
|
box(3,count).y = box(2,count).y + boxheight
|
|
Case 4
|
|
box(4,count).x = box(3,count).x - boxlength
|
|
box(4,count).y = box(3,count).y
|
|
End Select
|
|
Next x
|
|
box(rect,0).z = 1
|
|
draw_box(box(),col)
|
|
draw_box(box(),outline,"nopaint")
|
|
If inbox(box(),mouse) Then
|
|
highlightbox(box(),mouse,highlight)
|
|
If (Screenevent(@e)) Then
|
|
If e.type = fb.EVENT_MOUSE_BUTTON_PRESS Then checkbox(box(),mouse)
|
|
End If
|
|
End If
|
|
Draw String(box(1,1).x+5,box(1,1).y+5), box(rect,1).caption,box(rect,1).textcol
|
|
End Sub
|
|
|
|
' ---------- Main Program ----------
|
|
Do
|
|
Screenlock
|
|
Cls
|
|
Paint(0,0), background
|
|
Draw String(300,50), "BUTTON CLICK TEST", Rgb(0,0,200)
|
|
|
|
drawbox(100,100,button(),100,50,Rgb(200,200,0),Rgb(00,0,200),"Box 1")
|
|
drawbox(100,200,button(),100,50,Rgb(200,0,190),Rgb(00,0,200),"Box 2")
|
|
drawbox(100,300,button(),100,50,Rgb(0,200,190),Rgb(00,0,200),"Box 3")
|
|
|
|
If flag Then drawbox(400,100,label(),250,250,label(rect,1).boxcol,Rgb(255,255,255),label(rect,1).caption)
|
|
If (Screenevent(@e)) Then
|
|
If e.type=13 Then End
|
|
End If
|
|
Screenunlock
|
|
Sleep 1, 1
|
|
Loop Until Inkey = Chr(27)
|