紧接着上一篇笔记。

文章目录

  • 一、专题地图制图
  • 二、地图导出

一、专题地图制图

专题地图的制图过程实质上仍是在将地理信息进行某种符号化。
代码如下:
mainFrom.cs:

 private SubjectMap subjectMap=null;private OperateMap m_OperateMap = null;//专题地图制图private void barButtonItem_SubjectMap_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e){try{m_OperateMap = new OperateMap();if (subjectMap == null || subjectMap.IsDisposed){subjectMap = new SubjectMap();subjectMap.UniqueValueRender += new SubjectMap.UniqueValueRenderEventHandler(frmUniqueValueRen_UniqueValueRender);subjectMap.GraduatedSymbols += new SubjectMap.GraduatedSymbolsEventHandler(frmGraduatedSymbols_GraduatedSymbols);}subjectMap.axMapControl =axMapControl_MapView;subjectMap.ShowDialog();}catch (Exception ex){MessageBox.Show(ex.Message);}}void frmUniqueValueRen_UniqueValueRender(string sFeatClsName, string sFieldName){IFeatureLayer pFeatLyr = m_OperateMap.GetFeatLyrByName(axMapControl_MapView.Map, sFeatClsName);UniqueValueRenderer(pFeatLyr, sFieldName);}/// <summary>/// 唯一值符号化/// </summary>/// <param name="pFeatLyr">渲染图层</param>/// <param name="sFieldName">渲染字段</param>private void UniqueValueRenderer(IFeatureLayer pFeatLyr, string sFieldName){try{IGeoFeatureLayer pGeoFeatLyr = pFeatLyr as IGeoFeatureLayer;ITable pTable = pFeatLyr as ITable;IUniqueValueRenderer pUniqueValueRender = new UniqueValueRendererClass();int intFieldNumber = pTable.FindField(sFieldName);pUniqueValueRender.FieldCount = 1;//设置唯一值符号化的关键字段为一个pUniqueValueRender.set_Field(0, sFieldName);//设置唯一值符号化的第一个关键字段IRandomColorRamp pRandColorRamp = new RandomColorRampClass();pRandColorRamp.StartHue = 0;pRandColorRamp.MinValue = 0;pRandColorRamp.MinSaturation = 15;pRandColorRamp.EndHue = 360;pRandColorRamp.MaxValue = 100;pRandColorRamp.MaxSaturation = 30;//根据渲染字段的值的个数,设置一组随机颜色,如某一字段有5个值,则创建5个随机颜色与之匹配IQueryFilter pQueryFilter = new QueryFilterClass();pRandColorRamp.Size = pFeatLyr.FeatureClass.FeatureCount(pQueryFilter);bool bSuccess = false;pRandColorRamp.CreateRamp(out bSuccess);IEnumColors pEnumRamp = pRandColorRamp.Colors;IColor pNextUniqueColor = null;//查询字段的值pQueryFilter = new QueryFilterClass();pQueryFilter.AddField(sFieldName);ICursor pCursor = pTable.Search(pQueryFilter, true);IRow pNextRow = pCursor.NextRow();object codeValue = null;IRowBuffer pNextRowBuffer = null;while (pNextRow != null){pNextRowBuffer = pNextRow as IRowBuffer;codeValue = pNextRowBuffer.get_Value(intFieldNumber);//获取渲染字段的每一个值pNextUniqueColor = pEnumRamp.Next();if (pNextUniqueColor == null){pEnumRamp.Reset();pNextUniqueColor = pEnumRamp.Next();}IFillSymbol pFillSymbol = null;ILineSymbol pLineSymbol;IMarkerSymbol pMarkerSymbol;switch (pGeoFeatLyr.FeatureClass.ShapeType){case esriGeometryType.esriGeometryPolygon:{pFillSymbol = new SimpleFillSymbolClass();pFillSymbol.Color = pNextUniqueColor;pUniqueValueRender.AddValue(codeValue.ToString(), "", pFillSymbol as ISymbol);//添加渲染字段的值和渲染样式pNextRow = pCursor.NextRow();break;}case esriGeometryType.esriGeometryPolyline:{pLineSymbol = new SimpleLineSymbolClass();pLineSymbol.Color = pNextUniqueColor;pUniqueValueRender.AddValue(codeValue.ToString(), "", pLineSymbol as ISymbol);//添加渲染字段的值和渲染样式pNextRow = pCursor.NextRow();break;}case esriGeometryType.esriGeometryPoint:{pMarkerSymbol = new SimpleMarkerSymbolClass();pMarkerSymbol.Color = pNextUniqueColor;pUniqueValueRender.AddValue(codeValue.ToString(), "", pMarkerSymbol as ISymbol);//添加渲染字段的值和渲染样式pNextRow = pCursor.NextRow();break;}}}pGeoFeatLyr.Renderer = pUniqueValueRender as IFeatureRenderer;axMapControl_MapView.Refresh();axTOCControl.Update();}catch (Exception ex){}}// 分级符号 void frmGraduatedSymbols_GraduatedSymbols(string sFeatClsName, string sFieldName, int numclasses){IFeatureLayer pFeatLyr = m_OperateMap.GetFeatLyrByName(axMapControl_MapView.Map, sFeatClsName);GraduatedSymbols(pFeatLyr, sFieldName, numclasses);}public void GraduatedSymbols(IFeatureLayer pFeatLyr, string sFieldName, int numclasses){ISimpleMarkerSymbol pSimpleMarkerSymbol = new SimpleMarkerSymbolClass();pSimpleMarkerSymbol.Color = m_OperateMap.GetRgbColor(255, 100, 100);ISimpleLineSymbol pSimpleLineSymbol = new SimpleLineSymbolClass();pSimpleLineSymbol.Color = m_OperateMap.GetRgbColor(255, 100, 100);int IbreakIndex;object dataFrequency;object dataValues;//获得要着色的图层IGeoFeatureLayer pGeoFeatureL = pFeatLyr as IGeoFeatureLayer;ITable pTable = pGeoFeatureL.FeatureClass as ITable;ITableHistogram pTableHistogram = new BasicTableHistogramClass();IBasicHistogram pBasicHistogram = (IBasicHistogram)pTableHistogram;pTableHistogram.Field = sFieldName;pTableHistogram.Table = pTable;pBasicHistogram.GetHistogram(out dataValues, out dataFrequency);//获取渲染字段的值及其出现的频率                    IClassifyGEN pClassify = new EqualIntervalClass();try{pClassify.Classify(dataValues, dataFrequency, ref numclasses);//根据获取字段的值和出现的频率对其进行等级划分 }catch (Exception ex){}//返回一个数组double[] Classes = (double[])pClassify.ClassBreaks;int ClassesCount = Classes.GetUpperBound(0);IClassBreaksRenderer pClassBreakRenderer = new ClassBreaksRendererClass();pClassBreakRenderer.Field = sFieldName;// 设置分级字段//设置着色对象的分级数目pClassBreakRenderer.BreakCount = ClassesCount;//设置分级数目pClassBreakRenderer.SortClassesAscending = true;//升序排列//需要注意的是分级着色对象中的symbol和break的下标都是从0开始double symbolSizeOrigin = 5.0;if (ClassesCount <= 5){symbolSizeOrigin = 8;}if (ClassesCount < 10 && ClassesCount > 5){symbolSizeOrigin = 7;}IFillSymbol pBackgroundSymbol = new SimpleFillSymbolClass();pBackgroundSymbol.Color = m_OperateMap.GetRgbColor(255, 255, 100);//不同的要素类型,生成不同的分级符号switch (pGeoFeatureL.FeatureClass.ShapeType){case esriGeometryType.esriGeometryPolygon:{for (IbreakIndex = 0; IbreakIndex <= ClassesCount - 1; IbreakIndex++){pClassBreakRenderer.set_Break(IbreakIndex, Classes[IbreakIndex + 1]);pClassBreakRenderer.BackgroundSymbol = pBackgroundSymbol;pSimpleMarkerSymbol.Size = symbolSizeOrigin + IbreakIndex * symbolSizeOrigin / 3.0d;pClassBreakRenderer.set_Symbol(IbreakIndex, (ISymbol)pSimpleMarkerSymbol);}break;}case esriGeometryType.esriGeometryPolyline:{for (IbreakIndex = 0; IbreakIndex <= ClassesCount - 1; IbreakIndex++){pClassBreakRenderer.set_Break(IbreakIndex, Classes[IbreakIndex + 1]);pSimpleLineSymbol.Width = symbolSizeOrigin / 5 + IbreakIndex * (symbolSizeOrigin / 5) / 5.0d;pClassBreakRenderer.set_Symbol(IbreakIndex, (ISymbol)pSimpleLineSymbol);}break;}case esriGeometryType.esriGeometryPoint:{for (IbreakIndex = 0; IbreakIndex <= ClassesCount - 1; IbreakIndex++){pClassBreakRenderer.set_Break(IbreakIndex, Classes[IbreakIndex + 1]);pSimpleMarkerSymbol.Size = symbolSizeOrigin + IbreakIndex * symbolSizeOrigin / 3.0d;pClassBreakRenderer.set_Symbol(IbreakIndex, (ISymbol)pSimpleMarkerSymbol);}break;}}pGeoFeatureL.Renderer = pClassBreakRenderer as IFeatureRenderer;axMapControl_MapView.ActiveView.Refresh();axTOCControl.Update();}

SubjectMap.cs:

 public partial class SubjectMap : DevExpress.XtraEditors.XtraForm{public SubjectMap(){InitializeComponent();}public AxMapControl axMapControl { get; set; }private IMap pMap;List<IFeatureClass> _lstFeatCls = null;//事件声明//唯一值事件public delegate void UniqueValueRenderEventHandler(string sFeatClsName, string sFieldName);public event UniqueValueRenderEventHandler UniqueValueRender = null;//分级符号事件public delegate void GraduatedSymbolsEventHandler(string sFeatClsName, string sFieldName, int intnumclassess);public event GraduatedSymbolsEventHandler GraduatedSymbols = null;//窗体生成事件private void SubjectMap_Load(object sender, EventArgs e){comboBox_InputDataset.Properties.Items.Clear();InitUI();}public void InitUI(){pMap = axMapControl.Map;string sClsName = string.Empty;IFeatureClass pFeatCls = null;OperateMap _OperateMap = new OperateMap();_lstFeatCls = _OperateMap.GetLstFeatCls(pMap);for (int i = 0; i < _lstFeatCls.Count; i++){pFeatCls = _lstFeatCls[i];sClsName = pFeatCls.AliasName;if (!comboBox_InputDataset.Properties.Items.Contains(sClsName)){comboBox_InputDataset.Properties.Items.Add(sClsName);}}}//选择图层private void comboBox_InputDataset_SelectedIndexChanged(object sender, EventArgs e){comboBoxEdit_Fields.Properties.Items.Clear();comboBoxEdit_Fields.Text = "";IField pField = null;IFeatureClass pFeatCls = GetFeatClsByName(comboBox_InputDataset.SelectedItem.ToString());for (int i = 0; i < pFeatCls.Fields.FieldCount; i++){pField = pFeatCls.Fields.get_Field(i);if (pField.Type == esriFieldType.esriFieldTypeDouble ||pField.Type == esriFieldType.esriFieldTypeInteger ||pField.Type == esriFieldType.esriFieldTypeSingle ||pField.Type == esriFieldType.esriFieldTypeSmallInteger){if (!comboBoxEdit_Fields.Properties.Items.Contains(pField.Name)){comboBoxEdit_Fields.Properties.Items.Add(pField.Name);}}}}private IFeatureClass GetFeatClsByName(string sFeatClsName){IFeatureClass pFeatCls = null;for (int i = 0; i < _lstFeatCls.Count; i++){pFeatCls = _lstFeatCls[i];if (pFeatCls.AliasName == sFeatClsName){break;}}return pFeatCls;}//唯一值确定private void simpleButton_OK_Click(object sender, EventArgs e){if (!check()) return;UniqueValueRender(comboBox_InputDataset.SelectedItem.ToString(), comboBoxEdit_Fields.SelectedItem.ToString());      //激发事件的运行comboBoxEdit_Fields.Properties.Items.Clear();comboBox_InputDataset.Properties.Items.Clear();comboBox_InputDataset.Text = "";comboBoxEdit_Fields.Text = "";Close();}private bool check(){if (comboBox_InputDataset.SelectedIndex == -1){MessageBox.Show("请选择符号化图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);return false;}if (comboBoxEdit_Fields.SelectedIndex == -1){MessageBox.Show("请选择符号化字段!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);return false;}return true;}private void simpleButton_Cancel_Click(object sender, EventArgs e){this.Close();}/// <summary>/// 分级符号化/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void simpleButton_ClassifyOK_Click(object sender, EventArgs e){if (!classifyCheck()) return;GraduatedSymbols(comboBox_InputDataset.SelectedItem.ToString(),comboBoxEdit_Fields.SelectedItem.ToString(),Convert.ToInt32(comboBoxEdit_ClassifyCount.SelectedItem.ToString()));comboBoxEdit_Fields.Properties.Items.Clear();comboBox_InputDataset.Properties.Items.Clear();comboBox_InputDataset.Text = "";comboBoxEdit_Fields.Text = "";comboBoxEdit_ClassifyCount.SelectedIndex = -1;Close();}private bool classifyCheck(){if (comboBox_InputDataset.SelectedIndex == -1){MessageBox.Show("请选择符号化图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);return false;}if (comboBoxEdit_Fields.SelectedIndex == -1){MessageBox.Show("请选择符号化字段!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);return false;}if (comboBoxEdit_ClassifyCount.SelectedIndex == -1){MessageBox.Show("请选择分类数目!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);return false;}return true;}}

OperateMap.cs:

 class OperateMap{#region RGB颜色/// <summary>/// RGB颜色设置/// </summary>/// <param name="intR"></param>/// <param name="intG"></param>/// <param name="intB"></param>/// <returns></returns>public IRgbColor GetRgbColor(int intR, int intG, int intB){IRgbColor pRgbColor = null;if (intR < 0 || intR > 255 || intG < 0 || intG > 255 || intB < 0 || intB > 255){return pRgbColor;}pRgbColor = new RgbColorClass();pRgbColor.Red = intR;pRgbColor.Green = intG;pRgbColor.Blue = intB;return pRgbColor;}#endregion#region 保存地图文档/// <summary>/// 保存地图文档/// </summary>/// <param name="m_FilePath"></param>/// <param name="m_SaveMap"></param>/// <returns></returns>public void SaveMap(string m_FilePath, IMap m_SaveMap){try{IMapDocument pMapDoc = new MapDocumentClass();IMxdContents pMxdC = m_SaveMap as IMxdContents;pMapDoc.New(m_FilePath);pMapDoc.ReplaceContents(pMxdC);if (pMapDoc.get_IsReadOnly(pMapDoc.DocumentFilename) == true){MessageBox.Show("本地图文档是只读的,不能保存!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}pMapDoc.Save(pMapDoc.UsesRelativePaths, true);}catch (Exception ex){}}#endregion#region 获取图层要素类/// <summary>/// 获取图层要素类/// </summary>/// <param name="pLayer"></param>/// <param name="_lstFeatCls"></param>public void GetLstFeatCls(ILayer pLayer, ref List<IFeatureClass> _lstFeatCls){try{ILayer pLyr = null;ICompositeLayer pComLyr = pLayer as ICompositeLayer;if (pComLyr == null){IFeatureLayer pFeatLyr = pLayer as IFeatureLayer;if (!_lstFeatCls.Contains(pFeatLyr.FeatureClass)){_lstFeatCls.Add(pFeatLyr.FeatureClass);}}else{for (int i = 0; i < pComLyr.Count; i++){pLyr = pComLyr.get_Layer(i);GetLstFeatCls(pLyr, ref _lstFeatCls);}}}catch (Exception ex){}}#endregion#region 获取当前地图中的所有图层的要素类/// <summary>/// 获取当前地图中的所有图层的要素类/// </summary>/// <param name="pMap"></param>/// <returns></returns>public List<IFeatureClass> GetLstFeatCls(IMap pMap){List<IFeatureClass> _lstFeatCls = null;try{ILayer pLayer = null;IFeatureLayer pFeatLyr = null;_lstFeatCls = new List<IFeatureClass>();for (int i = 0; i < pMap.LayerCount; i++){pLayer = pMap.get_Layer(i);pFeatLyr = pLayer as IFeatureLayer;GetLstFeatCls(pLayer, ref _lstFeatCls);}}catch (Exception ex){}return _lstFeatCls;}#endregion#region 图层名称获取图层/// <summary>/// 由图层名称获取图层/// </summary>/// <param name="pLayer"></param>/// <param name="sFeatLyrName"></param>/// <returns></returns>public IFeatureLayer GetFeatLyrByName(ILayer pLayer, string sFeatLyrName){ILayer pLyr = null;IFeatureLayer pFeatureLyr = null;IFeatureLayer pFeatLyr = null;ICompositeLayer pComLyr = pLayer as ICompositeLayer;if (pComLyr == null){pFeatLyr = pLayer as IFeatureLayer;if (pFeatLyr.FeatureClass.AliasName == sFeatLyrName){pFeatureLyr = pFeatLyr;return pFeatureLyr;}}else{for (int i = 0; i < pComLyr.Count; i++){pLyr = pComLyr.get_Layer(i);GetFeatLyrByName(pLyr, sFeatLyrName);}}return pFeatureLyr;}#endregion#region 根据图层名称获取图层/// <summary>/// 根据图层名称获取图层  /// </summary>/// <param name="pMap"></param>/// <param name="sFeatLyrName"></param>/// <returns></returns>public IFeatureLayer GetFeatLyrByName(IMap pMap, string sFeatLyrName){IFeatureLayer pFeatLyr = null;try{ILayer pLayer = null;for (int i = 0; i < pMap.LayerCount; i++){pLayer = pMap.get_Layer(i);pFeatLyr = GetFeatLyrByName(pLayer, sFeatLyrName);if (pFeatLyr != null) break;}}catch (Exception ex){}return pFeatLyr;}#endregion}

实现效果:



二、地图导出

代码如下:

         //地图导出private void barButtonItem_MapExport_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e){ExportMapToImage();}private void ExportMapToImage(){try{SaveFileDialog pSaveDialog = new SaveFileDialog();pSaveDialog.FileName = "";pSaveDialog.Filter = "JPG图片(*.JPG)|*.jpg|tif图片(*.tif)|*.tif|PDF文档(*.PDF)|*.pdf";if (pSaveDialog.ShowDialog() == DialogResult.OK){double iScreenDispalyResolution = axPageLayoutControl.ActiveView.ScreenDisplay.DisplayTransformation.Resolution;// 获取屏幕分辨率的值IExporter pExporter = null;if (pSaveDialog.FilterIndex == 1){pExporter = new JpegExporterClass();}else if (pSaveDialog.FilterIndex == 2){pExporter = new TiffExporterClass();}else if (pSaveDialog.FilterIndex == 3){pExporter = new PDFExporterClass();}pExporter.ExportFileName = pSaveDialog.FileName;pExporter.Resolution = (short)iScreenDispalyResolution; //分辨率tagRECT deviceRect = axPageLayoutControl.ActiveView.ScreenDisplay.DisplayTransformation.get_DeviceFrame();IEnvelope pDeviceEnvelope = new EnvelopeClass();pDeviceEnvelope.PutCoords(deviceRect.left, deviceRect.bottom, deviceRect.right, deviceRect.top);pExporter.PixelBounds = pDeviceEnvelope; // 输出图片的范围ITrackCancel pCancle = new CancelTrackerClass();//可用ESC键取消操作axPageLayoutControl.ActiveView.Output(pExporter.StartExporting(), pExporter.Resolution, ref deviceRect, axPageLayoutControl.ActiveView.Extent, pCancle);Application.DoEvents();pExporter.FinishExporting();}}catch (Exception Err){MessageBox.Show(Err.Message, "输出图片", MessageBoxButtons.OK, MessageBoxIcon.Information);}}

实现效果:

C#+AE 地图制图(二)相关推荐

  1. 基于C#的AE+IDL二次桌面端程序开发

    目录 一.内容 1.2 实训内容      1.2.1 IDL综合开发      1.2.2 基于AO/AE的GIS二次开发    1.2.3 COM_IDL_connect组件开发 三. 实训软硬件 ...

  2. AE+ArcGIS二次开发课程设计(基于C#)

    AE+ArcGIS二次开发课程设计(基于C#) 1.工作内容 2.程序功能介绍 3.功能模块介绍 3.1 实现[创建TIN]说明 3.1.1 功能说明 3.1.2 代码实现(包含了所有主要的代码,库引 ...

  3. AE插件-二维图像创建三维视觉错觉场景特效 Autostereogram

    Autostereogram mac版带给大家,非常旨在从二维图像创建3D场景的视觉错觉,您只需要一张深度图和可能的纹理. AE中创建自动立体图-旨在从二维图像创建3D场景的视觉错觉,您只需要一张深度 ...

  4. c# AE GIS二次开发学习专题(二) 基本地图控件使用

    GIS二次开发学习专题(二) 基本地图控件使用 学习资料来自<牟乃夏 AE开发教程-基于C#.NET> 发的代码是我整理+老师布置的作业 这一部分是地图基本控件的使用与编写,包括: 一.二 ...

  5. 基于AE的二次开发的主界面设计

    一.新建项目 visual studio新建windows窗体应用程序项目,为相应的解决方案以及项目命名.得到包含一个窗体程序Form1的项目,更改Form1的属性:Name(窗体名称)设置为Main ...

  6. AE+C#二次开发,矢量数据空间分析——裁剪分析

    输入完整的代码后,出现如下错误

  7. 软件分享系列之【AE 下载安装】并持续分享中...

    目录 一.AE简介 二.AE下载 三.AE安装教程 一.AE简介 AE全称After Effects,是由世界著名的图形设计.出版和成像软件设计公司Adobe Systems Inc.开发的专业非线性 ...

  8. 计算机地图制图成图方法,第五章 地图成图方法.ppt

    <第五章 地图成图方法.ppt>由会员分享,可在线阅读,更多相关<第五章 地图成图方法.ppt(17页珍藏版)>请在人人文库网上搜索. 1.黄河水利职业技术学院测绘工程系 刘剑 ...

  9. 计算机地图制图成图方法,第五章 地图成图方法

    <第五章 地图成图方法>由会员分享,可在线阅读,更多相关<第五章 地图成图方法(17页珍藏版)>请在人人文库网上搜索. 1.Liu-jian-,黄河水利职业技术学院测绘工程系, ...

  10. spark(1.1) mllib 源代码分析

    在spark mllib 1.1加入版本stat包,其中包括一些统计数据有关的功能.本文分析中卡方检验和实施的主要原则: 一个.根本 在stat包实现Pierxunka方检验,它包括以下类别 (1)适 ...

最新文章

  1. [转]NS2 Data Collections by mitkook
  2. 关于windows注册表重定向和虚拟化分析
  3. sed 删除windows下的CR/LF
  4. linux 安装tomcat遇到的问题
  5. Linux下Ubuntu关闭触摸板(TinkPad)
  6. PCB 18种特殊走线的画法与技巧!
  7. 01背包问题解法及优化
  8. Android开发两年,我要跳槽去阿里巴巴了,做个阶段总结,flutterrow高度对齐
  9. Python爬虫学习总结
  10. Jenkins 前端 自动化发版/CICD
  11. Kafka 2.8.0 学习
  12. 「Nescafé26」 Freda的传呼机 【树上倍增+图论】
  13. python爬虫实训心得_python实训心得体会
  14. ansible D2
  15. Intel8086处理器使用NASM汇编语言实现操作系统08-关于负数的相关处理idiv/cbw/cwde/cdqu/cwd/cdq/cdo/
  16. 【一本通】1064:奥运奖牌计数
  17. 2019 香(shen)港(zhen)Regional补题
  18. IOS 10 定位问题
  19. c加加中print是什么意思_钻石净度中的vs什么意思?
  20. 欧姆龙CJ系列PLC连接CHNet-CJ实现以太网通信配置方法

热门文章

  1. 线性代数:特征向量和特征值
  2. 原来,我一直都不会用Windows
  3. 已经通过CMMI/CMM3级评估的企业名单
  4. WINDOWS网络编程接口
  5. QQ for linux
  6. 地狱少女...._习惯累积沉淀_新浪博客
  7. 表白代码(纯干货),送给你爱的人
  8. Sign in - CodeProject
  9. config配置文件原理及使用
  10. Windows 10 程序员计算器 HEX,DEC,OCT,BIN 的含义