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

📄 uclayersymbol.ctl

📁 arcengine+vb开发原码
💻 CTL
📖 第 1 页 / 共 4 页
字号:
         Top             =   1320
         Width           =   1095
      End
      Begin VB.PictureBox UpDown1 
         Height          =   375
         Left            =   1920
         ScaleHeight     =   315
         ScaleWidth      =   180
         TabIndex        =   5
         Top             =   720
         Width           =   240
      End
      Begin VB.Label Label6 
         Caption         =   "颜色:"
         Height          =   255
         Left            =   360
         TabIndex        =   7
         Top             =   1440
         Width           =   735
      End
      Begin VB.Label lblSizeCaption 
         Caption         =   "宽度:"
         Height          =   255
         Left            =   360
         TabIndex        =   6
         Top             =   840
         Width           =   615
      End
   End
   Begin VB.Frame Frame2 
      Caption         =   "预览"
      Height          =   2055
      Left            =   5520
      TabIndex        =   0
      Top             =   760
      Width           =   2535
      Begin VB.PictureBox picPreview 
         Appearance      =   0  'Flat
         AutoRedraw      =   -1  'True
         BackColor       =   &H80000005&
         ForeColor       =   &H80000008&
         Height          =   1575
         Left            =   170
         ScaleHeight     =   103
         ScaleMode       =   3  'Pixel
         ScaleWidth      =   145
         TabIndex        =   1
         Top             =   300
         Width           =   2200
      End
   End
   Begin MSComDlg.CommonDialog dlgCommon 
      Left            =   0
      Top             =   0
      _ExtentX        =   847
      _ExtentY        =   847
      _Version        =   393216
   End
End
Attribute VB_Name = "ucLayerSymbol"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

'符号化控件错误
Private Enum errorControl

    ErrirCanntLoadStyleFile = 1                        '不能加载符号库文件
    ErrorNoMatchedSymbol = 2                           '符号库没有与图层匹配的符号(设定了符号几何类型(点、线、面))
    ErrorNoSymbols = 3                                 '符号库没有点、线、面符号(目前只考虑这三种)
    ErrorNoEnoughMemory = 4                            '内存不足
    ErrorNoSelectedSymbol = 5                          '没有选中符号
    ErrorPreview = 6                                   '不能预览符号
    ErrorNoSytleFileSelected = 7                       '“符号库”下拉框没有选择文件
    ErrorSetSymbolClass = 8                            '传入参数错误,只能为“Fill Symbols”、“Line Symbols”、“Marke Symbols”
    ErrorBadStyleFile = 9                              '符号文件已经损坏
    ErrorVisibleSymbolsNum = 10                        '计算可见的符号个数错误(一般为 9 个)
    ErrorLTSymbolID = 11                               '计算可见的第一个(左上角)符号索引错误
    ErrorDisplaySymbol = 12                            '显示符号错误

End Enum

Private m_enumSymbolGeometryType  As esriGeometryType  '符号几何类型(点、线、面)
Private m_pOutputSymbol As ISymbol                     '控件输出的符号
Private m_pInputSymbol As ISymbol                      '控件输入的符号
Private m_pOriginalSymbol As ISymbol                   '保存控件输入的符号
Private m_pStyleGallery As IStyleGallery               '用于访问所有的符号
Private m_bHasFillSymbolInFile As Boolean              '符号库含有面符号
Private m_bHasLineSymbolInFile As Boolean              '符号库含有线符号
Private m_bHasMarkerSymbolInFile As Boolean            '符号库含有点符号
Private m_intTotalSymbolsNum As Integer                '当前符号库文件中的指定符号类型(点、线、面)的符号个数
Private m_pStylePath  As String                        '当前符号库(含文件名,目前默认forestry.serverstyle)
Private m_bControlStart  As Boolean                    '是否控件刚启动
Private m_strSymbolName As String                      '某个符号的名称,预览符号时出错处理显示用,以后删除
Private m_intSymbolID  As Long                         '某个符号的ID,预览符号时出错处理显示用,以后删除
Private m_pSymbolsArray(9) As ISymbol                   '当前可见符号(一般为九个)
Private m_strSymbolNameArray(9) As String              '当前可见符号的名称(一般为九个)
Private m_bChangStyleFile As Boolean                   '重新选择符号库文件
Private m_intLTSymbolID As Integer                     '控件左上角(第一行,第一列)哪个符号的ID
Private m_intCurDisplayingSymbolsNum As Integer        '当前控件上应该显示的符号个数(一般为九个)
Private m_bResetHscrollBar  As Boolean                 '是否需要重新复位垂直滚动条
Private m_intSize As Integer                           '当前选中的符号的线宽(面符号和线符号)或直径(点符号)
Private m_strShapeType As String                       '符号类型
Private m_bHasSelectedOneSymbol As Boolean             '是否选择了符号(预览之前提)
Private m_bLoadFileFromOtherDirectory As Boolean       '不从默认目录下加载符号库文件
Private m_strLineOrPointWidth As String                '顾名思意
Private m_strOutLineSize As String                     '顾名思意

'错误处理
Private Sub CatchErrors(errorType As errorControl)

    Select Case errorType

        Case ErrirCanntLoadStyleFile:

            MsgBox "不能加栽符号库文件"

        Case ErrorNoMatchedSymbol:

            MsgBox "符号库没有你需要的符号。"

        Case ErrorNoSymbols:

            MsgBox "符号库没有面标注符号、线标注符号、点标注符号。"

        Case ErrorNoEnoughMemory:

            MsgBox "内存不足。"

        Case ErrorNoSelectedSymbol:

            MsgBox "没有选中符号。"

        Case ErrorPreview:

            MsgBox "不能预览符号符号。"

        Case ErrorNoSytleFileSelected:

            MsgBox "请在'符号库'下拉框中选则符号库"

        Case ErrorSetSymbolClass:

            MsgBox "符号类型只能为“Fill Symbols”、“Line Symbols”、“Marke Symbols”"

        Case ErrorBadStyleFile:

            MsgBox "符号库文件已经损坏。"

        Case ErrorVisibleSymbolsNum:

            MsgBox "计算当前显示的符号个数作物。"

        Case ErrorLTSymbolID:

            MsgBox "计算符号索引错误。"

        Case ErrorDisplaySymbol:

            MsgBox "显示符号错误(非预览)。"


    End Select

End Sub

'控件属性--图层类型(in)(点、线、面)
Public Property Let GeometryType(intGeometryType As esriGeometryType)

    '初始化几何类型(点、线还是面)
    m_enumSymbolGeometryType = intGeometryType

    '几何类型是否非空
    If Not (intGeometryType = esriGeometryPoint Or intGeometryType = esriGeometryPolyline Or _
            intGeometryType = esriGeometryLine Or intGeometryType = esriGeometryEnvelope Or _
            intGeometryType = esriGeometryEnvelope) Then

        CatchErrors ErrorSetSymbolClass
        Exit Property

    End If

    '更新静态显示界面
    UpdateStaticDisplaying

    '更新动态显示界面
    UpdateDynamicDisplaying

End Property

'控件属性--输入符号(in)
Public Property Let Symbol(pSymbol As ISymbol)

    Set m_pInputSymbol = pSymbol
    Dim pCloneFatherSymbol As IClone
    Set pCloneFatherSymbol = pSymbol
    Set m_pOriginalSymbol = pCloneFatherSymbol.Clone
    If m_pInputSymbol Is Nothing Then Exit Property
    
    cmbGeometryType.Visible = False
    txtInputSymbolType.Visible = True
    lblSymbolType.Left = 600
    If TypeOf m_pInputSymbol Is IFillSymbol Then txtInputSymbolType.Text = "面符号"
    If TypeOf m_pInputSymbol Is ILineSymbol Then txtInputSymbolType.Text = "线符号"
    If TypeOf m_pInputSymbol Is IMarkerSymbol Then txtInputSymbolType.Text = "点符号"
    
End Property

'控件属性--输出符号(out)
Public Property Get Symbol() As ISymbol
    
    Debug.Assert Not (m_pInputSymbol Is Nothing And m_pOutputSymbol Is Nothing)
    If m_pInputSymbol Is Nothing And m_pOutputSymbol Is Nothing Then Exit Sub
    
    If m_pOutputSymbol Is Nothing Then
        Set Symbol = m_pInputSymbol
    Else
        Set Symbol = m_pOutputSymbol
    End If

End Property

Private Sub cmdDefaultValue_Click()
    
    Dim pFatherCloneSymbol As IClone
    Set pFatherCloneSymbol = m_pOriginalSymbol
    Set m_pInputSymbol = pFatherCloneSymbol.Clone
    UserControl_Initialize
    UserControl_Show

End Sub

Private Sub Label5_DragDrop(Source As Control, x As Single, y As Single)

End Sub

'选中符号
Private Sub picShowSymbol_Click(Index As Integer)
    
    m_bHasSelectedOneSymbol = True
        
    '当前符号是否为空
    If m_pSymbolsArray(Index) Is Nothing Then

        CatchErrors ErrorNoSelectedSymbol
        Exit Sub

    End If

    '返回符号(存于 m_pOutputSymbol)
    GetSelectedSymbol m_pSymbolsArray(Index)

End Sub

 '返回鼠标选择的符号
Private Sub GetSelectedSymbol(pSymbol As ISymbol)

    Set m_pOutputSymbol = pSymbol

    '可视化符号
    Dim bResult As Boolean
    bResult = DrawToDC(picPreview.hdc, picPreview.ScaleWidth, picPreview.ScaleHeight, m_pOutputSymbol, 2)
    If bResult = False Then CatchErrors ErrorPreview
    picPreview.Refresh

    '显示信息
    DisplaySymbolProp

End Sub

'显示选中的符号的颜色尺寸信息
Private Sub DisplaySymbolProp()
    
    If m_pInputSymbol Is Nothing And m_pOutputSymbol Is Nothing Then Exit Sub
    
    Dim pSymbol As ISymbol
    If m_bControlStart = True Then Set pSymbol = m_pInputSymbol
    If m_bControlStart = False Then Set pSymbol = m_pOutputSymbol
    
    If m_strShapeType = "Fill Symbols" Then

        Dim pFillSymbol As IFillSymbol
        Set pFillSymbol = pSymbol
        picOutlineColor.BackColor = pFillSymbol.Outline.color.RGB
        picFillColor.BackColor = pFillSymbol.color.RGB
        txtOutLineSize.Text = CStr(pFillSymbol.Outline.Width)

    End If

    If m_strShapeType = "Line Symbols" Then

        Dim pLineSymbol As ILineSymbol
        Set pLineSymbol = pSymbol
        picLineOrPointColor.BackColor = pLineSymbol.color.RGB
        txtLineOrPointWidth.Text = pLineSymbol.Width

    End If

    If m_strShapeType = "Marker Symbols" Then

        Dim pMarkerSymbol As IMarkerSymbol
        Set pMarkerSymbol = pSymbol
        picLineOrPointColor.BackColor = pMarkerSymbol.color.RGB
        txtLineOrPointWidth = pMarkerSymbol.SIZE

    End If

End Sub

'控件初始化
Private Sub UserControl_Initialize()

    m_enumSymbolGeometryType = esriGeometryNull
    Set m_pStyleGallery = Nothing
    Set m_pOutputSymbol = Nothing
    m_bHasFillSymbolInFile = False
    m_bHasLineSymbolInFile = False
    m_bHasMarkerSymbolInFile = False
    m_bChangStyleFile = False
    m_bControlStart = True
    m_intTotalSymbolsNum = -1
    m_intSymbolID = 0
    m_bControlStart = True
    m_intLTSymbolID = 0
    m_intCurDisplayingSymbolsNum = 0
    m_bResetHscrollBar = True
    m_bHasSelectedOneSymbol = False
    m_bLoadFileFromOtherDirectory = False
    m_strLineOrPointWidth = ""
    m_strOutLineSize = ""

End Sub

'控件刚显示时发生
Private Sub UserControl_Show()

    '启动时显示
    If m_bControlStart = True Or m_bChangStyleFile = True Then

        '加载符号库(“.style”)
        If LoadSymbolsFromFiles = False Then Exit Sub

        '更新静态显示界面
        UpdateStaticDisplaying

        '更新动态显示界面
        UpdateDynamicDisplaying

        '更新启动标志(防止下拉框click函数在初始化时就执行)
        m_bControlStart = False

    End If

End Sub

'更改符号库
Private Sub cmbSymbolFiles_Click()

    '控件刚显示时,不执行该过程
    If m_bControlStart = True Then Exit Sub

    '释放上一个符号库文件内存
    Set m_pStyleGallery = Nothing
    
    Screen.MousePointer = ccHourglass
    
    '初始化控件
    UserControl_Initialize

    If cmbSymbolFiles.List(cmbSymbolFiles.ListIndex) = "其它" Then
        
        dlgCommon.Filter = "符号文件(*.serverstyle)|*.serverstyle"
        dlgCommon.ShowOpen
        
        If dlgCommon.FileName = "" Then GoTo Pos_End
        m_pStylePath = dlgCommon.FileName
        Dim strFileName As String
        Dim intPos As Integer
        intPos = InStrRev(m_pStylePath, "\")
        strFileName = Right(m_pStylePath, Len(m_pStylePath) - intPos)
        
        m_bLoadFileFromOtherDirectory = True
        
    End If

    '显示控件
    m_bChangStyleFile = True
    UserControl_Show
    
Pos_End:
    m_bControlStart = False
    Screen.MousePointer = vbDefault
    cmdDefaultValue.SetFocus

End Sub

'加载符号库(当前默认"forestry.serverstyle")
Private Function LoadSymbolsFromFiles() As Boolean

    Dim i As Long
    Dim pStylePath As String
    Dim pStyleGalleryStorage As IStyleGalleryStorage
    Set m_pStyleGallery = New ServerStyleGallery
    Debug.Assert Not m_pStyleGallery Is Nothing
    If m_pStyleGallery Is Nothing Then
        MsgBox "内存不足。"
        Exit Function
    End If

    '错误处理
    If m_pStyleGallery Is Nothing Then
        CatchErrors ErrorNoEnoughMemory
        LoadSymbolsFromFiles = False
        Set m_pStyleGallery = Nothing
        Exit Function
    End If

    Set pStyleGalleryStorage = m_pStyleGallery

    '加载符号库文件
    If m_bChangStyleFile = False Then

         '系统刚启动,加载默认文件
         m_pStylePath = App.Path & "\style" & "\forestry.serverStyle "

    Else

        If m_bLoadFileFromOtherDirectory = True Then

            m_bLoadFileFromOtherDirectory = False

        Else

            '“符号库”列表框是否为空(测试用,以后删除,不增加错误处理)
            If cmbSymbolFiles.ListCount = 0 Then
                CatchErrors ErrorNoSytleFileSelected
                LoadSymbolsFromFiles = False
                Set m_pStyleGallery = Nothing
                Exit Function
            Else
                '用户更改符号库文件(单击符号库下拉框)
                m_pStylePath = App.Path & "\style" & "\" & cmbSymbolFiles.List(cmbSymbolFiles.ListIndex)
            End If

        End If

    End If

    '未选择符号文件(针对“其它”选项)
    If m_pStylePath = "" Then
    
        LoadSymbolsFromFiles = False
        Set m_pStyleGallery = Nothing
        Exit Function
    
    End If
    
    '不能加栽文件
    pStyleGalleryStorage.AddFile m_pStylePath
    If pStyleGalleryStorage Is Nothing Then
        CatchErrors ErrirCanntLoadStyleFile
        LoadSymbolsFromFiles = False

⌨️ 快捷键说明

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