home *** CD-ROM | disk | FTP | other *** search
/ Microsoft DirectX SDK 7.0 / Dx7.bin / DXF / samples / multimedia / vbsamples / d3drm / src / plotgraph / scattergraph.ctl < prev   
Encoding:
Text File  |  1999-08-10  |  16.3 KB  |  641 lines

  1. VERSION 5.00
  2. Object = "{08216199-47EA-11D3-9479-00AA006C473C}#2.1#0"; "RMControl.ocx"
  3. Begin VB.UserControl XYZGraph 
  4.    ClientHeight    =   4215
  5.    ClientLeft      =   0
  6.    ClientTop       =   0
  7.    ClientWidth     =   5535
  8.    ScaleHeight     =   281
  9.    ScaleMode       =   3  'Pixel
  10.    ScaleWidth      =   369
  11.    Begin VB.TextBox Text1 
  12.       Appearance      =   0  'Flat
  13.       Height          =   375
  14.       Left            =   0
  15.       TabIndex        =   0
  16.       Top             =   0
  17.       Visible         =   0   'False
  18.       Width           =   4335
  19.    End
  20.    Begin RMControl7.RMCanvas RMCanvas1 
  21.       Height          =   3495
  22.       Left            =   0
  23.       TabIndex        =   1
  24.       Top             =   0
  25.       Width           =   5055
  26.       _ExtentX        =   8916
  27.       _ExtentY        =   6165
  28.    End
  29.    Begin VB.Menu MENU_POP 
  30.       Caption         =   "Pop Up"
  31.       Begin VB.Menu MENU_PERSPECTIVE 
  32.          Caption         =   "Perspective"
  33.       End
  34.       Begin VB.Menu MENU_ORTHO 
  35.          Caption         =   "Orthographic"
  36.       End
  37.       Begin VB.Menu MENU_RANGE 
  38.          Caption         =   "Set Range"
  39.       End
  40.    End
  41. End
  42. Attribute VB_Name = "XYZGraph"
  43. Attribute VB_GlobalNameSpace = False
  44. Attribute VB_Creatable = True
  45. Attribute VB_PredeclaredId = False
  46. Attribute VB_Exposed = True
  47. ' XYZ Scatter Graph
  48. '
  49.  
  50. Option Explicit
  51.  
  52. Private Type pointdata
  53.     X As Single
  54.     Y As Single
  55.     z As Single
  56. End Type
  57.  
  58. Dim m_id As Long
  59.  
  60. Dim m_root As Direct3DRMFrame3
  61. Dim m_pivot As Direct3DRMFrame3
  62. Dim m_pointFrame() As Direct3DRMFrame3
  63. Dim m_pointMesh() As Direct3DRMMeshBuilder3
  64.  
  65. Dim m_maxZ As Single
  66. Dim m_minZ As Single
  67. Dim m_spreadZ As Single
  68. Dim m_labelZ As String
  69.  
  70. Dim m_maxX As Single
  71. Dim m_minX As Single
  72. Dim m_spreadX As Single
  73. Dim m_labelX As String
  74.  
  75. Dim m_minY As Single
  76. Dim m_maxY As Single
  77. Dim m_spreadY As Single
  78. Dim m_labelY As String
  79.  
  80. Dim m_bMouseDown As Boolean
  81. Dim m_binit As Boolean
  82. Dim m_range As Range
  83. Dim m_path As String
  84.  
  85. Dim d3drm As Direct3DRM3
  86. Dim scene As Direct3DRMFrame3
  87. Dim m_nPoints As Long
  88. Dim m_nMaxPoints As Long
  89. Dim m_nRows As Long
  90. Dim m_Points() As pointdata
  91. Dim m_bInitFromCells As Boolean
  92.  
  93.  
  94. Public Function ClearPoints()
  95.     m_nPoints = 0
  96.     m_nMaxPoints = 100
  97.     ReDim m_Points(m_nMaxPoints)
  98. End Function
  99.  
  100. Public Function AddPoint(X As Single, Y As Single, z As Single)
  101.     m_nPoints = m_nPoints + 1
  102.     m_Points(m_nPoints).X = X
  103.     m_Points(m_nPoints).Y = Y
  104.     m_Points(m_nPoints).z = z
  105.     
  106.     If m_nPoints >= m_nMaxPoints Then
  107.         m_nMaxPoints = m_nMaxPoints + 100
  108.         ReDim Preserve m_Points(m_nMaxPoints)
  109.     End If
  110. End Function
  111.  
  112.  
  113. Public Function GraphPoints() As Boolean
  114.     Set m_range = Nothing
  115.     m_binit = False
  116.  
  117.     dim dx7 as new Directx7
  118.     if dx7.Systembpp <= 8 then
  119.         MsgBox "This control designed to run on high color displays"
  120.     exit function
  121.     end if
  122.     
  123.     DestroyOld
  124.     
  125.     Start3D
  126.         
  127.     AllocateMemory
  128.     CreatePoints
  129.     UpdatePointDataFromPoints
  130.     CreateBackDrop
  131.     
  132.     m_binit = True
  133.     m_bInitFromCells = False
  134.     
  135.     Render
  136. End Function
  137.  
  138. Public Sub GraphCells(r As Range)
  139.         Dim i As Integer
  140.         
  141.         m_binit = False
  142.  
  143.         dim dx7 as new Directx7
  144.     if dx7.Systembpp <= 8 then
  145.             MsgBox "This control designed to run on high color displays"
  146.         exit sub
  147.     end if
  148.  
  149.  
  150.         ClearPoints
  151.         Set m_range = r
  152.         m_nRows = r.Rows.Count
  153.         
  154.         DestroyOld
  155.         
  156.         Start3D
  157.  
  158.         m_labelX = m_range.Cells(1, 1)
  159.         m_labelY = m_range.Cells(1, 2)
  160.         m_labelZ = m_range.Cells(1, 3)
  161.         
  162.  
  163.         For i = 2 To m_nRows
  164.             AddPoint CSng(m_range.Cells(i, 1)), CSng(m_range.Cells(i, 2)), CSng(m_range.Cells(i, 3))
  165.         Next
  166.                 
  167.           
  168.         AllocateMemory
  169.         CreatePoints
  170.         UpdatePointDataFromPoints
  171.         CreateBackDrop
  172.     
  173.         m_binit = True
  174.         m_bInitFromCells = True
  175.         Render
  176. End Sub
  177.  
  178.  
  179. Private Sub CreatePoints()
  180.     Dim i As Integer
  181.     For i = 1 To m_nPoints
  182.         Set m_pointFrame(i) = d3drm.CreateFrame(m_root)
  183.         Set m_pointMesh(i) = RMCanvas1.CreateBoxMesh(1, 1, 1)
  184.                     
  185.         m_pointMesh(i).ScaleMesh 0.05, 0.05, 0.05
  186.         m_pointMesh(i).SetColorRGB 0, 1, 0
  187.         m_pointFrame(i).AddVisual m_pointMesh(i)
  188.         
  189.     Next
  190. End Sub
  191.  
  192.  
  193.  
  194. Private Sub UpdatePointDataFromCells()
  195.         Dim i As Integer
  196.         
  197.         Dim X As Single
  198.         Dim Y As Single
  199.         Dim z As Single
  200.         Dim minN As Single
  201.         Dim maxN As Single
  202.         minN = -Exp(10)
  203.         maxN = Exp(10)
  204.         m_maxX = minN
  205.         m_maxY = minN
  206.         m_maxZ = minN
  207.         m_minX = maxN
  208.         m_minY = maxN
  209.         m_minZ = maxN
  210.         
  211.         For i = 1 To m_nPoints
  212.         
  213.             If m_minX > m_range.Cells(i, 1) Then m_minX = m_range.Cells(i, 1)
  214.             If m_minY > m_range.Cells(i, 2) Then m_minY = m_range.Cells(i, 2)
  215.             If m_minZ > m_range.Cells(i, 3) Then m_minZ = m_range.Cells(i, 3)
  216.             
  217.             If m_maxX < m_range.Cells(i, 1) Then m_maxX = m_range.Cells(i, 1)
  218.             If m_maxY < m_range.Cells(i, 2) Then m_maxY = m_range.Cells(i, 2)
  219.             If m_maxZ < m_range.Cells(i, 3) Then m_maxZ = m_range.Cells(i, 3)
  220.                         
  221.         Next
  222.         
  223.         m_spreadX = m_maxX - m_minX
  224.         m_spreadY = m_maxY - m_minY
  225.         m_spreadZ = m_maxZ - m_minZ
  226.         
  227.         For i = 1 To m_nPoints
  228.             X = (m_maxX - m_range.Cells(i, 1)) / m_spreadX
  229.             Y = (m_maxY - m_range.Cells(i, 2)) / m_spreadY
  230.             z = (m_maxZ - m_range.Cells(i, 3)) / m_spreadZ
  231.             m_pointFrame(i).SetPosition m_root, X - 0.5, Y - 0.5, z - 0.5
  232.             m_pointMesh(i).SetName "point " + Str(i)
  233.             
  234.             Dim mb2 As Direct3DRMMeshBuilder3
  235.             Set mb2 = RMCanvas1.CreateBoxMesh(0.01, Y, 0.01)
  236.             mb2.Translate 0, -Y / 2, 0
  237.             mb2.SetColor &H20001616
  238.             m_pointFrame(i).AddVisual mb2
  239.         Next
  240.         
  241. End Sub
  242.  
  243.  
  244. Private Sub UpdatePointDataFromPoints()
  245.         Dim i As Integer
  246.         
  247.         Dim X As Single
  248.         Dim Y As Single
  249.         Dim z As Single
  250.         Dim minN As Single
  251.         Dim maxN As Single
  252.         minN = -Exp(10)
  253.         maxN = Exp(10)
  254.         m_maxX = minN
  255.         m_maxY = minN
  256.         m_maxZ = minN
  257.         m_minX = maxN
  258.         m_minY = maxN
  259.         m_minZ = maxN
  260.         
  261.         For i = 1 To m_nPoints
  262.         
  263.             If m_minX > m_Points(i).X Then m_minX = m_Points(i).X
  264.             If m_minY > m_Points(i).Y Then m_minY = m_Points(i).Y
  265.             If m_minZ > m_Points(i).z Then m_minZ = m_Points(i).z
  266.             
  267.             If m_maxX < m_Points(i).X Then m_maxX = m_Points(i).X
  268.             If m_maxY < m_Points(i).Y Then m_maxY = m_Points(i).Y
  269.             If m_maxZ < m_Points(i).z Then m_maxZ = m_Points(i).z
  270.                         
  271.         Next
  272.         
  273.         m_spreadX = m_maxX - m_minX
  274.         m_spreadY = m_maxY - m_minY
  275.         m_spreadZ = m_maxZ - m_minZ
  276.  
  277.         
  278.         For i = 1 To m_nPoints
  279.             
  280.             X = (-m_minX + m_Points(i).X) / m_spreadX
  281.             Y = (-m_minY + m_Points(i).Y) / m_spreadY
  282.             z = (-m_minZ + m_Points(i).z) / m_spreadZ
  283.  
  284.             m_pointFrame(i).SetPosition m_root, X - 0.5, Y - 0.5, z - 0.5
  285.             m_pointMesh(i).SetName "point " + Str(i)
  286.             
  287.             Dim mb2 As Direct3DRMMeshBuilder3
  288.             Set mb2 = RMCanvas1.CreateBoxMesh(0.01, Y, 0.01)
  289.             mb2.Translate 0, -Y / 2, 0
  290.             mb2.SetColor &H20001616
  291.             m_pointFrame(i).AddVisual mb2
  292.  
  293.         Next
  294.         
  295.  
  296.         
  297. End Sub
  298.  
  299.  
  300. Private Sub AllocateMemory()
  301.     ReDim Preserve m_pointFrame(m_nPoints)
  302.     ReDim Preserve m_pointMesh(m_nPoints)
  303. End Sub
  304.  
  305.  
  306. Private Sub DestroyOld()
  307.     On Local Error Resume Next
  308.     If Not m_root Is Nothing Then
  309.         Set RMCanvas1.RotateFrame = Nothing
  310.         RMCanvas1.SceneFrame.DeleteChild m_pivot
  311.     End If
  312.  
  313. End Sub
  314.     
  315.     
  316. Private Sub Start3D()
  317.  
  318.  
  319.     RMCanvas1.Visible = True
  320.     
  321.     Dim m As Direct3DRMMeshBuilder3
  322.     
  323.     RMCanvas1.StartWindowed
  324.     Set d3drm = RMCanvas1.d3drm
  325.     Set scene = RMCanvas1.SceneFrame
  326.     scene.SetSceneBackgroundRGB 1, 1, 1
  327.     
  328.     
  329.     RMCanvas1.Device.SetTextureQuality D3DRMTEXTURE_LINEAR
  330.     RMCanvas1.AmbientLight.SetColorRGB 0.2, 0.2, 0.2
  331.         
  332.         
  333.     Set m_pivot = d3drm.CreateFrame(scene)
  334.     Set m_root = d3drm.CreateFrame(m_pivot)
  335.     
  336.         
  337.     m_root.AddScale D3DRMCOMBINE_REPLACE, 5, 5, 5
  338.                 
  339.     
  340.         
  341.     RMCanvas1.DirLightFrame.SetPosition Nothing, 0, -1, -10
  342.     
  343.     RMCanvas1.DirLightFrame.LookAt m_root, Nothing, 0
  344.     
  345.     
  346. End Sub
  347.  
  348. Private Sub CreateBackDrop()
  349.     
  350.     Dim m As Direct3DRMMeshBuilder3
  351.     Dim f As Direct3DRMFace2
  352.     Dim txy As Direct3DRMTexture3
  353.     Dim txz As Direct3DRMTexture3
  354.     Dim tzy As Direct3DRMTexture3
  355.     Dim incx As Single
  356.     Dim incy As Single
  357.     Dim incz As Single
  358.     Dim i As Long
  359.     
  360.     
  361.     'Decide how the units are divided
  362.     
  363.     If m_spreadY > 1 Then
  364.         incy = CInt(m_spreadY / 5)
  365.         If incy = 0 Then incy = 0.5
  366.     Else
  367.         incy = m_maxY / 5
  368.     End If
  369.     
  370.     If m_spreadZ > 1 Then
  371.         incz = CInt(m_spreadZ / 5)
  372.         If incz = 0 Then incz = 0.5
  373.     Else
  374.         incz = m_maxZ / 5
  375.     End If
  376.     
  377.     If m_spreadX > 1 Then
  378.         incx = CInt(m_spreadX / 5)
  379.         If incx = 0 Then incx = 0.5
  380.     Else
  381.         incx = m_maxX / 6
  382.     End If
  383.     
  384.  
  385.     Set m = RMCanvas1.d3drm.CreateMeshBuilder()
  386.         
  387.     Set txy = CreatePanelTexture(m_minY, m_maxY, incy, m_minX, m_maxX, incx, m_labelY, m_labelX)
  388.     Set txz = CreatePanelTexture(m_minZ, m_maxZ, incz, m_minX, m_maxX, incx, m_labelZ, m_labelX)
  389.     Set tzy = CreatePanelTexture(m_minY, m_maxY, incy, m_minZ, m_maxZ, incz, m_labelY, m_labelZ)
  390.     
  391.     
  392.     'Back Face
  393.     Set f = RMCanvas1.d3drm.CreateFace()
  394.     
  395.     f.AddVertex 1, 1, 1:      f.AddVertex 1, -1, 1
  396.     f.AddVertex -1, -1, 1:    f.AddVertex -1, 1, 1
  397.     f.SetTexture txy
  398.     m.AddFace f
  399.     
  400.     'Left face
  401.     Set f = RMCanvas1.d3drm.CreateFace()
  402.     f.AddVertex -1, 1, 1:    f.AddVertex -1, -1, 1
  403.     f.AddVertex -1, -1, -1:  f.AddVertex -1, 1, -1
  404.     f.SetTexture tzy
  405.     m.AddFace f
  406.         
  407.     'Bottom face
  408.     Set f = RMCanvas1.d3drm.CreateFace()
  409.     f.AddVertex 1, -1, 1:    f.AddVertex 1, -1, -1
  410.     f.AddVertex -1, -1, -1:  f.AddVertex -1, -1, 1
  411.     f.SetTexture txz
  412.     m.AddFace f
  413.      
  414.     For i = 0 To 2
  415.         m.SetTextureCoordinates 3 + i * 4, 0, 0
  416.         m.SetTextureCoordinates 2 + i * 4, 0, 1
  417.         m.SetTextureCoordinates 1 + i * 4, 1, 1
  418.         m.SetTextureCoordinates 0 + i * 4, 1, 0
  419.    Next
  420.     
  421.     m.SetQuality D3DRMRENDER_UNLITFLAT
  422.     m.GenerateNormals 0, 0
  423.     m.ScaleMesh 0.5, 0.5, 0.5
  424.     m_root.AddVisual m
  425.     
  426. End Sub
  427.  
  428.  
  429. Private Sub Render()
  430.     RMCanvas1.Device.SetTextureQuality D3DRMTEXTURE_LINEAR
  431.     RMCanvas1.Update
  432. End Sub
  433.  
  434.  
  435. Private Sub MENU_ORTHO_Click()
  436.     If m_binit = False Then Exit Sub
  437.     m_root.AddScale D3DRMCOMBINE_REPLACE, 0.4, 0.4, 0.4
  438.     RMCanvas1.Viewport.SetProjection D3DRMPROJECT_ORTHOGRAPHIC
  439.  
  440. End Sub
  441.  
  442. Private Sub MENU_PERSPECTIVE_Click()
  443.    If m_binit = False Then Exit Sub
  444.    m_root.AddScale D3DRMCOMBINE_REPLACE, 5, 5, 5
  445.    RMCanvas1.Viewport.SetProjection D3DRMPROJECT_PERSPECTIVE
  446.  
  447. End Sub
  448.  
  449. Private Sub MENU_RANGE_Click()
  450.     On Local Error GoTo errOut1
  451.     
  452.     
  453.     
  454.     Dim sRange As String
  455.     Dim r As Range
  456.     Dim l1 As Integer
  457.     Dim l2 As Integer
  458.     Dim wb As Workbook
  459.     Dim ws As Worksheet
  460.     sRange = InputBox("Range:", "Enter Range", "A1:C12")
  461.  
  462.     If sRange = "" Then Exit Sub
  463.     
  464.  
  465.     Set wb = UserControl.Parent
  466.     Set ws = wb.ActiveSheet
  467.     Set r = ws.Range(sRange)
  468.             
  469.     On Local Error GoTo errOut2
  470.         
  471.     m_path = UserControl.Parent.FullName
  472.     l1 = Len(UserControl.Parent.Name)
  473.     l2 = Len(m_path)
  474.     m_path = Mid$(m_path, 1, l2 - l1)
  475.             
  476.     GraphCells r
  477.     
  478.     
  479.     Exit Sub
  480. errOut1:
  481.     MsgBox "Cant use Range, not in Excel"
  482.     Exit Sub
  483.     
  484. errOut2:
  485.     MsgBox "Unable to set Range"
  486.     UserControl_Initialize
  487. End Sub
  488.  
  489. Private Sub RMCanvas1_KeyDown(keyCode As Integer, Shift As Integer)
  490.     Set RMCanvas1.RotateFrame = m_root
  491.     If keyCode = 39 Then
  492.         m_root.AddRotation D3DRMCOMBINE_BEFORE, 0, 1, 0, -3.14 / 32
  493.     ElseIf keyCode = 37 Then
  494.         m_root.AddRotation D3DRMCOMBINE_BEFORE, 0, 1, 0, 3.14 / 32
  495.     ElseIf keyCode = 40 Then
  496.         RMCanvas1.RotateFromXY 0, 0, True
  497.         RMCanvas1.RotateFromXY 0, 5, False
  498.     ElseIf keyCode = 38 Then
  499.         RMCanvas1.RotateFromXY 0, 0, True
  500.         RMCanvas1.RotateFromXY 0, -5, False
  501.      End If
  502.     Set RMCanvas1.RotateFrame = Nothing
  503.     
  504.     Render
  505.     
  506. End Sub
  507.  
  508. Private Sub RMCanvas1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  509.     Set RMCanvas1.RotateFrame = m_root
  510.     m_bMouseDown = True
  511.     If Button = 2 Then
  512.         PopupMenu MENU_POP
  513.     End If
  514. End Sub
  515.  
  516. Private Sub RMCanvas1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  517.     Dim mb As Direct3DRMMeshBuilder3
  518.     Dim p As Long
  519.     Dim strName As String
  520.     Set mb = RMCanvas1.PickTopMesh(CLng(X), CLng(Y))
  521.     If mb Is Nothing Then Exit Sub
  522.     strName = mb.GetName()
  523.     If strName = "" Then
  524.         Text1.Visible = False
  525.         Exit Sub
  526.     End If
  527.     
  528.     If InStr(strName, "points") <> 0 Then Exit Sub
  529.     p = Val(Mid$(strName, 7))
  530.     Text1.Visible = True
  531.     With m_Points(p)
  532.         Text1.Text = m_labelX + "=" + Str(.X) + ": " + m_labelY + "=" + Str(.Y) + ": " + m_labelZ + "=" + Str(.z)
  533.     End With
  534.     
  535. End Sub
  536.  
  537. Private Sub RMCanvas1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  538.     Set RMCanvas1.RotateFrame = Nothing
  539.     m_bMouseDown = False
  540.     Text1.Visible = False
  541.     DoEvents
  542. End Sub
  543.  
  544. Private Sub RMCanvas71_KeyDown(keyCode As Integer, Shift As Integer)
  545.  
  546. End Sub
  547.  
  548. Private Sub RMCanvas71_KeyPress(KeyAscii As Integer)
  549.  
  550. End Sub
  551.  
  552. Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  553.     If Button = 2 Then PopupMenu MENU_POP
  554. End Sub
  555.  
  556.  
  557. Private Sub UserControl_Initialize()
  558.     RMCanvas1.Visible = False
  559.     RMCanvas1.UseBackbuffer = False
  560.     ClearPoints
  561.     
  562.     m_labelX = "X"
  563.     m_labelY = "Y"
  564.     m_labelZ = "Z"
  565.     
  566. End Sub
  567.  
  568.  
  569. Private Sub UserControl_Resize()
  570.     RMCanvas1.Width = UserControl.ScaleWidth
  571.     RMCanvas1.Height = UserControl.ScaleHeight
  572. End Sub
  573.  
  574. Private Function CreatePanelTexture(rowmin As Single, rowmax As Single, incr As Single, colmin As Single, colmax As Single, incc As Single, rowtext As String, coltext As String) As Direct3DRMTexture3
  575.     'On Local Error GoTo errOut
  576.     
  577.     Dim dd As DirectDraw4
  578.     Set dd = RMCanvas1.DDraw
  579.     If dd Is Nothing Then Exit Function
  580.     Dim surf As DirectDrawSurface4
  581.     Dim ddsd As DDSURFACEDESC2
  582.     ddsd.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
  583.     ddsd.ddsCaps.lCaps = DDSCAPS_TEXTURE Or DDSCAPS_SYSTEMMEMORY
  584.     ddsd.lWidth = 256
  585.     ddsd.lHeight = 256
  586.     Set surf = dd.CreateSurface(ddsd)
  587.     
  588.     surf.SetForeColor vbBlue
  589.     surf.SetFillColor vbWhite
  590.     surf.DrawBox 0, 0, 256, 256
  591.     
  592.     Dim at As Single
  593.     Dim Y As Single
  594.     Dim X As Single
  595.     
  596.     at = rowmin
  597.     
  598.     Do While at < rowmax
  599.         If rowmax <> rowmin Then
  600.             Y = 256 - 256 * (at - rowmin) / (rowmax - rowmin)
  601.         Else
  602.             Y = 10
  603.         End If
  604.         surf.SetForeColor &H505050
  605.         surf.DrawLine 0, Y, 256, Y
  606.         surf.SetForeColor vbRed
  607.         surf.DrawText 2, Y - 5, Str(at), False
  608.         at = at + incr
  609.     Loop
  610.     at = colmin
  611.     Do While at < colmax
  612.         If colmax <> colmin Then
  613.             X = 256 * (at - colmin) / (colmax - colmin)
  614.         Else
  615.             X = 10
  616.         End If
  617.         surf.SetForeColor &H505000
  618.         surf.DrawLine X, 0, X, 256
  619.         surf.SetForeColor vbBlue
  620.         surf.DrawText X - 2, 15, Str(at), False
  621.         at = at + incc
  622.     Loop
  623.  
  624.     surf.SetForeColor &HFF40&
  625.     surf.DrawText 20, 128, rowtext, False
  626.     surf.DrawText 128, 30, coltext, False
  627.  
  628.     Set CreatePanelTexture = RMCanvas1.d3drm.CreateTextureFromSurface(surf)
  629. errOut:
  630. End Function
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.