Transparent window shadow

 BBS: Inland Empire Archive
Date: 03-01-93 (00:42)             Number: 389
From: MARK BUTLER                  Refer#: NONE
  To: MARK HARRIS                   Recvd: NO  
Subj: Transparent window shadow      Conf: (2) Quik_Bas
Once upon a time Mark Harris uttered these sage words to Mark Butler:

 MB> Exactly what troubles are you having with the transparent shadowing?

 MH> The problem I'm facing is major ignorance.  I don't
 MH> understand  what the POKEing is doing, exactly.  And,
 MH> really, it's not just  the shadow; I want to restore
 MH> everything behind the window, as  well, to give it a smooth,
 MH> sharp, professional look.  To be  honest, I haven't done
 MH> much with it; let me play with it some  more, and when I
 MH> have more specific questions, I'll write to you  and ask.

 Ok, let's look at the shadow code...

 SUB Shadow (Uprow, Ltcol, Lorow, Rtcol) STATIC
 'First we'll want to get the correct text mode video segment
 'which will be &HB800 if we're using CGA and up. If it's monochrome
 'the segment would be &HB000 but there isn't a lot of point for a
 'shadow on a monchrome monitor so if it is we'll just duck back out
 'of the sub
    DEF SEG = &H40
    equip = PEEK(&H10)
    IF (equip AND 48) = 48 THEN
        EXIT SUB
    ELSE
        DEF SEG = &HB800
    END IF
'*********************************************************
'****** find out what the screen attribute  **************
'****** already is (underneath the box) ******************
'*********************************************************
 'Now here we're using the screen function to get the color
 'atrributes right off the screen for the areas we want to recolor to
 'look like a shadow. This bit of code finds out if the character
 'displayed at the location is a hi-color and changes it to the lower
 '(non-hi) color. If you wanted to keep this simple you could skip all
 'this and merely set attr%=8 which will give you a shadow that is
 'in COLOR 8, 0 no matter what used to be there. This is just a bit
 'fancier as it allows for different shadow colors.
    attr = SCREEN(Lorow + 1, Rtcol + 1, -1)  ' Obtain the color attribute
    attr = attr AND 15                       ' Calculate forground color.
    attr = attr - 8                          ' Remove bright from the color
    IF attr < 1 THEN attr = 8                ' In case color wasn't bright
'*********************************************************
'****** use the given box dimensions to POKE a ***********
'****** "shadow" on the right side and bottom edge *******
'*********************************************************
 'Now this part of the code uses a formula that John Strong (author of
 'the EZWindow library) taught me to get a particular screen offset...
 '                   offset=(row-1)*160+(Col-1)*2+1
 '..(we've already set the segment above) and we just POKE a new color
 'attribute at that location. The way I've set it up below these
 'locations will be along the right edge and bottom of our window.
    FOR row = Uprow + 1 TO Lorow + 1       '***** right edge locations. ***
        FOR Col = Rtcol + 1 TO Rtcol + 2   '***** make it 2 chars wide. ***
            offset = (row - 1) * 160 + (Col - 1) * 2 + 1
            POKE offset, attr  '<---we POKE the new color attr right here
        NEXT
    NEXT
    row = Lorow + 1                        '***** now POKE along the ******
    FOR Col = Ltcol + 2 TO Rtcol + 2       '***** bottom edge *************
        offset = (row - 1) * 160 + (Col - 1) * 2 + 1
        POKE offset, attr '<---we POKE the new color attr here also
    NEXT
    DEF SEG '*** we're all done so we can return to BASIC's default seg
 END SUB

 Now to restore the screen to it's original state what you want to do is
 to save the screen to an array that has been dimensioned large enough to
 hold all elements of the text mode screen. Then when you want to cause
 your window to "vanish" you move the contents of that array back to the
 video segment again. I don't recall now if I provided for that in the
 code you are playing with but I know I included "SaveScrn" and "RestScrn"
 subs in the pulldown code I posted a little while back here. Take a look
 at that code if you want to pop your windows on and off the screen with
 a professional looking 'vanishing act' :-)

 MH> On another topic, I posted a msg to a certain moderator
 MH> after you  did and also "areafixed" it....

 Well, I don't feel very good about discussing that topic here even
 though the person you mentioned rags on this conference quite often. I
 have come to see that returning evil for evil is not quite right. It
 really doesn't make anything better as Zack wisely pointed out to me the
 other day regarding my strong distaste for the person who attempted to
 hijack both of these conferences. When it comes down to it an echo is
 the _property_ of it's moderator by Fido definition. And as such the
 moderator has absolute license to run his/her conference in any manner
 that suits their taste. So that means that the person in question was
 technically correct in stating that his echo's participants are strictly
 limited to only the "rights" that you and I chose to excercise with
 regard to his conference (taking a hike that is).

 Besides, I like it much better over here anyway. <grin>

תש [-M-H-B-] שת

--- timEd/B7 * Computer possessed?  Use DEVICE = EXOR.SYS
 * Origin:  MotherShip Portholes, Portland OR  (1:105/330.5)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET