' Mauszeiger fr SCREEN 0 wie in MSBACKUP.EXE von MS-DOS 6.22 DECLARE SUB Einblenden (xM%, yM%, updTxt%) DECLARE SUB Ausblenden (xM%, yM%, updTxt%) ' $INCLUDE: 'qb.bi' ' wir verwenden CHR$(200)-CHR$(205) fr unser "Shaped" Mauszeiger CONST StartZei% = 200 DIM SHARED dosIntEin AS RegTypeX, dosIntAus AS RegTypeX ' Puffer fr 2x3 Zeichen, 16 Bytes gross DIM SHARED ZeiPuff AS STRING * 96, r%(2, 1) DIM SHARED MausAnd%(3, 15), MausOr%(3, 15) DIM SHARED xPoAlt%, yPoAlt% ' Definition Mauszeiger FOR i% = 0 TO 15 READ z$ FOR j% = 0 TO 3 MausAnd%(j%, i%) = 0 MausOr%(j%, i%) = 0 FOR k% = 1 TO 8 MausOr%(j%, i%) = MausOr%(j%, i%) * 2 MausAnd%(j%, i%) = MausAnd%(j%, i%) * 2 ' Hinweis SPACE$(8): 0er-"Rand" dient dazu, dass wir sp„ter kein ' kompliziertes "IF ausserhalb Index" machen mssen SELECT CASE MID$(SPACE$(8) + z$ + SPACE$(8), 8 * j% + k%, 1) CASE "*" MausAnd%(j%, i%) = MausAnd%(j%, i%) OR 1 CASE "." MausOr%(j%, i%) = MausOr%(j%, i%) OR 1 END SELECT NEXT k% MausAnd%(j%, i%) = MausAnd%(j%, i%) XOR 255 NEXT j% NEXT i% DATA " ** " DATA "*..**** " DATA "*......**** " DATA "*..........**** " DATA "*..............*" DATA " *...........** " DATA " *.........** " DATA " *...**...* " DATA " *.** *...* " DATA " * *...* " DATA " *...* " DATA " *...* " DATA " *....*" DATA " *...*" DATA " *.* " DATA " * " ' Die Demo hier ist speziell fr den 80x25-Textmodus ausgelegt SCREEN 0 WIDTH 80, 25 CLS FOR i% = 1 TO 25 LOCATE i%, 1 FOR j% = 1 TO 79 DO c% = CINT(INT(256! * RND)) LOOP WHILE c% = 7 OR c% >= 9 AND c% <= 13 OR c% >= 28 AND c% <= 31 OR c% >= StartZei% AND c% < StartZei% + 6 PRINT CHR$(c%); NEXT j% NEXT i% dosIntEin.ax = &H0 CALL INTERRUPTX(&H33, dosIntEin, dosIntAus) IF dosIntAus.ax <> &HFFFF THEN PRINT "Keine Maus installiert!" END END IF dosIntEin.ax = &HF dosIntEin.cx = 8 dosIntEin.dx = 16 CALL INTERRUPTX(&H33, dosIntEin, dosIntAus) dosIntEin.ax = &H3 CALL INTERRUPTX(&H33, dosIntEin, dosIntAus) xLetzt% = dosIntAus.cx yLetzt% = dosIntAus.dx Einblenden xLetzt%, yLetzt%, -1 DO dosIntEin.ax = &H3 CALL INTERRUPTX(&H33, dosIntEin, dosIntAus) x% = dosIntAus.cx y% = dosIntAus.dx IF x% <> xLetzt% OR y% <> yLetzt% THEN Ausblenden x%, y%, 0 Einblenden x%, y%, 0 LOCATE 20, 1 PRINT x%; y% xLetzt% = x% yLetzt% = y% END IF t$ = INKEY$ ' CPU-Idle fr Windows dosIntEin.ax = &H1680 CALL INTERRUPTX(&H2F, dosIntEin, dosIntAus) LOOP UNTIL t$ = CHR$(27) Ausblenden 0, 0, -1 SUB Ausblenden (xM%, yM%, updTxt%) xPo% = 1 + xM% \ 8 yPo% = 1 + yM% \ 16 IF xPo% <> xPoAlt% OR yPo% <> yPoAlt% OR updTxt% THEN FOR y% = 0 TO 1 LOCATE yPoAlt% + y%, xPoAlt% FOR x% = 0 TO 2 PRINT CHR$(r%(x%, y%)); NEXT x% NEXT y% END IF END SUB SUB Einblenden (xM%, yM%, updTxt%) xPo% = 1 + xM% \ 8 yPo% = 1 + yM% \ 16 IF xPo% <> xPoAlt% OR yPo% <> yPoAlt% OR updTxt% THEN ' Ausschnitt sichern FOR y% = 0 TO 1 FOR x% = 0 TO 2 r%(x%, y%) = SCREEN(yPo% + y%, xPo% + x%) NEXT x% NEXT y% END IF ' Bitmusterkopie vom Block ziehen, auf welchem sich derzeit der Mauszeiger befindet dosIntEin.ax = &H1130 dosIntEin.bx = &H600 CALL INTERRUPTX(&H10, dosIntEin, dosIntAus) DEF SEG = dosIntAus.es FOR y% = 0 TO 1 FOR x% = 0 TO 2 ba% = dosIntAus.bp + 16 * r%(x%, y%) FOR i% = 0 TO 15 MID$(ZeiPuff, 1 + 32 * x% + 16 * y% + i%) = CHR$(PEEK(ba% + i%)) NEXT i% NEXT x% NEXT y% ' Mauszeiger berlagern h1% = 1 h2% = 256 xR% = xM% MOD 8 FOR i% = 0 TO xR% h1% = 2 * h1% h2% = h2% \ 2 NEXT i% yR% = yM% MOD 16 FOR y% = 0 TO 15 FOR x% = 0 TO 2 p% = 1 + 32 * x% + yR% + y% MID$(ZeiPuff, p%) = CHR$((ASC(MID$(ZeiPuff, p%, 1)) AND MausAnd%(x%, y%) * h2% + MausAnd%(x% + 1, y%) \ h1% OR MausOr%(x%, y%) * h2% + MausOr%(x% + 1, y%) \ h1%) AND 255) NEXT x% NEXT y% ' In Puffer laden dosIntEin.ax = &H1100 dosIntEin.bx = &H1000 dosIntEin.cx = 6 dosIntEin.dx = StartZei% dosIntEin.es = VARSEG(ZeiPuff) dosIntEin.bp = VARPTR(ZeiPuff) CALL INTERRUPTX(&H10, dosIntEin, dosIntAus) ' Ausschnitt zeichnen IF xPo% <> xPoAlt% OR yPo% <> yPoAlt% OR updTxt% THEN ' Ausschnitt ausgeben FOR y% = 0 TO 1 LOCATE yPo% + y%, xPo% FOR x% = 0 TO 2 PRINT CHR$(StartZei% + 2 * x% + y%); NEXT x% NEXT y% xPoAlt% = xPo% yPoAlt% = yPo% END IF END SUB