技术开发 频道

VS2010与Win7共舞 :任务栏缩略图

    对缩略图的自定义是通过Windows7.DesktopIntegration中的CustomWindowsManager类来实现的。例如,我们可以通过这个类处理ThumbnailRequested请求,在其中完成缩略图的自定义。在这个例子中,我们将应用程序中打开的图片灰度化后作为新的自定义的缩略图。我们在应用程序的主界面上添加一个按钮“自定义缩略图”并将其点击函数实现如下:

// 定义Form层级的CustomWindowsManager对象
CustomWindowsManager _customWindowManager;
private void CustomThumbBtn_Click(object sender, EventArgs e)
{
// 判断_customWindowManager是否为空
// 在自定义缩略图和默认缩略图之间切换
if (_customWindowManager != null)
{
// 取消自定义缩略图
_customWindowManager.DisablePreview();
_customWindowManager = null;
}
else
{
// 创建对象
_customWindowManager = CustomWindowsManager.CreateWindowsManager(Handle);
// 使用窗口屏幕截图作为窗口选取的缩略图
_customWindowManager.PeekRequested += (o, args) => args.UseWindowScreenshot = true;
// 对缩略图请求进行自定义
_customWindowManager.ThumbnailRequested += (o, args) =>
{
// 根据PictureBox显示的图片创建缩略图
Bitmap image = (Bitmap)(pictureShowBox.Image.GetThumbnailImage(
200, 199, null, IntPtr.Zero));

// 对图像进行自定义处理
// 将图像处理成灰度图像
BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

//循环处理所有图像像素
unsafe
{
byte* ptr = (byte*)(data.Scan0);
for (int i = 0; i < data.Height; i++)
{
for (int j = 0; j < data.Width; j++)
{
// 图像灰度化
byte nGray, R, G, B;
R = *ptr;
G = *++ptr;
B = *++ptr;
ptr -= 2;
nGray = (byte)(0.299 * (double)R
+ 0.587 * (double)G
+ 0.114 * (double)B);

*ptr = nGray;
ptr++;
*ptr = nGray;
ptr++;
*ptr = nGray;
ptr++;
}
ptr += data.Stride - data.Width * 3;
}
}

image.UnlockBits(data);

// 将灰度化后的图像显示为缩略图
Bitmap bitmap = new Bitmap(args.Width, args.Height);
using (Graphics g = Graphics.FromImage(bitmap))
{
// 绘制到缩略位图上
g.DrawImage(image, 0, 0);
}
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);

// 替换缩略图,也即将我们绘制的灰度图像显示为缩略图
// 完成缩略图的自定义
args.Bitmap = bitmap;
};
}
}

0
相关文章