Announcement

Collapse
No announcement yet.

Read Only text display using GRAPHIC WINDOW

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Read Only text display using GRAPHIC WINDOW

    This is a first attempt. Improvements welcome.

    Code:
    ' a stab at a Read Only Text box using PBCC GRAPHIC WINDOW
    ' Chris Holbrook Oct 2008
    '
    #COMPILE EXE
    #DIM ALL
    
    #INCLUDE "WIN32API.INC"
    '--------------------------------------------------------------------
    %MAXLINES = 99
    ' text editor
    FUNCTION dotext ( hGW AS DWORD, stext AS STRING, rct AS QUAD, term AS STRING) AS QUAD
    
        LOCAL ll() AS BYTE PTR
        LOCAL cpl, lpd, lline, endoftext, pxcwide, pxchigh, row, col AS LONG
        LOCAL pbwd AS BYTE PTR
        DIM ll(0 TO 99) AS LOCAL BYTE PTR
        LOCAL r AS rect
        LOCAL skey, s AS STRING
        STATIC SERRWTOOLONG AS STRING
    
        SERRWTOOLONG = "<word too long>"
        ' extract bounding rect from parameter
        r.nleft   = LO(WORD, LO(DWORD,rct))
        r.ntop    = HI(WORD, LO(DWORD,rct))
        r.nright  = LO(WORD, HI(DWORD,rct))
        r.nbottom = HI(WORD, HI(DWORD,rct))
        ' set font
        GRAPHIC FONT "Courier New", 10
        'get pixel sizes of characters
        GRAPHIC CHR SIZE TO pxcwide, pxchigh
    again:
        REDIM ll(0 TO 99) AS LOCAL BYTE PTR
        GRAPHIC BOX (r.nleft,r.ntop) - (r.nright, r.nbottom), 0, 0,0,0
        'get no of charcters per line
        cpl = (r.nright - r.nleft -4)\pxcwide
        'get no of lines in display
        lpd = (r.nbottom - r.ntop -4)\pxchigh
        'GRAPHIC PRINT "cpl=" + STR$(cpl) + ", lpd =" + STR$(lpd)
        ' split text into lines until text or exhausted or > maxlines
        row = 0 : col = 0 :
        pbwd = STRPTR(stext)
        endoftext = STRPTR(stext) + LEN(stext)
        ll(0) = STRPTR(stext)
        '
        DO
            INCR pbwd
            IF pbwd = endoftext THEN EXIT LOOP ' ignore trailing white space in last line
            IF pbwd - ll(row) > cpl THEN ' ran out of line
                IF @pbwd = &H20 THEN
                    WHILE @pbwd = &H20
                        INCR pbwd
                        IF pbwd = endoftext THEN EXIT LOOP
                    WEND
                    IF pbwd = endoftext THEN EXIT LOOP ' ignore trailing white space in last line
                ELSE
                    WHILE @pbwd <> &H20
                        DECR pbwd
                        IF pbwd < ll(row) THEN
                            ' word too long for margins error
                            ll(row) = STRPTR(SERRWTOOLONG)
                            INCR row
                            ll(row) = ll(row-1) + cpl
                        END IF
                    WEND
                    WHILE @pbwd = &H20
                        DECR pbwd 'skip back past whitespace
                        IF pbwd < ll(row) THEN EXIT LOOP
                    WEND
                    IF pbwd < ll(row) THEN EXIT LOOP ' white space at start of line
                    INCR row
                    IF row > %MAXLINES THEN EXIT LOOP
                    INCR pbwd
                    IF pbwd = endoftext THEN EXIT LOOP ' ignore trailing white space in last line
                    ll(row) = pbwd
                    DECR pbwd
                    'exit loop
                    IF row > %MAXLINES THEN EXIT LOOP
                END IF
            END IF
            IF pbwd > endoftext THEN
                EXIT LOOP
            END IF
        LOOP
        ll(row+1) = pbwd + 1 ' set limiting size into pointer array
        ' display lines in text box
        FOR row = 0 TO lpd -1
            IF ll(row + 1) = 0 THEN EXIT FOR
            pbwd = ll(row)
            lline = ll(row +1) - pbwd
            s = STRING$(cpl, 0)
            copymemory(STRPTR(s), pbwd, lline)
            GRAPHIC SET POS ( r.nleft + 2 , r.ntop + 2 + (row * pxchigh))
            REPLACE $NUL WITH $SPC IN s
            GRAPHIC PRINT s
        NEXT
    
        GRAPHIC WAITKEY$ TO skey
        SELECT CASE skey
            CASE "W"
                r.nright = r.nright + 20
                IF r.nright > 350 THEN r.nright = 350
                GOTO again
            CASE "H"
                r.nbottom = r.nbottom + 20
                IF r.nbottom > 300 THEN r.nbottom = 300
                GOTO again
            CASE $ESC
                FUNCTION = MAK(QUAD,MAK(DWORD,&H1B,0),0)
            CASE ELSE
                GOTO again
        END SELECT
    END FUNCTION
    
    
    
    FUNCTION PBMAIN () AS LONG
        LOCAL hGW AS DWORD
        LOCAL qrect AS QUAD
        LOCAL qtc AS QUAD
        LOCAL s AS STRING
    
    
        GRAPHIC WINDOW "", 100, 100, 400, 400 TO hGW
        GRAPHIC ATTACH hGW, 0
        s = "Titiro e Kawana--a whakarongo mai hoki. Ko te wahi e nohoia na e koe, ko " + _
            "te wahi tena i noho ai to matou tupuna a Hinemoa, i tona Kauanga mai. " + _
            "Kia kauwhautia atu iana, e ahau, ki a koe. Na, ko Rangiuru, te matua " + _
            "wahine o Tutanekai, ko Whakaue-Kaipapa tana tane tupu; he tane tahae a " + _
            "Tuwharetoa. Ko ana tamariki matamua tokotoru, ko o ratou ingoa, ko " + _
            "Tawakeheimoa, ko Ngararanui, ko Tuteaiti; muri iho o te tokotoru, ka " + _
            "moea tahaetia a Rangiuru e Tuwharetoa. I haere manuhiri mai a " + _
            "Tuwharetoa, nana a Tutanekai, he poriro ia, otira i moea ano e Whakaue a " + _
            "Rangiuru; ka hapu ano, he tamaiti, ko Kopako tona ingoa; ka hapu ano " + _
            "hoki ia i muri iho i a Kopako, he tamahine, Ko Tupa tona ingoa, ko te " + _
            "whakapakanga ia o nga tamariki a Whakaue."
        GRAPHIC SET POS ( 20, 320)
        GRAPHIC PRINT "W to grow width, H to grow height ESC to exit"
        qrect = MAK(QUAD,MAK(DWORD,20,20),MAK(DWORD,200,200))
        qtc = dotext ( hGW, s, qrect, $ESC + $NUL)
    
    END FUNCTION

  • #2
    now with mouse control!

    This compiles ONLY with PBCC V5

    Subclassed the GRAPHIC WINDOW as suggested elsewhere by Rick Angell and shown by Guy Dombrowski.

    Code:
    ' a stab at a Read Only Text box using PBCC GRAPHIC WINDOW
    ' V 0.2 - subclassing the graphic window for mouse control
    '
    ' Chris Holbrook Oct 2008
    '
    #COMPILE EXE
    #DIM ALL
    
    #INCLUDE "WIN32API.INC"
    %TRUE = 1
    %FALSE = 0
    %KEY_LEFT    = 19200
    %KEY_RIGHT   = 19712
    %KEY_HOME    = 18776
    %KEY_END     = 20224
    %KEY_DEL     = 21248
    %KEY_UP      = 18432
    %KEY_DOWN    = 20480
    %KEY_BSP     = 8
    %KEY_ESC     = 27
    GLOBAL GrDialogProc AS LONG
    GLOBAL GrStaticProc AS LONG
    GLOBAL gMouseX AS LONG,gMouseY AS LONG    ' Mouse x and y
    GLOBAL gLbDOWN AS LONG,gRBDOWN AS LONG    ' Left and right mouse button
    GLOBAL gMouseMoved AS LONG               ' Detect mouse movements
    '--------------------------------------------------------------------------------
    FUNCTION GrDlgProc(BYVAL hWnd AS DWORD, BYVAL wMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG
     FUNCTION = CallWindowProc(GrDialogProc, hWnd, wMsg, wParam, lParam)
    END FUNCTION
    '--------------------------------------------------------------------------------
    FUNCTION GrProc(BYVAL hWnd AS DWORD, BYVAL wMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG
      LOCAL p AS pointapi
      SELECT CASE wMsg
        CASE %WM_MOUSEMOVE
            gMouseMoved = %TRUE
            gMouseX = LO(WORD,lParam)
            gMouseY = HI(WORD,lParam)         ' Current Mouse X and Y Position in the graphic window
        CASE %WM_LBUTTONDOWN
            gLBDOWN = 1
            EXIT FUNCTION                      ' Left button pressed
        CASE %WM_RBUTTONDOWN
            gRBDOWN = 1
            EXIT FUNCTION                      ' Right button pressed
      END SELECT
     FUNCTION = CallWindowProc(GrStaticProc, hWnd, wMsg, wParam, lParam)
    
    END FUNCTION
    '--------------------------------------------------------------------
    ' text display
    %MAXLINES = 99
    FUNCTION dotext ( hGW AS DWORD, stext AS STRING, rct AS QUAD, term AS STRING) AS QUAD
    
        LOCAL ll() AS BYTE PTR
        LOCAL cpl, lpd, lline, endoftext, maxright, maxbottom, pxcwide, pxchigh, row, col AS LONG
        LOCAL pbwd AS BYTE PTR
        DIM ll(0 TO %MAXLINES) AS LOCAL BYTE PTR
        LOCAL r, lastrect AS rect
        LOCAL skey, s AS STRING
        STATIC SERRWTOOLONG AS STRING
        LOCAL movemode, ltc AS LONG
        LOCAL pw AS WORD PTR
    
        SERRWTOOLONG = "<word too long>"
        ' extract bounding rect from parameter
        r.nleft   = LO(WORD, LO(DWORD,rct))
        r.ntop    = HI(WORD, LO(DWORD,rct))
        r.nright  = LO(WORD, HI(DWORD,rct))
        r.nbottom = HI(WORD, HI(DWORD,rct))
        ' set font
        GRAPHIC FONT "Courier New", 10
        'get pixel sizes of characters
        GRAPHIC CHR SIZE TO pxcwide, pxchigh
        lastrect = r
    again:
        REDIM ll(0 TO %MAXLINES) AS LOCAL BYTE PTR
        GRAPHIC BOX ( lastrect.nleft, lastrect.ntop) - (lastrect.nright, lastrect.nbottom),0,%WHITE,%WHITE,0
        GRAPHIC BOX (r.nleft,r.ntop) - (r.nright, r.nbottom), 0,0,%WHITE,0
        'get no of charcters per line
        cpl = (r.nright - r.nleft -4)\pxcwide
        'get no of lines in display
        lpd = (r.nbottom - r.ntop -4)\pxchigh
        'GRAPHIC PRINT "cpl=" + STR$(cpl) + ", lpd =" + STR$(lpd)
        ' split text into lines until text or exhausted or > maxlines
        row = 0 : col = 0 :
        pbwd = STRPTR(stext)
        endoftext = STRPTR(stext) + LEN(stext)
        ll(0) = STRPTR(stext)
        '
        DO
            INCR pbwd
            IF pbwd = endoftext THEN EXIT LOOP ' ignore trailing white space in last line
            IF pbwd - ll(row) > cpl THEN ' ran out of line
                IF @pbwd = &H20 THEN
                    WHILE @pbwd = &H20
                        INCR pbwd
                        IF pbwd = endoftext THEN EXIT LOOP
                    WEND
                    IF pbwd = endoftext THEN EXIT LOOP ' ignore trailing white space in last line
                ELSE
                    WHILE @pbwd <> &H20
                        DECR pbwd
                        IF pbwd < ll(row) THEN
                            ' word too long for margins error
                            ll(row) = STRPTR(SERRWTOOLONG)
                            INCR row
                            ll(row) = ll(row-1) + cpl + 1
                        END IF
                    WEND
                    WHILE @pbwd = &H20
                        DECR pbwd 'skip back past whitespace
                        IF pbwd < ll(row) THEN EXIT LOOP
                    WEND
                    IF pbwd < ll(row) THEN EXIT LOOP ' white space at start of line
                    INCR row
                    IF row > %MAXLINES THEN EXIT LOOP
                    INCR pbwd
                    IF pbwd = endoftext THEN EXIT LOOP ' ignore trailing white space in last line
                    ll(row) = pbwd + 1
                    DECR pbwd
                    'exit loop
                    'IF row > %MAXLINES THEN EXIT LOOP
                END IF
            END IF
            IF pbwd > endoftext THEN
                EXIT LOOP
            END IF
        LOOP
        ll(row+1) = pbwd + 1 ' set limiting size into pointer array
        ' display lines in text box
        FOR row = 0 TO lpd -1
            IF ll(row + 1) = 0 THEN EXIT FOR
            pbwd = ll(row)
            lline = ll(row +1) - pbwd
            s = STRING$(cpl, 0)
            copymemory(STRPTR(s), pbwd, lline)
            GRAPHIC SET POS ( r.nleft + 2 , r.ntop + 2 + (row * pxchigh))
            REPLACE $NUL WITH $SPC IN s
            GRAPHIC PRINT s
        NEXT
    
        maxright  = 375
        maxbottom = 315
        skey = ""
        lastrect = r ' save box rectangle in case it is changed
        DO
            WHILE skey = ""
                GRAPHIC INKEY$ TO skey
                IF skey = "" THEN
                    SLEEP 0
                    IF gLBDOWN THEN
                        movemode = %TRUE
                        gLBdown = 0
                    END IF
                    IF movemode THEN
                        IF gLBDOWN = %FALSE THEN ' moveto event has occurred
                            movemode = %FALSE
                            r.nright = gMouseX
                            r.nbottom = gMouseY
                            GOTO again
                        END IF
                    END IF
                END IF
            WEND
            SELECT CASE LEN(skey)
                CASE 1 : lTC = ASC(skey)
                CASE 2 : pw = STRPTR(skey): lTC = @pw
                CASE 4 : ' unexpected mouse response
            END SELECT
            CONSOLE NAME STR$(ltc)
            SELECT CASE AS LONG lTC
                CASE %KEY_RIGHT
                    r.nright = r.nright + pxcwide
                    IF r.nright > maxright THEN r.nright = maxright
                    GOTO again
                CASE %KEY_DOWN
                    r.nbottom = r.nbottom + pxchigh
                    IF r.nbottom > maxbottom THEN r.nbottom = maxbottom
                    GOTO again
                CASE %KEY_ESC
                    FUNCTION = MAK(QUAD,MAK(DWORD,&H1B,0),0)
                    EXIT FUNCTION
                CASE ELSE
                    GOTO again
            END SELECT
        LOOP
    END FUNCTION
    
    
    
    FUNCTION PBMAIN () AS LONG
        LOCAL hGW AS DWORD
        LOCAL qrect AS QUAD
        LOCAL qtc AS QUAD
        LOCAL s AS STRING
        LOCAL hstatic AS DWORD
    
        GRAPHIC WINDOW "", 100, 100, 400, 400 TO hGW
        hStatic = GetWindow(hGW, %GW_CHILD)                       ' Retrieve static handle of graphic window
        GrStaticProc = SetWindowLong(hStatic, %GWL_WNDPROC, CODEPTR(GrProc)) ' Subclasses Graphic control
        GRAPHIC ATTACH hGW, 0
        GRAPHIC COLOR %BLACK, %WHITE
        GRAPHIC CLEAR %WHITE, 4
        s = "Titiro e Kawana--a whakarongo mai hoki. Ko te wahi e nohoia na e koe, ko " + _
            "te wahi tena i noho ai to matou tupuna a Hinemoa, i tona Kauanga mai. " + _
            "Kia kauwhautia atu iana, e ahau, ki a koe. Na, ko Rangiuru, te matua " + _
            "wahine o Tutanekai, ko Whakaue-Kaipapa tana tane tupu; he tane tahae a " + _
            "Tuwharetoa. Ko ana tamariki matamua tokotoru, ko o ratou ingoa, ko " + _
            "Tawakeheimoa, ko Ngararanui, ko Tuteaiti; muri iho o te tokotoru, ka " + _
            "moea tahaetia a Rangiuru e Tuwharetoa. I haere manuhiri mai a " + _
            "Tuwharetoa, nana a Tutanekai, he poriro ia, otira i moea ano e Whakaue a " + _
            "Rangiuru; ka hapu ano, he tamaiti, ko Kopako tona ingoa; ka hapu ano " + _
            "hoki ia i muri iho i a Kopako, he tamahine, Ko Tupa tona ingoa, ko te " + _
            "whakapakanga ia o nga tamariki a Whakaue."
        GRAPHIC SET POS ( 20, 360)
        GRAPHIC PRINT "Left-click to plant the bottom right corner of the text, ESC to exit"
        qrect = MAK(QUAD,MAK(DWORD,20,20),MAK(DWORD,200,200))
        qtc = dotext ( hGW, s, qrect, $ESC + $NUL)
    
    END FUNCTION

    Comment


    • #3
      SELECT CASE wMsg
      CASE %WM_MOUSEMOVE
      gMouseMoved = %TRUE
      gMouseX = LO(WORD,lParam)
      gMouseY = HI(WORD,lParam)
      Why bother setting a GLOBAL variable to record the mouse position?

      A, you can get multiple WM_MOUSEMOVE messages without anything else happening
      B, you can always get the mouse position when needed with GetCursorPos() function.

      I can't find it, but I am almost positive you can get the state of the mouse button (up/down) when needed with some function.... meaning you would not need the subclassing for anything.
      Michael Mattias
      Tal Systems (retired)
      Port Washington WI USA
      [email protected]
      http://www.talsystems.com

      Comment


      • #4
        Originally posted by Michael Mattias View Post
        Why bother setting a GLOBAL variable to record the mouse position?
        ...because I just more or less cut & pasted Guys' code, aiming to de-globalise it later. Yes, I know about GetCursorPos but I'm not so sure about the other mouse stuff, and if subclassing is included anyway, there is little point in changing it. Pending, of course, PowerBasic's implementation of the GRAPHIC WINDOW mouse stuff which they have been asked for.

        Comment


        • #5
          Pending, of course, PowerBasic's implementation of the GRAPHIC WINDOW mouse stuff which they have been asked for
          Today's "Good Health" tip: Do not hold your breath. 5x/9x has only been out a month or two.

          Real Men don't wait for new features, they grab the bull by the horns. (or just use a read-only edit contol).
          Michael Mattias
          Tal Systems (retired)
          Port Washington WI USA
          [email protected]
          http://www.talsystems.com

          Comment


          • #6
            Originally posted by Michael Mattias View Post
            Real Men don't wait for new features
            How did you know that I am Real Man (androgynous names alert)

            Comment

            Working...
            X