大概1年没有更新, 突然有人私信想进一步完善,故用winform的用户自定义控件开发类型Genesis2000层列表效果
多层叠加显示用到的技术是RGB像素化后,叠加.部分代码如下
//绘图
Bitmap showBitmap = new Bitmap(drawPanel1.Width, drawPanel1.Height);
int ccc = ComInfo.showBitmaps.Count;
foreach (DictionaryEntry item in ComInfo.showBitmaps)
{
if (!ComInfo.showBitmapsRGB.ContainsKey(item.Key.ToString()))
{
Bitmap bmp1 = (Bitmap)item.Value;
BitmapData data = bmp1.LockBits(new Rectangle(0, 0, bmp1.Width, bmp1.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
IntPtr ptr = data.Scan0;
int bytes = bmp1.Width * bmp1.Height * 3;
byte[] rgbValues = new byte[bytes]; // Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
bmp1.UnlockBits(data);
ComInfo.showBitmapsRGB.Add(item.Key.ToString(), rgbValues);
}
}
BitmapData data3 = showBitmap.LockBits(new Rectangle(0, 0, showBitmap.Width, showBitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
IntPtr ptr3 = data3.Scan0;
int bytesLength = showBitmap.Width * showBitmap.Height * 3;
byte[] rgbValues_ = new byte[bytesLength];
int i = 0;
foreach (var item in ComInfo.showBitmapsRGB)
{
var byteRgb = item.Value;
for (int j = 0; j < rgbValues_.Length; j++)
{
rgbValues_[j] += (byte)((int)byteRgb[j]);
if ((int)rgbValues_[j] > 255)
{
rgbValues_[j] = 255;
}
}
i += 1;
}
System.Runtime.InteropServices.Marshal.Copy(rgbValues_, 0, ptr3, bytesLength);
showBitmap.UnlockBits(data3);
//加profile
ComInfo.profileBitmap = ComInfo.DrawProfile(showBitmap);
//显示
drawPanel1.BackgroundImage = ComInfo.profileBitmap;