⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chart.bas

📁 Powerbasic 对GDI 的操作 很漂亮的代码!
💻 BAS
📖 第 1 页 / 共 4 页
字号:

'/////////////   
    quadObj = gluNewQuadric()
    CALL glBlendFunc(%GL_SRC_ALPHA, %GL_ONE_MINUS_SRC_ALPHA)
    CALL glEnable(%GL_BLEND)
    CALL glEnable(%GL_LINE_SMOOTH)
    CALL gluQuadricNormals(quadObj, %GLU_SMOOTH)
'/////////////

    DIM LightDiffuse(3) AS SINGLE:  ARRAY ASSIGN LightDiffuse()  = 1.0, 1.0, 1.0, 1.0
    DIM LightAmbient(3) AS SINGLE:  ARRAY ASSIGN LightAmbient()  = 0.5, 0.5, 0.5, 1.0
    DIM LightPosition(3) AS SINGLE: ARRAY ASSIGN LightPosition() = -50.0, 50.0, 100.0, 1.0
    CALL glLightfv(%GL_LIGHT1, %GL_DIFFUSE, LightDiffuse(0))     ' Setup The Diffuse Light
    CALL glLightfv(%GL_LIGHT1, %GL_AMBIENT, LightAmbient(0))     ' Setup The Ambient Light
    CALL glLightfv(%GL_LIGHT1, %GL_POSITION,  LightPosition(0))  ' Position The Light
    CALL glEnable(%GL_LIGHT1)                                    ' Enable Light ONE
    CALL glEnable(%GL_LIGHTING)                                  ' Enable Lighting
    CALL glEnable(%GL_COLOR_MATERIAL)                            ' Enable Coloring Of Material
    CALL glColorMaterial(%GL_FRONT, %GL_AMBIENT_AND_DIFFUSE)

    chart.listIndex = 1
    CALL glGenLists(1)
    CALL Axis(15.0, 9.0, 11.0)

    DIM thisChartItem(1 TO chart.chartnumber * chart.chartseries) AS LONG, Value AS SINGLE
    DIM ChartColor(1 TO chart.chartnumber) AS LONG

    'LOCAL dSlice AS DOUBLE, dShift AS DOUBLE
    'dSlice = Pi / chart.chartseries
    k = 0
    FOR i = 1 TO chart.chartnumber

        SELECT CASE LONG i
        CASE 1: ChartColor(i) = ZD_ColorARGB(255, RGB(255, 255, 255))
        CASE 2: ChartColor(i) = ZD_ColorARGB(220, RGB(0, 255, 0))
        CASE 3: ChartColor(i) = ZD_ColorARGB(200, RGB(0, 0, 255))
        CASE 4: ChartColor(i) = ZD_ColorARGB(192, RGB(255, 0, 0))
        END SELECT

        'dShift = i * PiDiv4
        FOR j = 1 TO chart.chartseries 'value.length
            'BarValue(i, j) = 8.0 * ABS(SIN( dSlice * j - dShift))
            Value = rnd(1,8)'8.0 * ABS(SIN( dSlice * j - dShift))

            INCR k: thisChartItem(k) = chart.ListIndex + k
            CALL glNewList(thisChartItem(k), %GL_COMPILE)
                 CALL glRotatef(-90.0, 1.0, 0.0, 0.0)

                 CALL glBindTexture(%GL_TEXTURE_2D, i)
                 CALL gluQuadricNormals(quadObj, %GLU_SMOOTH)  ' Create Smooth Normals
                 CALL gluQuadricTexture(quadObj, 1)     ' Create Texture Coords
                 CALL gluCylinder(quadObj, chart.radius, chart.radius, Value, 32, 1)

                 CALL glBindTexture(%GL_TEXTURE_2D, 6)
                 'CALL gluCylinder(quadObj, chart.radius, chart.radius, Value, 32, 1)
                 CALL gluDisk(quadObj, 0.0, chart.radius, 32, 32)
                 CALL glTranslatef(0.0, 0.0, Value)
                 CALL gluDisk(quadObj, 0.0, chart.radius, 32, 32)
                 CALL glTranslatef(0.0, 0.0, -Value)
                 CALL glRotatef(90.0, 1.0, 0.0, 0.0)'
            CALL glEndList()

        NEXT
    NEXT
END SUB

DECLARE SUB glTexCoord2f LIB "opengl32.dll" ALIAS "glTexCoord2f" (BYVAL s AS SINGLE, BYVAL t AS SINGLE)

SUB Axis(BYVAL x AS SINGLE, BYVAL y AS SINGLE, BYVAL z AS SINGLE)
    LOCAL a AS LONG

    DIM COLOR1(3) AS SINGLE: ARRAY ASSIGN COLOR1() = 0.6, 0.6, 0.6, 0.3
    DIM COLOR2(3) AS SINGLE: ARRAY ASSIGN COLOR2() = 1.0, 1.0, 1.0, 1.0
    DIM COLOR3(3) AS SINGLE: ARRAY ASSIGN COLOR3() = 0.6, 0.0, 0.0, 1.0

    CALL glNewList(chart.listIndex, %GL_COMPILE)

        CALL glBegin(%GL_QUADS)
            CALL glColor4fv(COLOR1(0))
            'CALL glTexCoord2f(0.0, 0.0): 
            CALL glVertex3f(0.0, y, z)
            'CALL glTexCoord2f(1.0, 0.0): 
            CALL glVertex3f(0.0, -1.0, z)
            'CALL glTexCoord2f(1.0, 1.0): 
            CALL glVertex3f(0.0, -1.0, -1.0)
            'CALL glTexCoord2f(0.0, 1.0): 
            CALL glVertex3f(0.0, y, -1.0)

            CALL glVertex3f(-1.0, y, 0.0)
            CALL glVertex3f(-1.0, -1.0, 0.0)
            CALL glVertex3f(x, -1.0, 0.0)
            CALL glVertex3f(x, y, 0.0)
        CALL glEnd()

        CALL glColor4fv(COLOR2(0))
        FOR a = 1 TO y - 1
            CALL glBegin(%GL_LINE_STRIP)
                CALL glVertex3f(0.1, CSNG(a), z)
                CALL glVertex3f(0.1, CSNG(a), 0.1)
                CALL glVertex3f(x, CSNG(a), 0.1)
            CALL glEnd()
        NEXT

        CALL glColor4fv(COLOR3(0))
        CALL glBegin(%GL_LINE_STRIP)
            CALL glVertex3f(0.1, 0.0, z)
            CALL glVertex3f(0.1, 0.0, 0.1)
            CALL glVertex3f(x, 0.0, 0.1)
        CALL glEnd()
        CALL glBegin(%GL_LINES)
            CALL glVertex3f(0.1, -1.0, 0.1)
            CALL glVertex3f(0.1, y, 0.1)
        CALL glEnd()
    CALL glEndList()
END SUB

SUB DrawTheScene(UseFont AS ZGLFONT)
    LOCAL k AS LONG, i AS LONG, j AS LONG
    STATIC TextColor AS LONG

    CALL glClear(%GL_COLOR_BUFFER_BIT OR %GL_DEPTH_BUFFER_BIT)

    CALL glLoadIdentity()

  ' Draw background image -----------------------------------------
    CALL glBindTexture(%GL_TEXTURE_2D, 5)
    CALL glBegin(%GL_QUADS)
       CALL glTexCoord2f(0.0, 0.0): CALL glVertex3f(-25,-25,-60.0) ' Bottom Left Of The Texture And Quad
       CALL glTexCoord2f(1.0, 0.0): CALL glVertex3f( 25,-25,-60.0) ' Bottom Right Of The Texture And Quad
       CALL glTexCoord2f(1.0, 1.0): CALL glVertex3f( 25, 25,-60.0) ' Top Right Of The Texture And Quad
       CALL glTexCoord2f(0.0, 1.0): CALL glVertex3f(-25, 25,-60.0) ' Top Left Of The Texture And Quad
    CALL glEnd()
  ' ----------------------------------------------------------------

    CALL glTranslatef(chart.xoff, chart.yoff, chart.zoff)

    CALL glRotatef(chart.xrot, 1.0, 0.0, 0.0)
    CALL glRotatef(chart.yrot, 0.0, 1.0, 0.0)

  ' Draw the XYZ grid
    CALL glLineWidth(1.0)
    CALL glCallList(chart.ListIndex)

    k = 0
    CALL glTranslatef(chart.radius + 0.5, 0.0, chart.radius + 0.5)
    FOR i = 1 TO chart.chartnumber
      ' Set color for the chart serie
        CALL ZI_glColor4f(ChartColor(i))
        FOR j = 1  TO chart.chartseries
          ' Draw the matching chart item
            INCR k: CALL glCallList(thisChartItem(k))
            CALL glTranslatef(2.0 * chart.radius, 0.0, 0.0)
        NEXT
        CALL glTranslatef(-2.0 * chart.radius * chart.chartseries, 0.0, 2.0 * chart.radius + 0.5)
    NEXT

    IF TextColor = 0 THEN TextColor = ZD_ColorARGB(255, RGB(128,0,0))
    CALL ZI_DrawGLText(glWnd, UseFont, 10, 10 + UseFont.fontHeight * 0, ("Zoom " + STR$(ZI_GetGLzoom(glWnd))), TextColor)

    CALL ZI_UpdateGLWindow(glWnd)
END SUB

FUNCTION WndProc(BYVAL hWin AS LONG, BYVAL Msg AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG) EXPORT AS LONG
    
    LOCAL ps AS PAINTSTRUCT, lp AS POINTAPI, ZoomIs AS LONG, UseFont AS ZGLFONT

    STATIC wasX&, wasY&

    SELECT CASE Msg&

    CASE %WM_ACTIVATE                                ' Watch For Window Activate Message
         IF HIWRD(wParam) = 0 THEN                   ' Check Minimization State
            Active = 1                               ' Program Is Active
         ELSE                                        ' Otherwise
            Active = 0                               ' Program Is No Longer Active
         END IF

    CASE %WM_SIZE
         CALL ZI_ResizeGLWindow(glWnd)
         CALL GlobalFont(UseFont, 0): CALL DrawTheScene(UseFont)

    CASE %WM_COMMAND
         wP& = LOWRD(wParam&)

         SELECT CASE LONG wP&
         CASE %ID_RESET
              CALL InitGraph()
              CALL ZI_SetGLzoom(glWnd, 0): CALL ZI_ResizeGLWindow(glWnd)
              CALL GlobalFont(UseFont, 0): CALL DrawTheScene(UseFont)

         END SELECT
         IF GetFocus <> hWin THEN CALL SetFocus(hWin)

    CASE %WM_KEYDOWN
         SELECT CASE LONG wParam
         CASE %VK_LEFT
              IF ZI_IsCtrlKeyPressed THEN
                 chart.yrot = chart.yrot - 0.5
              ELSE
                 chart.xoff = chart.xoff - 0.05
              END IF
         CASE %VK_RIGHT
              IF ZI_IsCtrlKeyPressed THEN
                 chart.yrot = chart.yrot + 0.5
              ELSE
                 chart.xoff = chart.xoff + 0.05
              END IF
         CASE %VK_UP
              IF ZI_IsCtrlKeyPressed THEN
                 chart.xrot = chart.xrot - 0.5
              ELSE
                 chart.yoff = chart.yoff + 0.05
              END IF
         CASE %VK_DOWN
              IF ZI_IsCtrlKeyPressed THEN
                 chart.xrot = chart.xrot + 0.5
              ELSE
                 chart.yoff = chart.yoff - 0.05
              END IF
         CASE %VK_PGUP
              chart.zoff = chart.zoff + 0.05
         CASE %VK_PGDN
              chart.zoff = chart.zoff - 0.05
         END SELECT
         FUNCTION = 0: EXIT FUNCTION

    CASE %WM_PAINT
         CALL GradientPaint(hWin&, RGB(228,227,227), RGB(168,167,191))
         FUNCTION = 0: EXIT FUNCTION
    CASE %WM_DESTROY
         CALL PostQuitMessage(0)
         FUNCTION = 0: EXIT FUNCTION
    END SELECT
    FUNCTION = DefWindowProc(hWin&, Msg&, wParam&, lParam&)
END FUNCTION

SUB GradientPaint(BYVAL hWin&, BYVAL TopRGB&, BYVAL BottomRGB&)
    LOCAL ps AS PAINTSTRUCT
    LOCAL rc AS RECT
  ' Tile the background
    CALL GetClientRect (hWin&, rc)
    hDC& = BeginPaint(hWin&, ps)
    CALL ZI_GradientPaintDC(hDC&, 0, 0, rc.nRight, rc.nBottom, TopRGB&, BottomRGB&)
    CALL EndPaint(hWin&, ps)
END SUB

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -