Announcement

Collapse
No announcement yet.

Graphics gurus... simple graph with PBDLL?

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

  • Russ Srole
    replied
    Check out Graphix Toolkit. It makes this stuff pretty easy.

    Russ Srole

    ------------------

    Leave a comment:


  • Wayne Diamond
    replied
    Fwaarrrrrr, thanks! Its a rainy Friday night here in Perth so I'm staying in to play with graphics (for the first time), I'll go through those samples now as soon as I get a bourbon and coke.
    Cheers!

    [3 minutes, 1 bourbon and coke later]
    Borje, strewth - thats virtually an exact copy of my demo, very impressed!! Thankyou so much for that, I find it a lot easier to learn PB when Ive got a direct VB sample to compare it, I'll be cooking with gas now

    Peter, thats also very cool - I love the scrolling grid behind the graph line, very nice

    Have a good night!


    [This message has been edited by Wayne Diamond (edited August 03, 2001).]

    Leave a comment:


  • Borje Hagsten
    replied
    Best teacher is many samples. Here is PB version of asked VB code:
    Code:
    #COMPILE EXE
    #INCLUDE "WIN32API.INC"
     
    %ID_IMAGE1 = %WM_USER + 10
    %ID_TIMER  = %WM_USER + 20
    %INTERVAL  = 200
     
    GLOBAL ihWnd AS LONG
    GLOBAL GraphValue() AS LONG
     
    DECLARE CALLBACK FUNCTION DlgCallback()
     
    '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    ' Main entance
    '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    FUNCTION PBMAIN
      LOCAL hDlg AS LONG
      DIALOG NEW 0, "Draw demo",,, 204, 58, %WS_CAPTION OR %WS_SYSMENU TO hDlg
     
      CONTROL ADD BUTTON,   hDlg, %IDCANCEL, "E&xit",  150, 40, 50, 14
      CONTROL ADD LABEL, hDlg, %ID_IMAGE1, "", 4, 4, 140, 50,, %WS_EX_CLIENTEDGE
      CONTROL HANDLE hDlg, %ID_IMAGE1 TO ihWnd
     
      DIALOG SHOW MODAL hDlg CALL DlgCallback
    END FUNCTION
     
    '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    ' Main dialog's callback procedure
    '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    CALLBACK FUNCTION DlgCallback()
      SELECT CASE CBMSG
        CASE %WM_INITDIALOG
           LOCAL I AS LONG, rc AS RECT, hPen AS LONG, hBrush AS LONG, hBrushOld AS LONG
           LOCAL hDC AS LONG, memDC AS LONG, hBit AS LONG
           STATIC hTimer AS LONG : REDIM GraphValue(100)
     
           hTimer = SetTimer(CBHNDL, %ID_TIMER, %INTERVAL, 0) 'create timer
     
        CASE %WM_DESTROY
           IF hTimer THEN KillTimer CBHNDL, hTimer      'destroy timer
     
         CASE %WM_TIMER
            IF CBWPARAM = %ID_TIMER THEN
               GetClientRect ihWnd, rc             'draw area
               hDC = GetDC(ihWnd)                  'get label's device context
               memDC = CreateCompatibleDC(hDC)     'create compatible memDC for smoother action
               hbit  = CreateCompatibleBitmap(hDC, rc.nRight, rc.nBottom) 'and bitmap
               hbit = SelectObject(memDC, hbit)    'select bitmap into DC
     
               'CLS
               hBrush    = GetSysColorBrush(%COLOR_WINDOW) 'this is the background color
               hBrushOld = SelectObject(memDC, hBrush)     'select new brush into DC, old is returned
               FillRect memDC, rc, hBrush                  'paint background
               SelectObject memDC, OldhBrush               'select old brush back into memDC
     
               'Move all values down 1 (visually all pixels move left 1)
               For I = 2 To 100
                  GraphValue(I - 1) = GraphValue(I)
               Next I
               Randomize
               GraphValue(100) = CLNG(Rnd * 70)
     
               'PICTURE1.LINE
               hPen = CreatePen(%PS_SOLID, 1, RGB(0,127,0))   'create green pen to draw with
               hPen = SelectObject(memDC, hPen)               'select it into memDC
               For I = 2 To 100
                  MoveTo memDC, I - 1, 70 - GraphValue(I - 1) 'move into position
                  LineTo memDC, I, 70 - GraphValue(I)         'draw line to..
               Next I
               DeleteObject SelectObject(memDC, hPen)         'select old pen backl, delete new
     
               BitBlt hDC, 0, 0, rc.nRight, rc.nBottom, memDC, 0, 0, %SRCCOPY 'copy all to label
     
               DeleteObject SelectObject(memDC, hbit)          'clean up to avoid memory leaks
               DeleteDC memDC
               ReleaseDC ihWnd, hDC
            END IF
     
         CASE %WM_COMMAND : IF CBCTL = %IDCANCEL THEN DIALOG END CBHNDL
     
      END SELECT
     
    END FUNCTION
    ------------------
    Okay, Windows GDI is easy to make mistakes with. Added hBrushOld to
    WM_TIMER event, so proper brush is used and selected back into memDC..


    [This message has been edited by Borje Hagsten (edited August 03, 2001).]

    Leave a comment:


  • Peter Lameijn
    replied
    Simple but nice example... (translation of VB a VB example)
    Code:
    #Compile Exe
    #Include "win32api.inc
    
    %IMAGEBOX    = %WM_USER + 1024
    %TIMERID1    = %WM_USER + 1025
    %PWIDTH      = 250
    %PHEIGHT     = 150
    %PGRID       = 25
    %TINTERVAL   = 100
    
    Global Counter As Long, OldY As Long, hDCh As Long, hDC As Long, hPenB As Long, hPenC As Long
    Global hDlg As Long, hTimer As Long, hImg As Long, NewY As Long, hPenBg As Long
    
    CallBack Function CbMain () As Long
      Local lRet As Long, lCnt As Long
      Local ps As PAINTSTRUCT
      Static hMapBmp As Long, hMapBmpOld As Long, hMemDC As Long, _
             hPenOld As Long, rectA As RECT, rectD As RECT
    
      Select Case CbMsg
        Case %WM_INITDIALOG
          hPenB  = CreatePen(%PS_SOLID, 0, Rgb(250,250,  0))
          hPenC  = CreatePen(%PS_SOLID, 0, Rgb(200,  0,  0))
          hPenBg = CreatePen(%PS_SOLID, 0, Rgb(  0,  0,  0))
          rectA.nTop = 0 : rectA.nLeft = 0 : rectA.nRight = %PWIDTH : rectA.nBottom = %PHEIGHT
          hDC = GetDC(%HWND_DESKTOP)
          hMemDC = CreateCompatibleDC (hDC)
          hMapBmp = CreateCompatibleBitmap (hDC, %PWIDTH, %PHEIGHT )
          hMapBmpOld = SelectObject( hMemDC, hMapBmp )
          Call ReleaseDC(%HWND_DESKTOP, hDC)
          hPenOld = SelectObject( hMemDC, hPenB )
          PatBlt hMemDC, 0, 0, %PWIDTH, %PHEIGHT, %WHITENESS
          rectD.nTop = 5 : rectD.nLeft = 5
          MapDialogRect hdlg, rectD
          rectD.nTop  = rectD.nTop  + 3
          rectD.nLeft = rectD.nLeft + 3
    
        Case %WM_TIMER
          ScrollDC hMemDC, -1, 0, rectA, rectA, ByVal %NULL, ByVal %NULL
          OldY = Sin(0.15*Counter)*(%PHEIGHT\2 -1)+%PHEIGHT\2
          Incr Counter
          NewY = Sin(0.15*Counter)*(%PHEIGHT\2 -1)+%PHEIGHT\2
          If Counter Mod %PGRID = 0 Then
            SelectObject hMemDC, hPenC
          Else
            SelectObject hMemDC, hPenBg
          End If
          MoveToex hMemDC, %PWIDTH-3, 2, ByVal 0
          LineTo   hMemDC, %PWIDTH-3, 150
          For lCnt = %PGRID To %PGRID * (%PHEIGHT \ %PGRID) Step %PGRID
            SetPixel hMemDC, %PWIDTH-3, lCnt, Rgb(200,0,0)
          Next
          SelectObject hMemDC, hPenB
          MoveToEx hMemDC, %PWIDTH-3, OldY, ByVal 0
          LineTo   hMemDC, %PWIDTH-3, NewY
          InvalidateRect hDlg, ByVal 0, 0
    
        Case %WM_PAINT
          hDc = BeginPaint(hDlg, Ps)
          lRet = BitBlt (hDC, rectD.nLeft, rectD.nTop, %PWIDTH, %PHEIGHT, hMemDC, 0, 0, %SRCCOPY)
          EndPaint hDlg, ps
    
        Case %WM_DESTROY
          SelectObject hMemDC, hPenOld
          SelectObject hMemDC, hMapBmpOld
          DeleteObject hMapBmp
          DeleteDC hMemDC
          DeleteObject hPenB
          DeleteObject hPenC
          DeleteObject hPenBg
      End Select
    End Function
    
    Function PbMain () As Long
      Local lRet As Long
      Dialog New 0, "Dynamically scrolling graph",,,182,120, %WS_SYSMENU Or %WS_VISIBLE To hDlg
      hTimer = SetTimer (hDlg,%TIMERID1,10,ByVal %Null)
      Control Add Label, hDlg, %IMAGEBOX,"",5,5,%PWIDTH  * 0.68, %PHEIGHT * 0.64, _
                         %SS_BITMAP Or %SS_BLACKRECT, %WS_EX_CLIENTEDGE
      Control Handle hDlg, %IMAGEBOX To hImg
      Dialog Show Modal hDlg Call CbMain
    End Function
    ------------------
    Peter.
    mailto[email protected][email protected]</A>

    Leave a comment:


  • Jules Marchildon
    replied
    wayne;
    the output looks like my last ecg print out. i'm no graphics guru, but i can point you to this
    article that should start you in the right direction...

    Code:
    'message [url="http://www.powerbasic.com/support/pbforums/showthread.php?t=22937"]http://www.powerbasic.com/support/pbforums/showthread.php?t=22937[/url] 
    'forum:  source code
    'topic:  primitive chart recorder
    'name:   iain johnstone, member
    'date:   february 27, 2001 11:53 am
    
    '-------------------------------------------------------------------------------
    '
    '   chart.bas for pb/dll
    '   iain johnstone.
    '
    '   an experiment to create a chart recorder
    '   sine wave data generated as demo (plus square wave, random noise and fundamental plus octave sine
    wave)
    '   select wave form in drawtrace
    '   all variations and adaptations are up to you!
    '
    '   on switches, click on black dots by numbers
    '   on pen zero, drag black circle around.
    '   let me know if you remove the flicker in drawtrace
    '
    '   it would be interesting to see how big this would be in c or vb.
    '   though i am not suggesting anybody tries!
    '-------------------------------------------------------------------------------
    regards,
    jules

    Leave a comment:


  • Wayne Diamond
    started a topic Graphics gurus... simple graph with PBDLL?

    Graphics gurus... simple graph with PBDLL?

    Ive created a very simple yet effective graph with VB6 that Id like to use in my PB apps, but graphics in PBDLL seem to be so different than in VB6 so I'm getting nowhere
    My graph is very easy to build, just start a new VB project and add just two controls - one picturebox (Autoredraw=True, Forecolor=Green, ScaleMode=Pixels, ScaleWidth=110, ScaleWidth=80), and a Timer.
    Add this code to the project, and press F5 to start. It will show randomly created values, I think it looks kinda neat considering there's not much behind it
    Code:
    Dim GraphValue(100) As Integer  'Can display up to 100 different values
     
    Private Sub Form_Load()
    On Error Resume Next
    For I = 1 To 100
     GraphValue(I) = 0
    Next I
    Timer1.Interval = 200
    End Sub
     
    Private Sub Timer1_Timer()
    Dim NextVal As Integer
    Picture1.Cls
    'Move all values down 1 (visually all pixels move left 1)
    For I = 2 To 100
     GraphValue(I - 1) = GraphValue(I)
    Next I
    Randomize
    GraphValue(100) = CInt(Rnd * 70)  'Picture1 is only 70 pixels high
    For I = 2 To 100
     Picture1.Line (I - 1, 70 - GraphValue(I - 1))-(I, 70 - GraphValue(I))
    Next I
    End Sub
    I want to do this with pure PB code only, no 3rd party DLLs


    ------------------
Working...
X