mirror of
				https://github.com/bolucat/Archive.git
				synced 2025-10-31 11:57:05 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Shadowsocks.Controller;
 | |
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Drawing;
 | |
| using System.Drawing.Drawing2D;
 | |
| using System.Drawing.Imaging;
 | |
| using System.Linq;
 | |
| using System.Reflection;
 | |
| using System.Windows.Forms;
 | |
| 
 | |
| namespace Shadowsocks.Util
 | |
| {
 | |
|     public static class ViewUtils
 | |
|     {
 | |
|         public static IEnumerable<TControl> GetChildControls<TControl>(this Control control) where TControl : Control
 | |
|         {
 | |
|             if (control.Controls.Count == 0)
 | |
|             {
 | |
|                 return Enumerable.Empty<TControl>();
 | |
|             }
 | |
|             var children = control.Controls.OfType<TControl>().ToList();
 | |
|             return children.SelectMany(GetChildControls<TControl>).Concat(children);
 | |
|         }
 | |
| 
 | |
|         public static IEnumerable<MenuItem> GetMenuItems(Menu m)
 | |
|         {
 | |
|             if (m?.MenuItems == null || m.MenuItems.Count == 0) return Enumerable.Empty<MenuItem>();
 | |
|             var children = new List<MenuItem>();
 | |
|             foreach (var item in m.MenuItems)
 | |
|             {
 | |
|                 children.Add((MenuItem)item);
 | |
|             }
 | |
|             return children.SelectMany(GetMenuItems).Concat(children);
 | |
|         }
 | |
| 
 | |
|         // Workaround NotifyIcon's 63 chars limit
 | |
|         // https://stackoverflow.com/questions/579665/how-can-i-show-a-systray-tooltip-longer-than-63-chars
 | |
|         public static void SetNotifyIconText(NotifyIcon ni, string text)
 | |
|         {
 | |
|             if (text.Length >= 128)
 | |
|                 throw new ArgumentOutOfRangeException("Text limited to 127 characters");
 | |
|             Type t = typeof(NotifyIcon);
 | |
|             BindingFlags hidden = BindingFlags.NonPublic | BindingFlags.Instance;
 | |
|             t.GetField("text", hidden).SetValue(ni, text);
 | |
|             if ((bool)t.GetField("added", hidden).GetValue(ni))
 | |
|                 t.GetMethod("UpdateIcon", hidden).Invoke(ni, new object[] { true });
 | |
|         }
 | |
| 
 | |
|         public static Bitmap AddBitmapOverlay(Bitmap original, params Bitmap[] overlays)
 | |
|         {
 | |
|             Bitmap bitmap = new Bitmap(original.Width, original.Height, PixelFormat.Format64bppArgb);
 | |
|             Graphics canvas = Graphics.FromImage(bitmap);
 | |
|             canvas.DrawImage(original, new Point(0, 0));
 | |
|             foreach (Bitmap overlay in overlays)
 | |
|             {
 | |
|                 canvas.DrawImage(new Bitmap(overlay, original.Size), new Point(0, 0));
 | |
|             }
 | |
|             canvas.Save();
 | |
|             return bitmap;
 | |
|         }
 | |
| 
 | |
|         public static Bitmap ChangeBitmapColor(Bitmap original, Color colorMask)
 | |
|         {
 | |
|             Bitmap newBitmap = new Bitmap(original);
 | |
| 
 | |
|             for (int x = 0; x < newBitmap.Width; x++)
 | |
|             {
 | |
|                 for (int y = 0; y < newBitmap.Height; y++)
 | |
|                 {
 | |
|                     Color color = original.GetPixel(x, y);
 | |
|                     if (color.A != 0)
 | |
|                     {
 | |
|                         int red = color.R * colorMask.R / 255;
 | |
|                         int green = color.G * colorMask.G / 255;
 | |
|                         int blue = color.B * colorMask.B / 255;
 | |
|                         int alpha = color.A * colorMask.A / 255;
 | |
|                         newBitmap.SetPixel(x, y, Color.FromArgb(alpha, red, green, blue));
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         newBitmap.SetPixel(x, y, color);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             return newBitmap;
 | |
|         }
 | |
| 
 | |
|         public static Bitmap ResizeBitmap(Bitmap original, int width, int height)
 | |
|         {
 | |
|             Bitmap newBitmap = new Bitmap(width, height);
 | |
|             using (Graphics g = Graphics.FromImage(newBitmap))
 | |
|             {
 | |
|                 g.SmoothingMode = SmoothingMode.HighQuality;
 | |
|                 g.InterpolationMode = InterpolationMode.HighQualityBicubic;
 | |
|                 g.PixelOffsetMode = PixelOffsetMode.HighQuality;
 | |
|                 g.CompositingQuality = CompositingQuality.HighQuality;
 | |
|                 g.DrawImage(original, new Rectangle(0, 0, width, height));
 | |
|             }
 | |
|             return newBitmap;
 | |
|         }
 | |
| 
 | |
|         public static int GetScreenDpi()
 | |
|         {
 | |
|             Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);
 | |
|             int dpi = (int)graphics.DpiX;
 | |
|             graphics.Dispose();
 | |
|             return dpi;
 | |
|         }
 | |
|     }
 | |
| }
 | 
![github-action[bot]](/assets/img/avatar_default.png)