 |
BCX Console Demonstration Program S90.bas
|
'-----------------------------------------------------------------
' BCX Console mode demonstration by Kevin Diggins (2000)
' Uses pointer arithmetic to grab screen text and color attributes
' Clears the screen and then restores the original text screen
'-----------------------------------------------------------------
DIM
Buffer$ *
(
80
*
25
*
2
)
+
1
GetText(
1
, 1
, 80
, 24
, Buffer$)
Say(
"Press a key to Clear the screen"
)
CLS
Say(
"Press a key to Restore the screen"
)
PutText (
1
, 1
, 80
, 24
, Buffer$)
FREE
Buffer$
SUB
Say(
A$)
LOCAL
EatKey
PRINT
A$
WHILE
NOT
INSTAT
WEND
EatKey =
KEYPRESS
END
SUB
SUB
GetText(
x1, y1, x2, y2, dest$)
LOCAL
i AS
DWORD
LOCAL
ilen AS
DWORD
LOCAL
width AS
DWORD
LOCAL
coord AS
COORD
LOCAL
pwattr AS
LPWORD
LOCAL
y AS
DWORD
LOCAL
pstr AS
LPSTR
width =
(
x2 -
x1 +
1
)
pwattr =
malloc(
width *
SIZEOF
(
*
pwattr)
+
1
)
IF
NOT
pwattr THEN
EXIT
SUB
END
IF
pstr =
malloc(
width)
IF
NOT
pstr THEN
FREE
(
pwattr)
EXIT
SUB
END
IF
FOR
y =
y1 TO
y2
coord.X =
x1 -
1
coord.Y =
y -
1
ReadConsoleOutputCharacterA(
hConsole, pstr, width, coord, &
ilen)
ReadConsoleOutputAttribute(
hConsole, pwattr, width, coord, &
ilen)
FOR
i =
0
TO
width
*
dest$ =
*
(
pstr +
i)
dest+
+
*
dest$ =
(
char
)
*
(
pwattr +
i)
dest+
+
NEXT
NEXT
FREE
(
pwattr)
FREE
(
pstr)
END
SUB
SUB
PutText(
x1, y1, x2, y2, srce$)
LOCAL
i AS
DWORD
LOCAL
ilen AS
DWORD
LOCAL
width AS
DWORD
LOCAL
coord AS
COORD
LOCAL
pwattr AS
LPWORD
LOCAL
y AS
DWORD
LOCAL
pstr AS
LPSTR
width =
(
x2 -
x1 +
1
)
pwattr =
malloc(
width *
SIZEOF
(
*
pwattr)
)
IF
NOT
pwattr THEN
EXIT
SUB
END
IF
pstr =
malloc(
width +
1
)
IF
NOT
pstr THEN
FREE
(
pwattr)
EXIT
SUB
END
IF
FOR
y =
y1 TO
y2
FOR
i =
0
TO
width
*
(
pstr +
i)
=
*
srce$
srce+
+
*
(
pwattr +
i)
=
*
srce$
srce+
+
NEXT
i
coord.X =
x1 -
1
coord.Y =
y -
1
WriteConsoleOutputCharacterA(
hConsole, pstr, width, coord, &
ilen)
WriteConsoleOutputAttribute(
hConsole, pwattr, width, coord, &
ilen)
NEXT
y
FREE
(
pwattr)
FREE
(
pstr)
END
SUB