就是把组织机构图做成思维导图的样子

本文是在别人的工作上进行了一定的更改,但是找不到这个链接了。

注:

1.组织结构图是用Graphics画的,因此他是一个图片。
2.本文给出了对图片进行点击时的一些响应事件。
先看一下结果图:
水平组织结构图(鼠标悬浮北京公司)

垂直组织机构图(鼠标点击上海公司)

C# 源代码给出如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;namespace DrawOrgChart
{public enum Orientation { Horizontal, Vertical };public class Tree<T>{Tree<T> _Parent = null;T _Content;List<Tree<T>> _Childs = new List<Tree<T>>();SizeF _Size;public Rectangle _Rec;private bool isHover = false;//指示鼠标是否在组织机构块上private bool isClick = false;//指示鼠标是否对组织结构进行了点击private int maxWidth;//组织机构图的最大宽度private int maxHeight;//组织结构图的最大高度private Pen pen = Pens.Blue;//画笔private Color clickColor = Color.BlueViolet;private int recHeight = 24;//矩形高度private int hInterval = 25;//水平间距private int vInterval = 16;//垂直间距private int borderWidth = 26;//画布两边宽度private int borderHeight = 26;//画布上下宽度private int verPadding = 5;//文字距边框的垂直距离private int horPadding = 10;//文字距边框的水平距离public bool IsHover { get { return isHover; } set { isHover = value; } }public bool IsClick { get { return isClick; } set { isClick = value; } }public int MaxWidth { get { return maxWidth; } set { maxWidth = value; } }public int MaxHeight { get { return maxHeight; } set { maxHeight = value; } }public int HInterval { get { return hInterval; } set { hInterval = value; } }public int VInterval { get { return vInterval; } set { vInterval = value; } }public Orientation OrientationMode = Orientation.Vertical;//用来指示组织机构图是水平的还是垂直的   public Tree(Tree<T> parent, T content){_Parent = parent;_Content = content;}public Tree<T> Add(T content){Tree<T> tree = new Tree<T>(this, content);_Childs.Add(tree);return tree;}public Tree<T> Parent { get { return _Parent; } }public T Content { get { return _Content; } set { _Content = value; } }public List<Tree<T>> Childs { get { return _Childs; } }public SizeF Size { get { return _Size; } set { _Size = value; } }public Rectangle Rec { get { return _Rec; } set { _Rec = value; } }/// <summary>/// 量测矩形框的完全放置字符串所需的大小/// </summary>/// <param name="g"></param>/// <param name="font"></param>/// <param name="addWidth">左右边距</param>/// <param name="addHeight">上下边距</param>void MeatureAllSize(Graphics g, Font font, int addWidth, int addHeight){string s = _Content.ToString();SizeF size = g.MeasureString("我爱你中国", font);//用来获取5个字时的边框,水平分布时边框的宽度需要一定if (OrientationMode == Orientation.Vertical)//画垂直图时执行{_Size = g.MeasureString(s, font);_Size.Width += addWidth;}else//画水平图时执行{StringBuilder sb = new StringBuilder();int i=0;//将内容按5个字换行while (i < s.Length){if (i>0&&i % 5 == 0){sb.Append("\r\n");}sb.Append(s[i]);i++;}if (s.Length > 5){_Size = g.MeasureString(sb.ToString(), font);}else{_Size = size;//小于5个字的情形}_Size.Width += addWidth;_Size.Height += addHeight;}foreach (Tree<T> tree in Childs)tree.MeatureAllSize(g, font, addWidth,addHeight);//为所有节点计算边框}/// <summary>/// 获取扁平化结构,画图的思想是将组织机构图的每一代节点放在一个列表里面,然后一个列表一个列表画/// </summary>/// <returns></returns>List<List<Tree<T>>> GetTreeLayers(){List<List<Tree<T>>> layers = new List<List<Tree<T>>>();GetTreeLayers(layers, new List<Tree<T>>(new Tree<T>[] { this }), 0);return layers;}void GetTreeLayers(List<List<Tree<T>>> layers, List<Tree<T>> childs, int level){if (childs.Count == 0) return;if (layers.Count <= level) layers.Add(new List<Tree<T>>());for (int i = 0; i < childs.Count; i++){layers[level].Add(childs[i]);GetTreeLayers(layers, childs[i].Childs, level + 1);}}/// <summary>/// 设置显示区域(从最后一层最左或最后一列最上开始)/// </summary>/// <param name="level"></param>/// <param name="height"></param>/// <param name="interval"></param>/// <param name="left"></param>void SetRectangle(int level, int height, int hInterval, int vInterval, int leftOrTop, Orientation orientation){int index = 0;if (Parent != null) index = Parent.Childs.IndexOf(this);if (orientation == Orientation.Vertical)//垂直时{int left = leftOrTop;if (Childs.Count == 0){// 没有儿子,就向前靠if (left > 0) left += hInterval;}else{// 有儿子,就在儿子中间int centerX = (Childs[0].Rec.Left + Childs[Childs.Count - 1].Rec.Right) / 2;left = centerX - (int)_Size.Width / 2;// 并且不能和前面的重复,如果重复,联同子孙和子孙的右边节点右移if (Parent != null && index > 0){int ex = (Parent.Childs[index - 1].Rec.Right + hInterval) - left;if (index > 0 && ex > 0){for (int i = index; i < Parent.Childs.Count; i++)Parent.Childs[i].RightChilds(ex);left += ex;}}}_Rec = new Rectangle(left, (height + vInterval) * level, (int)_Size.Width, height);}else//水平时{int top = leftOrTop;if (Childs.Count == 0){// 没有儿子,就向前靠if (top > 0) top += vInterval;}else{// 有儿子,就在儿子中间int centerX = (Childs[0].Rec.Top + Childs[Childs.Count - 1].Rec.Bottom) / 2;top = centerX - (int)_Size.Height / 2;// 并且不能和前面的重复,如果重复,联同子孙和子孙的右边节点右移if (Parent != null && index > 0){int ex = (Parent.Childs[index - 1].Rec.Bottom + vInterval) - top;if (index > 0 && ex > 0){for (int i = index; i < Parent.Childs.Count; i++)Parent.Childs[i].DownChilds(ex);top += ex;}}}_Rec = new Rectangle(((int)_Size.Width+hInterval)*level, top, (int)_Size.Width, (int)_Size.Height);}}/// <summary>/// 所有子孙向右平移/// </summary>/// <param name="ex"></param>void RightChilds(int ex){Rectangle rec;for (int i = 0; i < _Childs.Count; i++){rec = _Childs[i].Rec;rec.Offset(ex, 0);_Childs[i].Rec = rec;_Childs[i].RightChilds(ex);}}/// <summary>/// 所有子孙向下平移/// </summary>/// <param name="ex"></param>void DownChilds(int ex){Rectangle rec;for (int i = 0; i < _Childs.Count; i++){rec = _Childs[i].Rec;rec.Offset(0, ex);_Childs[i].Rec = rec;_Childs[i].DownChilds(ex);}}void Offset(int x, int y){_Rec.Offset(x, y);for (int i = 0; i < _Childs.Count; i++)_Childs[i].Offset(x, y);}public Bitmap DrawAsImage(){return DrawAsImage(pen, new Font("宋体", 10.5f), recHeight, horPadding,verPadding, hInterval, vInterval, borderWidth, borderHeight,OrientationMode);}public Bitmap DrawAsImage(Pen pen, Font font, int h, int horPadding,int verPadding,int horInterval, int verInterval, int borderWidth,int borderHeight,Orientation orientation){Bitmap bmp = new Bitmap(1, 1);Graphics g = Graphics.FromImage(bmp);// 把树扁平化List<List<Tree<T>>> layers = GetTreeLayers();// 算出每个单元的大小MeatureAllSize(g, font, horPadding,verPadding);g.Dispose();bmp.Dispose();if (OrientationMode == Orientation.Vertical)//水平时{// 从最后一层开始排列//int left = 0;for (int i = layers.Count - 1; i >= 0; i--){int left = 0;for (int j = 0; j < layers[i].Count; j++){layers[i][j].SetRectangle(i, h, horInterval, verInterval, left, OrientationMode);left = layers[i][j].Rec.Right;}}Offset(borderWidth, borderWidth);// 获取画布需要的大小maxHeight = (h + verInterval) * layers.Count - verInterval + borderWidth * 2;maxWidth = 0;for (int i = layers.Count - 1; i >= 0; i--){for (int j = 0; j < layers[i].Count; j++){if (layers[i][j].Rec.Right > maxWidth)maxWidth = layers[i][j].Rec.Right;}}maxWidth += borderWidth; // 边宽// 画bmp = new Bitmap(maxWidth, maxHeight);}else//水平时{// 从最后一列开始排列for (int i = layers.Count - 1; i >= 0; i--){int top = 0;for (int j = 0; j < layers[i].Count; j++){layers[i][j].SetRectangle(i, h, horInterval, verInterval, top, OrientationMode);top = layers[i][j].Rec.Bottom;}}Offset(borderWidth, borderWidth);// 获取画布需要的大小maxHeight=0;maxWidth = 0;for (int i = layers.Count - 1; i >= 0; i--){for (int j = 0; j < layers[i].Count; j++){if (layers[i][j].Rec.Right > maxWidth)maxWidth = layers[i][j].Rec.Right;if(layers[i][j].Rec.Bottom>maxHeight)maxHeight = layers[i][j].Rec.Bottom;}}maxWidth += borderWidth; // 边宽maxHeight += borderHeight;// 画bmp = new Bitmap(maxWidth, maxHeight);}g = Graphics.FromImage(bmp);//这里主要针对贝塞尔曲线的抗锯齿,但是效果不怎么理想g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;  //图片柔顺模式选择            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;//高质量g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;//再加一点g.Clear(Color.White);StringFormat format = (StringFormat)StringFormat.GenericDefault.Clone();format.Alignment = StringAlignment.Center;format.LineAlignment = StringAlignment.Far;Rectangle rec, recParent;for (int i = 0; i < layers.Count; i++){for (int j = 0; j < layers[i].Count; j++){// 画字rec = (Rectangle)layers[i][j].Rec;//矩形内矩形Rectangle rec2 = new Rectangle(rec.Left + 2, rec.Top + 2, rec.Width - 4, rec.Height - 4);g.DrawRectangle(pen, rec);//画阴影g.DrawLine(Pens.DimGray, new Point(rec.Left + 1, rec.Bottom + 1), new Point(rec.Right + 1, rec.Bottom + 1));g.DrawLine(Pens.DimGray, new Point(rec.Right + 1, rec.Top + 1), new Point(rec.Right + 1, rec.Bottom + 1));g.DrawLine(Pens.Gray, new Point(rec.Left + 2, rec.Bottom + 2), new Point(rec.Right + 2, rec.Bottom + 2));g.DrawLine(Pens.Gray, new Point(rec.Right + 2, rec.Top + 2), new Point(rec.Right + 2, rec.Bottom + 2));//g.DrawEllipse(pen, rec);if (layers[i][j].isHover && !layers[i][j].isClick)//进入矩形时执行{g.FillRectangle(new LinearGradientBrush(rec, Color.White, Color.LightBlue, LinearGradientMode.ForwardDiagonal), rec);//g.FillEllipse(new SolidBrush(hoverColor), rec);}if (layers[i][j].isHover && layers[i][j].isClick)//点击矩形时执行{g.DrawRectangle(Pens.Black, rec2);g.FillRectangle(new LinearGradientBrush(rec, Color.White, Color.AliceBlue, LinearGradientMode.ForwardDiagonal), rec2);//g.FillEllipse(new SolidBrush(hoverColor), rec);}g.DrawString(layers[i][j].Content.ToString(), font, new SolidBrush(pen.Color),rec, format);// 画到父亲的线if (layers[i][j].Parent != null){recParent = layers[i][j].Parent.Rec;                        //画贝塞尔线if (orientation == Orientation.Vertical){g.DrawBezier(pen, new Point(rec.Left + rec.Width / 2, rec.Top), new Point(rec.Left + rec.Width / 2, rec.Top - verInterval / 2), new Point(recParent.Left + recParent.Width / 2, recParent.Bottom + verInterval / 2), new Point(recParent.Left + recParent.Width / 2, recParent.Bottom));}else{g.DrawBezier(pen, new Point(rec.Left, rec.Top + rec.Height / 2), new Point(rec.Left - horInterval / 2, rec.Top + rec.Height / 2), new Point(recParent.Right + horInterval / 2, recParent.Bottom - recParent.Height / 2), new Point(recParent.Right, recParent.Bottom - recParent.Height / 2));}}}}g.Flush();g.Dispose();return bmp;}}
}

form程序如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace DrawOrgChart
{public partial class Form1 : Form{public Form1(){InitializeComponent();}List<Tree<string>> nodes = new List<Tree<string>>();Tree<string> tree;private void Form1_Load(object sender, EventArgs e){cmbOrientation.SelectedIndex = 0;tree = new Tree<string>(null, "董事会");nodes.Add(tree);nodes.Add(tree.Add("董事秘书室特殊机构"));nodes.Add(tree.Add("北京公司"));nodes.Add(tree.Add("上海公司"));nodes.Add(tree.Add("山西公司"));nodes.Add(tree.Childs[1].Add("总经理办公室"));nodes.Add(tree.Childs[1].Add("财务部"));nodes.Add(tree.Childs[1].Add("销售部"));nodes.Add(tree.Childs[2].Add("上海销售部"));nodes.Add(tree.Childs[2].Add("上海秘书处"));nodes.Add(tree.Childs[3].Add("太原分部"));}      private void pictureBox1_MouseMove(object sender, MouseEventArgs e){Point p = e.Location;double scaleX = (double)tree.MaxWidth / pictureBox1.Width;double scaleY = (double)tree.MaxHeight / pictureBox1.Height;switch (pictureBox1.SizeMode){case PictureBoxSizeMode.Zoom:double scale = scaleX < scaleY ? scaleY : scaleX;if (scale == scaleX){p.Y = (int)((p.Y - (pictureBox1.Height - tree.MaxHeight / scale) / 2) * scale);p.X = (int)(p.X * scale);}else{p.X = (int)((p.X - (pictureBox1.Width - tree.MaxWidth / scale) / 2) * scale);p.Y = (int)(p.Y * scale);}break;case PictureBoxSizeMode.StretchImage:p.X = (int)(p.X * scaleX);p.Y = (int)(p.Y * scaleY);break;}bool changed = false;foreach (var node in nodes){if (node.Rec.Contains(p)){if (!node.IsHover){node.IsHover = true;changed = true;}break;}else{if (node.IsHover){node.IsHover = false;changed = true;}}}if (changed){Bitmap bmp = tree.DrawAsImage();pictureBox1.Image = bmp;pictureBox1.Refresh();}}private void pictureBox1_MouseClick(object sender, MouseEventArgs e){            Point p = pictureBox1.PointToClient(MousePosition);double scaleX = (double)tree.MaxWidth / pictureBox1.Width;double scaleY = (double)tree.MaxHeight / pictureBox1.Height;switch (pictureBox1.SizeMode){case PictureBoxSizeMode.Zoom:double scale = scaleX < scaleY ? scaleY : scaleX;if (scale == scaleX){p.Y = (int)((p.Y - (pictureBox1.Height - tree.MaxHeight / scale) / 2) * scale);p.X = (int)(p.X * scale);}else{p.X = (int)((p.X - (pictureBox1.Width - tree.MaxWidth / scale) / 2) * scale);p.Y = (int)(p.Y * scale);}break;case PictureBoxSizeMode.StretchImage:p.X = (int)(p.X * scaleX);p.Y = (int)(p.Y * scaleY);break;}Tree<string> nodeB = null;bool rectClicked = false;foreach (var node in nodes){if (node.Rec.Contains(p)){nodeB = node;                    rectClicked = true;break;}}            if (e.Button == MouseButtons.Left && e.Clicks == 1){if (rectClicked){Form2 frm = new Form2();frm.Text = nodeB.Content.ToString();frm.Show();//MessageBox.Show(nodeB.Content.ToString());}}}private void contextMenuStrip1_Opening(object sender, CancelEventArgs e){pictureBox1.ContextMenuStrip.Enabled = true;Point p = pictureBox1.PointToClient(MousePosition);double scaleX = (double)tree.MaxWidth / pictureBox1.Width;double scaleY = (double)tree.MaxHeight / pictureBox1.Height;switch (pictureBox1.SizeMode){case PictureBoxSizeMode.Zoom:double scale = scaleX < scaleY ? scaleY : scaleX;if (scale == scaleX){p.Y = (int)((p.Y - (pictureBox1.Height - tree.MaxHeight / scale) / 2) * scale);p.X = (int)(p.X * scale);}else{p.X = (int)((p.X - (pictureBox1.Width - tree.MaxWidth / scale) / 2) * scale);p.Y = (int)(p.Y * scale);}break;case PictureBoxSizeMode.StretchImage:p.X = (int)(p.X * scaleX);p.Y = (int)(p.Y * scaleY);break;}bool rectClicked = false;            foreach (var node in nodes){if (node.Rec.Contains(p)){rectClicked = true;break;}}if (!rectClicked){contextMenuStrip1.Items[0].Enabled = true;contextMenuStrip1.Items[1].Enabled = false;contextMenuStrip1.Items[2].Enabled = false;}else{contextMenuStrip1.Items[0].Enabled = true;contextMenuStrip1.Items[1].Enabled = true;contextMenuStrip1.Items[2].Enabled = true;}}private void pictureBox1_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){Point p = pictureBox1.PointToClient(MousePosition);double scaleX = (double)tree.MaxWidth / pictureBox1.Width;double scaleY = (double)tree.MaxHeight / pictureBox1.Height;switch (pictureBox1.SizeMode){case PictureBoxSizeMode.Zoom:double scale = scaleX < scaleY ? scaleY : scaleX;if (scale == scaleX){p.Y = (int)((p.Y - (pictureBox1.Height - tree.MaxHeight / scale) / 2) * scale);p.X = (int)(p.X * scale);}else{p.X = (int)((p.X - (pictureBox1.Width - tree.MaxWidth / scale) / 2) * scale);p.Y = (int)(p.Y * scale);}break;case PictureBoxSizeMode.StretchImage:p.X = (int)(p.X * scaleX);p.Y = (int)(p.Y * scaleY);break;}Tree<string> nodeB = null;bool rectClicked = false;foreach (var node in nodes){if (node.Rec.Contains(p)){nodeB = node;rectClicked = true;break;}}if (rectClicked){nodeB.IsClick = true;Bitmap bmp = tree.DrawAsImage();pictureBox1.Image = bmp;pictureBox1.Refresh();}}}private void pictureBox1_MouseUp(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){Point p = pictureBox1.PointToClient(MousePosition);double scaleX = (double)tree.MaxWidth / pictureBox1.Width;double scaleY = (double)tree.MaxHeight / pictureBox1.Height;switch (pictureBox1.SizeMode){case PictureBoxSizeMode.Zoom:double scale = scaleX < scaleY ? scaleY : scaleX;if (scale == scaleX){p.Y = (int)((p.Y - (pictureBox1.Height - tree.MaxHeight / scale) / 2) * scale);p.X = (int)(p.X * scale);}else{p.X = (int)((p.X - (pictureBox1.Width - tree.MaxWidth / scale) / 2) * scale);p.Y = (int)(p.Y * scale);}break;case PictureBoxSizeMode.StretchImage:p.X = (int)(p.X * scaleX);p.Y = (int)(p.Y * scaleY);break;}Tree<string> nodeB = null;bool rectClicked = false;foreach (var node in nodes){if (node.Rec.Contains(p)){nodeB = node;rectClicked = true;break;}}if (rectClicked){nodeB.IsClick = false;Bitmap bmp = tree.DrawAsImage();pictureBox1.Image = bmp;pictureBox1.Refresh();}}}private void btn1_Click(object sender, EventArgs e){switch (cmbOrientation.SelectedItem.ToString()) {case "水平":foreach(var tree in nodes)tree.OrientationMode = Orientation.Horizontal;break;case "垂直":foreach(var tree in nodes)tree.OrientationMode = Orientation.Vertical;break;}int hinterval,vinterval;if (!int.TryParse(txtHinterval.Text, out hinterval) || !int.TryParse(txtVinterval.Text, out vinterval)){MessageBox.Show("横向间距和纵向间距只能设置为整数");return;}else {tree.HInterval = hinterval;tree.VInterval = vinterval;}Bitmap bmp = tree.DrawAsImage();pictureBox1.Image = bmp;pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;pictureBox1.Refresh();}       }
}

Winform 做一个组织机构思维导图相关推荐

  1. 那些年做的xmind思维导图

    平时经常对着电脑基本上都不怎么看手机了,前几天翻弄手机里面的照片,猛然发现了之前学java做的思维导图,时间过得的真快, 一晃就是一年多了,才想起来之前做的那么多脑图的源文件全部都在我用的上一台电脑, ...

  2. CISA备考分享-学会做知识点巩固+思维导图

    考试契机 由于日常工作较为饱满,同时我还面临硕士毕业论文撰写的压力,因此对于考试我没有过多准备时间,就选择了谷安,为考试指明方向. 我个人应该属于学习能力较强的,在此之前裸考通过了研究生全国统考招生. ...

  3. 怎样做精美的思维导图,简单方法介绍

    会制作思维导图与绘制精美的思维导图是有差距的,在绘制思维导图时我们可以利用在线网站进行绘制使用,这样会节约很多时间并且绘制的思维导图会较完美一点,那要精美的思维导图怎样做呢?下面是小编常用的操作方法, ...

  4. 网络推广有什么作用?如何做推广分析思维导图

    网络推广,相信大家都不陌生吧,一个成功的网络推广可以提高企业知名度,塑造品牌形象,同时可以带来销售转化,很多企业.个人从事的一些比较大的项目,他们不知道推广到底有什么用,也不去尝试推广,导致客户稀少, ...

  5. 收藏一个在线思维导图的制作网站

    https://www.processon.com/ 转载于:https://www.cnblogs.com/132818Creator/p/11447077.html

  6. 如何使用思维导图做计划?这样绘制思维导图的方法你使用过吗?

    用思维导图做计划确实是比较快捷高效的,不仅带来了帮助,还给大家的工作,生活,学习等带来了很多乐趣,下面结合小编应用思维导图的经历给大家讲解绘制思维导图做计划的操作技巧,希望对大家有所帮助. 绘制工具- ...

  7. 双11又要到了,今年的活动方案应该怎么做?这里有一份思维导图

    双十一将至,在各个电商平台卷的飞起的店铺运营们相信都已经蓄势待发.寸土不让的想要从每年一度的购物狂潮中分得一杯羹,同时又是买买买疯狂剁手一年胜似一年. 如何在一年一度的购物狂欢中让消费者激情不减,真实 ...

  8. 如何画一个精致的思维导图

    画思维导图和画一个精致的思维导图还是有很大的区别的,不仅对软件要求比较高,还要将内容更加的丰富,所以就需要下功夫啦,下面交给大家画精致思维导图的操作方法,想要使用的朋友可以参考使用. 工具/原料: 迅 ...

  9. word流程图两条线的端点连接_GitMind免费的思维导图+流程图制作工具

    - 正文来啦 (" ̄︶ ̄) - 不论是工作还是学习,经常会涉及到绘制一些可视化的图形或图表,比如流程图.组织架构图.思维导图等. 使用专业的工具太繁琐,费用也昂贵, 使用传统的 office ...

最新文章

  1. linux Makefile编写的整理
  2. linux man手册_读书笔记:Linux命令行与shell脚本编程大全 第一章~第五章
  3. go读取excel_Golang操作Excel
  4. Git笔记(5) 状态记录
  5. UI设计师应该知道的,APP设计师的辅助小工具网站集合导航
  6. linux box 信息发布,使用Instantbox快速搭建一个开箱即用的Web端临时Linux系统
  7. Call to localhost/127.0.0.1:9000 failed on connection exception:java.net.ConnectException的解决方案
  8. 用代码来理解 C#委托与事件
  9. mybatis mysql 自增_利用Java的MyBatis框架获取MySQL中插入记录时的自增主键
  10. C语言爱心代码大全2022合集(可领)
  11. 贪吃蛇-单机游戏-微信小程序项目开发流程详解
  12. TBS1237 1/4 扫 48 通道 LED 背光驱动芯片
  13. 使用奇东锐腾PXE网克工具进行批量装机和系统恢复
  14. Unity利用双相机巧做水印功能
  15. java 处理物料清单_ERP之物料清单(BOM)
  16. uni-app-------长按下载图片
  17. Python使用pycrypto进行RSA长字符串加密
  18. Spring Integration基本用法
  19. android 按钮回弹效果,Android仿IOS回弹效果 支持任何控件
  20. linux教程:查看端口占用情况及开放关闭端口

热门文章

  1. ANSYS Workbench 19.0结构仿真分析初学视频教程
  2. 软件测试,如何测试网站的安全性呢
  3. 数据分析:工作平台【非编程类:STATA、SPASS、MatLab】【编程类:Python、R语言】
  4. vim入门及常用命令
  5. Ubuntu18.04安装ros-melodic教程(2021-11-18)
  6. 【HDU3949 + BZOJ2115 + CF724G】【异或线性基例题】| 倍增 | 第k小异或和 | DFS处理环 |【CGWR】| N
  7. 解读STEAM教育中的表现性评价
  8. 一般四边形的面积公式
  9. ggplot2——绘制基本几何图形
  10. 【环境配置】Turtlebot2 激光雷达+深度相机 GAZEBO仿真