『公告』 预祝您龙年大吉,万事如意, 过节期间, 大家如需数据服务,请拨打400 或直接添加客服微信,再祝大家龙年,心想事成。
关注我们 新浪 腾讯

《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2

《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2
在第七讲 图层符号选择器的实现的第一阶段中,我们完成了符号选择器窗体的创建与调用。在第二阶段中,我们继续完成符号参数的调整与“更多符号”的加载。

       2.6     符号参数调整

       在地图整饰中,符号参数的调整是必须的功能。下面我们将实现符号颜色、外框颜色、线宽、角度等参数的调整。

       (1       添加SymbologyControlOnItemSelected事件,此事件在鼠标选中符号时触发,此时显示出选定符号的初始参数,事件响应函数代码如下:

/// <summary>

/// 选中符号时触发的事件

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void axSymbologyControl_OnItemSelected(object sender, ESRI.ArcGIS.Controls.ISymbologyControlEvents_OnItemSelectedEvent e)

{

    pStyleGalleryItem = (IStyleGalleryItem)e.styleGalleryItem;

    Color color;

    switch (this.axSymbologyControl.StyleClass)

    {

            //点符号

        case esriSymbologyStyleClass.esriStyleClassMarkerSymbols:

            color = this.ConvertIRgbColorToColor(((IMarkerSymbol)pStyleGalleryItem.Item).Color as IRgbColor);

            //设置点符号角度和大小初始值

            this.nudAngle.Value = (decimal)((IMarkerSymbol)this.pStyleGalleryItem.Item).Angle;

            this.nudSize.Value = (decimal)((IMarkerSymbol)this.pStyleGalleryItem.Item).Size;

            break;

            //线符号

        case esriSymbologyStyleClass.esriStyleClassLineSymbols:

            color = this.ConvertIRgbColorToColor(((ILineSymbol)pStyleGalleryItem.Item).Color as IRgbColor);

            //设置线宽初始值

            this.nudWidth.Value = (decimal)((ILineSymbol)this.pStyleGalleryItem.Item).Width;

            break;

            //面符号

        case esriSymbologyStyleClass.esriStyleClassFillSymbols:

            color = this.ConvertIRgbColorToColor(((IFillSymbol)pStyleGalleryItem.Item).Color as IRgbColor);

            this.btnOutlineColor.BackColor = this.ConvertIRgbColorToColor(((IFillSymbol)pStyleGalleryItem.Item).Outline.Color as IRgbColor);

            //设置外框线宽度初始值

            this.nudWidth.Value = (decimal)((IFillSymbol)this.pStyleGalleryItem.Item).Outline.Width;

            break;

        default:

            color = Color.Black;

            break;

    }

    //设置按钮背景色

    this.btnColor.BackColor = color;

    //预览符号

    this.PreviewImage();

}

 

       (2       调整点符号的大小

添加nudSize控件的ValueChanged事件,即在控件的值改变时响应此事件,然后重新设置点符号的大小。代码如下:

    /// <summary>

/// 调整符号大小-点符号

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void nudSize_ValueChanged(object sender, EventArgs e)

{

    ((IMarkerSymbol)this.pStyleGalleryItem.Item).Size = (double)this.nudSize.Value;

    this.PreviewImage();

}

       (3       调整点符号的角度

添加nudAngle控件的ValueChanged事件,以重新设置点符号的角度。代码如下:

    /// <summary>

/// 调整符号角度-点符号

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void nudAngle_ValueChanged(object sender, EventArgs e)

{

    ((IMarkerSymbol)this.pStyleGalleryItem.Item).Angle = (double)this.nudAngle.Value;

    this.PreviewImage();

}

       (4       调整线符号和面符号的线宽

添加nudWidth控件的ValueChanged事件,以重新设置线符号的线宽和面符号的外框线的线宽。代码如下:

 

/// <summary>

/// 调整符号宽度-限于线符号和面符号

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void nudWidth_ValueChanged(object sender, EventArgs e)

{

    switch (this.axSymbologyControl.StyleClass)

    {

        case esriSymbologyStyleClass.esriStyleClassLineSymbols:

            ((ILineSymbol)this.pStyleGalleryItem.Item).Width = Convert.ToDouble(this.nudWidth.Value);

            break;

        case esriSymbologyStyleClass.esriStyleClassFillSymbols:

            //取得面符号的轮廓线符号

            ILineSymbol pLineSymbol = ((IFillSymbol)this.pStyleGalleryItem.Item).Outline;

            pLineSymbol.Width = Convert.ToDouble(this.nudWidth.Value);

            ((IFillSymbol)this.pStyleGalleryItem.Item).Outline = pLineSymbol;

            break;

    }

    this.PreviewImage();

}

       (5       颜色转换

ArcGIS Engine中,颜色由IRgbColor接口实现,而在.NET框架中,颜色则由Color结构表示。故在调整颜色参数之前,我们必须完成以上两种不同颜色表示方式的转换。关于这两种颜色结构的具体信息,请大家自行查阅相关资料。下面添加两个颜色转换函数。

ArcGIS Engine中的IRgbColor接口转换至.NET中的Color结构的函数:

    /// <summary>

/// ArcGIS Engine中的IRgbColor接口转换至.NET中的Color结构

/// </summary>

/// <param name="pRgbColor">IRgbColor</param>

/// <returns>.NET中的System.Drawing.Color结构表示ARGB颜色</returns>

public Color ConvertIRgbColorToColor(IRgbColor pRgbColor)

{

    return ColorTranslator.FromOle(pRgbColor.RGB);

}

.NET中的Color结构转换至于ArcGIS Engine中的IColor接口的函数:

    /// <summary>

/// .NET中的Color结构转换至于ArcGIS Engine中的IColor接口

/// </summary>

/// <param name="color">.NET中的System.Drawing.Color结构表示ARGB颜色</param>

/// <returns>IColor</returns>

public IColor ConvertColorToIColor(Color color)

{

    IColor pColor = new RgbColorClass();

    pColor.RGB = color.B * 65536 + color.G * 256 + color.R;

    return pColor;

}

       (6       调整所有符号的颜色

选择颜色时,我们调用.NET的颜色对话框ColorDialog,选定颜色后,修改颜色按钮的背景色为选定的颜色,以方便预览。双击btnColor按钮,添加如下代码:

/// <summary>

/// 颜色按钮

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btnColor_Click(object sender, EventArgs e)

{

    //调用系统颜色对话框

    if (this.colorDialog.ShowDialog() == DialogResult.OK)

    {

        //将颜色按钮的背景颜色设置为用户选定的颜色

        this.btnColor.BackColor = this.colorDialog.Color;

        //设置符号颜色为用户选定的颜色

        switch (this.axSymbologyControl.StyleClass)

        {

            //点符号

            case esriSymbologyStyleClass.esriStyleClassMarkerSymbols:

                ((IMarkerSymbol)this.pStyleGalleryItem.Item).Color = this.ConvertColorToIColor(this.colorDialog.Color);

                break;

            //线符号

            case esriSymbologyStyleClass.esriStyleClassLineSymbols:

                ((ILineSymbol)this.pStyleGalleryItem.Item).Color = this.ConvertColorToIColor(this.colorDialog.Color);

                break;

            //面符号

            case esriSymbologyStyleClass.esriStyleClassFillSymbols:

                ((IFillSymbol)this.pStyleGalleryItem.Item).Color = this.ConvertColorToIColor(this.colorDialog.Color);

                break;

        }

        //更新符号预览

        this.PreviewImage();

    }

}

       (7       调整面符号的外框线颜色

同上一步类似,双击btnOutlineColor按钮,添加如下代码:

 

/// <summary>

/// 外框颜色按钮

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btnOutlineColor_Click(object sender, EventArgs e)

{

    if (this.colorDialog.ShowDialog() == DialogResult.OK)

    {

        //取得面符号中的外框线符号

        ILineSymbol pLineSymbol = ((IFillSymbol)this.pStyleGalleryItem.Item).Outline;

        //设置外框线颜色

        pLineSymbol.Color = this.ConvertColorToIColor(this.colorDialog.Color);

        //重新设置面符号中的外框线符号

        ((IFillSymbol)this.pStyleGalleryItem.Item).Outline = pLineSymbol;

        //设置按钮背景颜色

        this.btnOutlineColor.BackColor = this.colorDialog.Color;

        //更新符号预览

        this.PreviewImage();

    }

}

       至此,你可以编译运行程序,看看效果如何,是不是感觉很不错了?我们已经能够修改符号的参数,自定义符号了。

       但是,SymbologyControl默认加载的是ESRI.ServerStyle文件的样式,用过ArcMap的你可能已经注意到,ArcMap中的Symbol Selector有一个“More Symbols”按钮,可以加载其它的符号和ServerStyle文件。3sdnMap当然“一个都不能少”。

      京ICP备2025132830号-1 京公网安备 号