关于Winform的无边框窗体实现,网络上有很多大牛文章,这里不赘述。我也是参考网络上的思路,在使用别人的代码基础上,发现和遇到了很多小问题,所以做了改造,以下做个记录,也是给需要的人提供一点思路,如果您发现有不对的地方,还请评论区给予批评和指正!

本类只是一个影子窗体类,实现的基础功能是依附于主窗体(您随便建个Winform窗体),创建这个影子窗体类即可,当然,前提是主窗体要设置无边框模式,效果才好。

本类实现和解决大概以下几个问题:

1、为主窗体实现阴影功能(可设置阴影长度,偏移量、透明度、颜色,圆角等属性);

2、为主窗体实现拖拽改变大小功能;

3、解决窗体层级问题,在多个窗口使用影子窗体时,重叠窗体后,会出现影子窗体在上,主窗体在下的情况,类似下图:

4、将拖拽、改变大小功能放入影子窗体,减少主窗体代码量;

5、解决影子长度太小(只设置1px)时,四周显示不全的问题;

6、提供两种阴影偏移量的解决方案(详见代码注释),目前使用第二种方案;

7、其他功能点优化;

下面将代码全文放在下面,以供参考和指正:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;namespace Demo
{public partial class ShadowForm:Form{private Bitmap shadowBitmap; private int shadowOpacity = 60;private int shadowSpread = 6;private int HitSplit = 4;  //鼠标拖动窗体大小时判断可操作范围private Rectangle RecInner = Rectangle.Empty;private Rectangle RecBorderLeft = Rectangle.Empty;private Rectangle RecBorderLeftTop = Rectangle.Empty;private Rectangle RecBorderLeftBottom = Rectangle.Empty;private Rectangle RecBorderRight = Rectangle.Empty;private Rectangle RecBorderRightTop = Rectangle.Empty;private Rectangle RecBorderRightBottom = Rectangle.Empty;private Rectangle RecBorderTop = Rectangle.Empty;private Rectangle RecBorderBottom = Rectangle.Empty;#region 属性/// <summary>/// 阴影图片/// </summary>public Bitmap ShadowBitmap{get { return shadowBitmap; }set{shadowBitmap = value;SetBitmap(shadowBitmap);}}/// <summary>/// 阴影颜色/// </summary>public Color ShadowColor { get; set; } = Color.Black;/// <summary>/// 阴影透明度/// </summary>public int ShadowOpacity{get { return shadowOpacity; }set{shadowOpacity = Math.Max(Math.Min(value, 255), 0);SetBitmap(ShadowBitmap);}}/// <summary>/// 阴影横向偏移值/// </summary>public int ShadowH { get; set; } = 0;/// <summary>/// 阴影纵向偏移值/// </summary>public int ShadowV { get; set; } = 0;/// <summary>/// 阴影模糊值/// </summary>public int ShadowBlur { get; set; } = 0;/// <summary>/// 阴影扩展值/// </summary>public int ShadowSpread{get { return shadowSpread; }set{shadowSpread = Math.Max(value, 0);}}/// <summary>/// 窗体圆角度/// </summary>public int CornerRound { get; set; } = 0;/// <summary>/// 主子窗体X方向偏移量/// </summary>public int OffsetX{get { return (ShadowH > 0 ? 0 : ShadowH) - ShadowSpread; }}/// <summary>/// 主子窗体Y方向偏移量/// </summary>public int OffsetY{get { return (ShadowV > 0 ? 0 : ShadowV) - ShadowSpread; }}public bool CanResize { get; set; } = true;#endregionpublic ShadowForm(fmBase master){Owner = master; //设置主子窗口  #region 设置影子窗口的属性参数AutoScaleMode = AutoScaleMode.None;FormBorderStyle = FormBorderStyle.None;MaximizeBox = false;MinimizeBox = false;this.Name = "ShadowForm";ShowInTaskbar = false;#endregion#region 减少闪烁this.DoubleBuffered = true;SetStyle(ControlStyles.UserPaint |ControlStyles.AllPaintingInWmPaint |ControlStyles.OptimizedDoubleBuffer |ControlStyles.ResizeRedraw |ControlStyles.DoubleBuffer, true);//强制分配样式重新应用到控件上UpdateStyles();#endregionif (Owner != null){//跟随主子移动位置Owner.LocationChanged += (sender, e) =>{Shadow_LocationChanged(sender, e);};//主子关闭时,跟着关闭并且释放Owner.FormClosed += (sender, e) =>{Close();this.Dispose();};//窗体移动Owner.MouseMove += (sender, e) => {if (e.Button == MouseButtons.Left){ReleaseCapture();SendMessage(Owner.Handle, WM_SYSCOMMAND, new IntPtr(0xF010 + HTCAPTION), new IntPtr(0));}};//窗体激活时,让主子窗体和影子窗体实现形影不离(多个窗口重叠交叉显示时尤为重要)Owner.Activated += FormActivated; this.Activated += FormActivated; } }private void FormActivated(object sender, EventArgs e){if (Owner == null) return;IntPtr CurWinHandle = GetForegroundWindow();IntPtr NextWinHandle = GetWindow(CurWinHandle, GW_HWNDNEXT);if (CurWinHandle == this.Handle){if (NextWinHandle == Owner.Handle) return;IntPtr other = FindOther(CurWinHandle, Owner.Handle);if (other != IntPtr.Zero){ SetForegroundWindow(Owner.Handle); } return;}if (CurWinHandle == Owner.Handle){if (NextWinHandle == this.Handle) return;IntPtr other = FindOther(CurWinHandle, this.Handle);if (other != IntPtr.Zero){ SetForegroundWindow(this.Handle); } return;}}private IntPtr FindOther(IntPtr win, IntPtr other){IntPtr ptr = GetWindow(win, GW_HWNDNEXT);while (ptr != IntPtr.Zero){if (ptr == other){ return ptr;}ptr = GetWindow(ptr, GW_HWNDNEXT);}return IntPtr.Zero;}protected override CreateParams CreateParams{get{CreateParams cp = base.CreateParams;cp.ExStyle |= WS_EX_LAYERED; return cp;}}protected override void OnMouseMove(MouseEventArgs e){base.OnMouseMove(e);}public void Shadow_LocationChanged(Object sender, EventArgs eventArgs){Point pos = Owner.Location;pos.Offset(OffsetX, OffsetY);Location = pos; }private void Shadow_SizeChanged(object sender, EventArgs e){Point pos = Location;pos.Offset(-OffsetX, -OffsetY);Owner.Location = pos;Size size = new Size(this.Width - (ShadowSpread + ShadowBlur + CornerRound) * 2, this.Height - (ShadowSpread + ShadowBlur + CornerRound) * 2);Owner.Size = size;RefreshShadow(true, true); }/// <summary>///  重绘阴影/// </summary>/// <param name="redraw">是否重绘</param>/// <param name="reLoaction">是否重定位</param>public void RefreshShadow(bool redraw = true, bool reLoaction = true){this.SizeChanged -= Shadow_SizeChanged; this.Size = new Size(Owner.Width + ShadowSpread * 2 + Math.Abs(ShadowH), Owner.Height + ShadowSpread * 2 + Math.Abs(ShadowV));if (redraw){ShadowBitmap = DrawShadowBitmap();}if (reLoaction){Shadow_LocationChanged(null, null);}// 设置显示区域Region r = new Region(this.ClientRectangle);  //(1, 1, Width - 1, Height - 1));if (CornerRound > 0){r = Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height,  ShadowSpread + CornerRound, ShadowSpread + CornerRound));}Region or;if (Owner.Region == null)or = new Region(RecInner);  elseor = Owner.Region.Clone(); r.Exclude(or);Region = r;Owner.Refresh();this.SizeChanged += Shadow_SizeChanged;}#region 绘制阴影图像private Bitmap DrawShadowBitmap(){var bitmap = new Bitmap(this.Width, this.Height);Graphics g = Graphics.FromImage(bitmap);//必要设置,当ShadowSpread设置为1或2时,需要高质量绘制才能显示g.InterpolationMode = InterpolationMode.HighQualityBicubic;g.SmoothingMode = SmoothingMode.HighQuality;g.PixelOffsetMode = PixelOffsetMode.HighQuality;#region 计算边界 RecInner = new Rectangle(ShadowSpread - (ShadowH < 0 ? ShadowH : 0),ShadowSpread - (ShadowV < 0 ? ShadowV : 0),Owner.Width,Owner.Height);RecBorderLeft = new Rectangle(Math.Max(RecInner.X - 2, 0),RecInner.Y,2,RecInner.Height);RecBorderLeftTop = new Rectangle(Math.Max(RecInner.X - 2, 0),Math.Max(RecInner.Y - 2, 0),2,2);RecBorderLeftBottom = new Rectangle(Math.Max(RecInner.X - 2, 0),RecInner.Bottom,2,2);RecBorderTop = new Rectangle(RecInner.X,Math.Max(RecInner.Y - 2, 0),RecInner.Width,2);RecBorderRight = new Rectangle(RecInner.Right,RecInner.Y,2,RecInner.Height);RecBorderRightTop = new Rectangle(RecInner.Right,Math.Max(RecInner.Y - 2, 0),2,2);RecBorderRightBottom = new Rectangle(RecInner.Right,RecInner.Bottom,2,2);RecBorderBottom = new Rectangle(RecInner.X,RecInner.Bottom,RecInner.Width,2);/*   g.FillRectangle(Brushes.Yellow, 0, 0, this.Width, this.Height);g.FillRectangle(Brushes.Green, RecInner);Brush br = new SolidBrush(Color.FromArgb(1, Color.Gray));g.FillRectangle(br, RecBorderLeft);g.FillRectangle(br, RecBorderTop);g.FillRectangle(br, RecBorderLeftTop);g.FillRectangle(br, RecBorderLeftBottom);g.FillRectangle(br, RecBorderRight);g.FillRectangle(br, RecBorderRightTop);g.FillRectangle(br, RecBorderRightBottom);g.FillRectangle(br, RecBorderBottom);*/#endregionif (ShadowSpread > 0){#region 计算四边矩形Rectangle RecLeft = new Rectangle(0, ShadowSpread, ShadowSpread, Owner.Height);Rectangle RecTop = new Rectangle(ShadowSpread, 0, Owner.Width, ShadowSpread);Rectangle RecRight = new Rectangle(Owner.Width + RecLeft.Right, ShadowSpread, ShadowSpread, Owner.Height);Rectangle RecBottom = new Rectangle(ShadowSpread, Owner.Height + RecTop.Bottom, Owner.Width, ShadowSpread);#region 方案一:整个阴影部分根据ShadowH、ShadowV平移/* if (ShadowH > 0){RecLeft.Offset(ShadowH, 0);RecTop.Offset(ShadowH, 0);RecBottom.Offset(ShadowH, 0);RecLeft.Width = ShadowSpread - ShadowH;RecRight.Width += ShadowH;RecTop.Width -= ShadowH;RecBottom.Width -= ShadowH;}else if (ShadowH < 0){RecTop.Offset(-ShadowH, 0);RecRight.Offset(ShadowH, 0);RecBottom.Offset(-ShadowH, 0);RecLeft.Width -= ShadowH;RecTop.Width += ShadowH * 2;RecRight.Width = ShadowSpread + ShadowH;RecBottom.Width += ShadowH * 2;}if (ShadowV > 0){RecLeft.Offset(0, ShadowV);RecTop.Offset(0, ShadowV);RecRight.Offset(0, ShadowV);RecTop.Height = ShadowSpread - ShadowV;RecBottom.Height += ShadowV;RecLeft.Height -= ShadowV;RecRight.Height -= ShadowV;}else if (ShadowV < 0){RecLeft.Offset(0, -ShadowV);RecRight.Offset(0, -ShadowV);RecBottom.Offset(0, ShadowV);RecTop.Height -= ShadowV;RecLeft.Height += ShadowV * 2;RecRight.Height += ShadowV * 2;RecBottom.Height = ShadowSpread + ShadowV;}*/#endregion#region 方案二:四周阴影部分不变,根据ShadowH、ShadowV延伸阴影if (ShadowH > 0){  RecRight.Width += ShadowH; }else if (ShadowH < 0){ RecTop.Offset(-ShadowH, 0); RecBottom.Offset(-ShadowH, 0);RecRight.Offset(-ShadowH, 0);RecLeft.Width -= ShadowH; }if (ShadowV > 0){RecBottom.Height += ShadowV;}else if (ShadowV < 0){RecLeft.Offset(0, -ShadowV);RecRight.Offset(0, -ShadowV);RecBottom.Offset(0, -ShadowV);RecTop.Height -= ShadowV; }#endregion/*g.FillRectangle(Brushes.Black, RecLeft);g.FillRectangle(Brushes.Black, RecTop);g.FillRectangle(Brushes.Black, RecRight);g.FillRectangle(Brushes.Black, RecBottom);  */#endregion#region 绘制四条边 LinearGradientBrush brush;// left if (RecLeft.Width > 0){brush = new LinearGradientBrush(new Point(RecLeft.X, RecLeft.Y), new Point(RecLeft.Right, RecLeft.Y), Color.Transparent, ShadowColor);g.FillRectangle(brush, RecLeft);}// top if (RecTop.Height > 0){// brush = new LinearGradientBrush(new Point(RecTop.X, RecTop.Bottom), new Point(RecTop.X, RecTop.Y), ShadowColor, Color.Transparent);brush = new LinearGradientBrush(new Point(RecTop.X, RecTop.Y), new Point(RecTop.X, RecTop.Bottom), Color.Transparent, ShadowColor);g.FillRectangle(brush, RecTop);//  g.FillRectangle(Brushes.Red, RecTop);}// right  if (RecRight.Width > 0){brush = new LinearGradientBrush(new Point(RecRight.X, RecRight.Y), new Point(RecRight.Right, RecRight.Y), ShadowColor, Color.Transparent);g.FillRectangle(brush, RecRight); }// down  if (RecBottom.Height > 0){brush = new LinearGradientBrush(new Point(RecBottom.X, RecBottom.Y), new Point(RecBottom.X, RecBottom.Bottom), ShadowColor, Color.Transparent);g.FillRectangle(brush, RecBottom);}#endregion#region  绘制四个角 // ltFillPie(g, new Rectangle(RecLeft.Left, RecTop.Top, RecLeft.Width * 2, RecTop.Height * 2), 180, 90);// rtFillPie(g, new Rectangle(RecRight.Left - RecRight.Width, RecTop.Top, RecRight.Width * 2, RecTop.Height * 2), 270, 90);// rbFillPie(g, new Rectangle(RecRight.Left - RecRight.Width, RecBottom.Top - RecBottom.Height, RecRight.Width * 2, RecBottom.Height * 2), 0, 90);// lbFillPie(g, new Rectangle(RecLeft.Left, RecBottom.Top - RecBottom.Height, RecLeft.Width * 2, RecBottom.Height * 2), 90, 90);#endregion}return bitmap;}private void FillPie(Graphics g, Rectangle rec, int startAngle, int sweepAngle){if ((rec.Width <= 0) || (rec.Height < 0))return;GraphicsPath gp = new GraphicsPath(); gp.AddEllipse(rec);PathGradientBrush pgb = new PathGradientBrush(gp);pgb.CenterColor = ShadowColor;pgb.SurroundColors = new[] { Color.Transparent };pgb.CenterPoint = new PointF(rec.Left + rec.Width / 2, rec.Top + rec.Height / 2);//g.FillPie(Brushes.Black, rec, 0, 360);g.FillPie(pgb, rec, startAngle, sweepAngle);}#endregion#region 绘制圆角public static void DrawRoundRectangle(Graphics g, Pen pen, Rectangle rect, int cornerRadius){using (GraphicsPath path = CreateRoundedRectanglePath(rect, cornerRadius)){g.DrawPath(pen, path);}}public static void FillRoundRectangle(Graphics g, Brush brush, Rectangle rect, int cornerRadius){using (GraphicsPath path = CreateRoundedRectanglePath(rect, cornerRadius)){g.FillPath(brush, path);}}internal static GraphicsPath CreateRoundedRectanglePath(Rectangle rect, int cornerRadius){GraphicsPath roundedRect = new GraphicsPath();roundedRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90);roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y);roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90);roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2);roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90);roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom);roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90);roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2);roundedRect.CloseFigure();return roundedRect;}#endregion#region 设置图片透明度public void SetBitmap(Bitmap bitmap){if (bitmap == null) return;if (bitmap.PixelFormat != PixelFormat.Format32bppArgb) return; IntPtr screenDc = GetDC(IntPtr.Zero);IntPtr memDc = CreateCompatibleDC(screenDc);IntPtr hBitmap = IntPtr.Zero;IntPtr oldBitmap = IntPtr.Zero; try{hBitmap = bitmap.GetHbitmap(Color.FromArgb(0));  oldBitmap = SelectObject(memDc, hBitmap); var size = new Size(bitmap.Width, bitmap.Height);var pointSource = new Point(0, 0);var topPos = new Point(Left, Top);var blend = new BLENDFUNCTION();blend.BlendOp = AC_SRC_OVER;blend.BlendFlags = 0;blend.SourceConstantAlpha = (byte)ShadowOpacity;blend.AlphaFormat = AC_SRC_ALPHA; UpdateLayeredWindow(Handle, screenDc, ref topPos, ref size, memDc, ref pointSource, 0, ref blend, ULW_ALPHA); }finally{ReleaseDC(IntPtr.Zero, screenDc);if (hBitmap != IntPtr.Zero){SelectObject(memDc, oldBitmap); DeleteObject(hBitmap);}DeleteDC(memDc);}}#endregion#region 拖动无边框窗体 改变无边框窗体尺寸  protected override void WndProc(ref Message m){ switch (m.Msg){ case WM_NCHITTEST:if ((Owner != null) && (CanResize)){ Point vPoint = new Point((int)m.LParam & 0xFFFF, (int)m.LParam >> 16 & 0xFFFF);vPoint = PointToClient(vPoint);base.WndProc(ref m);if (RecBorderLeft.Contains(vPoint))                 //左m.Result = (IntPtr)HIT_LEFT;else if (RecBorderLeftTop.Contains(vPoint))         //左上m.Result = (IntPtr)HIT_TOPLEFT;else if (RecBorderLeftBottom.Contains(vPoint))      //左下m.Result = (IntPtr)HIT_BOTTOMLEFT;else if (RecBorderTop.Contains(vPoint))             //上m.Result = (IntPtr)HIT_TOP;else if (RecBorderRight.Contains(vPoint))           //右m.Result = (IntPtr)HIT_RIGHT;else if (RecBorderRightTop.Contains(vPoint))        //右上m.Result = (IntPtr)HIT_TOPRIGHT;else if (RecBorderRightBottom.Contains(vPoint))     //右下m.Result = (IntPtr)HIT_BOTTOMRIGHT;else if (RecBorderBottom.Contains(vPoint))          //下m.Result = (IntPtr)HIT_BOTTOM;  return;} break; }base.WndProc(ref m);}#endregion#region 引用系统函数const int WS_EX_LAYERED = 0x00080000;const int WM_NCHITTEST = 0x0084;const int HIT_LEFT = 10;const int HIT_RIGHT = 11;const int HIT_TOP = 12;const int HIT_TOPLEFT = 13;const int HIT_TOPRIGHT = 14;const int HIT_BOTTOM = 15;const int HIT_BOTTOMLEFT = 16; const int HIT_BOTTOMRIGHT = 17;const int AC_SRC_OVER = 0x00;const int AC_SRC_ALPHA = 0x01;const int ULW_ALPHA = 0x00000002;const int GW_HWNDNEXT = 2;const int WM_SYSCOMMAND = 0x0112;const int HTCAPTION = 2;[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]static extern IntPtr GetDC(IntPtr hWnd);[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]static extern Bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize,IntPtr hdcSrc, ref Point pprSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);[DllImport("user32.dll", ExactSpelling = true)]static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]static extern IntPtr CreateCompatibleDC(IntPtr hDC);[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]static extern Bool DeleteDC(IntPtr hdc);[DllImport("gdi32.dll", ExactSpelling = true)]static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]static extern Bool DeleteObject(IntPtr hObject);[DllImport("user32.dll")][return: MarshalAs(UnmanagedType.Bool)]static extern bool SetForegroundWindow(IntPtr hWnd);[DllImport("user32.dll")]static extern IntPtr GetForegroundWindow();[DllImport("user32.dll")]static extern IntPtr GetWindow(IntPtr hWnd, uint wCmd);[DllImport("gdi32.dll")]static extern IntPtr CreateRoundRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nWidthEllipse, int nHeightEllipse);[DllImport("user32.dll")]static extern bool ReleaseCapture();[DllImport("USER32.DLL", EntryPoint = "SendMessage")]static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam);public enum Bool{False = 0,True};[StructLayout(LayoutKind.Sequential, Pack = 1)]public struct BLENDFUNCTION{public byte BlendOp;public byte BlendFlags;public byte SourceConstantAlpha;public byte AlphaFormat;}#endregion}}

最后,讲一下使用方法:

public fmBase(){InitializeComponent(); FormBorderStyle = FormBorderStyle.None;shadow = new ShadowForm(this); }private void fmBase_Load(object sender, EventArgs e){if (!DesignMode){  //如果需要设置属性,可以用以下方法,不设置也行,类中已有默认值shadow.ShadowOpacity = 100;shadow.ShadowBlur = 0;shadow.ShadowSpread = 6;shadow.ShadowH = 0;shadow.ShadowV = 0;shadow.CornerRound = 4;shadow.ShadowColor = Color.Black;} } }

好了,可以看见效果了,试试去吧!

最新文章

  1. 每天一道LeetCode-----在字符方格中查找某个单词
  2. c语言变量作为数组长度,为什么在C中不允许将数组的大小作为常量变量但在C中允许?...
  3. python 画布包括不了全部组件?_试验程序:画布版九键琴
  4. JCO 自定义DestinationDataProvider
  5. 2018拼多多内推校招编程题
  6. 【Hadoop】Hadoop生态圈基本组件介绍
  7. 【题解】Luogu P2147 [SDOI2008]洞穴勘测
  8. 伺服驱动器cn1引脚定义_伺服驱动器CN1引脚定义,和面板操作设置,跪求高手指点。...
  9. 根号在c语言中语言表达式,在c语言中根号如何表示,谢啦
  10. ai自动生成字幕软件有哪些?自动生成字幕软件推荐!
  11. 求一个向量变换为另一个向量的矩阵_机器学习数学-矩阵
  12. App上实现用户手写签名保存为透明PNG格式图片
  13. linux网络驱动 poll,网络 – Linux网络驱动程序中的并发:probe()VS ndo_open(),ndo_start_xmit()VS NAPI poll()...
  14. 基于DFSMN-CTC及CTC-CE联合训练的声学模型
  15. 作为职场过来人,推荐10个可以提高工作效率的办公软件
  16. 文本过滤器Filters
  17. Linux Qt cannot find -lGL
  18. 基础数学(八)——期末考试复习
  19. 公司企业邮箱怎么选择?哪家企业邮箱品牌最好用?
  20. excel 域 邮件合并_如何获得免费的电子邮件域(5种快速简便的方法)

热门文章

  1. 实力出圈!联诚发LED屏与xr虚拟拍摄解决方案亮相文博会!
  2. 怎么实现手机端网页页面自适应调整
  3. random库 随机数函数
  4. 有理数四则运算(20)
  5. Dockerfile ARG指令 语法解析
  6. discuz!论坛开发积分充值插件教程
  7. 计算机视觉应用参考文献,计算机视觉的应用与发展综述 计算机视觉论文.doc
  8. web课程设计网页规划与设计:中国风茶文化网站设计(6个页面) HTML+CSS+JavaScript...
  9. 为什么乔布斯最欣赏扎克伯格?
  10. Docker学习笔记(二)--进阶篇