gpt4 book ai didi

c# - 如何将用作按钮的禁用 PictureBox 变灰?

转载 作者:行者123 更新时间:2023-12-02 16:41:25 27 4
gpt4 key购买 nike

我在我的应用程序的主仪表板中使用 Picturebox 控件作为按钮。
PictureBox 当然有一个标识 Button 函数的图像。

如果我使用普通的按钮控件,禁用时,按钮的图像会自动变灰。
使用 PictureBox 不会发生这种情况。

如何使用 Picturebox 生成相同的效果

最佳答案

选项 1:CustomControl (PictureBox) + ColorMatrix

由于您不想使用 Button,当 Control 被禁用时,它会使图像变灰,因此您可以使用 ColorMatrixPictureBox.BackgroundImage 或 (Image) 更改为灰度。

您在此处看到的 GrayScale 矩阵使用众所周知的值将 Image 转换为缩放的灰色表示形式。您可以找到可能生成不同结果的同一矩阵对象的其他解释。
测试一些或自己调整它会很有趣。

GrayScale 程序实现为 Extension method ,因为它在其他情况下可能会派上用场。
它扩展了 Image 类,添加了一个 ToGrayScale() 方法(你当然也可以扩展 Bitmap 类:你只需要调用 Image 扩展,将 Bitmap 转换为 Image,或者反过来,随心所欲)。


假设您有一个自定义控件,当 BackgroundImage 发生变化时,您可以创建它的 GrayScale 表示并存储它。

然后覆盖 OnEnabledChanged 以将 BackgroundImage 更改为原始版本或其 GrayScale 版本。一个简单的检查可以防止代码在 BackgroundImage 内部更改时生成新的 GrayScale 图像(这是一种稍微简化的方法,您应该改为绘制背景。我会尽可能更新它)。

GrayScale Matrix PictureBox Image

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

[DesignerCategory("Code")]
public class ButtonPicture : PictureBox
{
private Image m_sourceImage = null;
private Image m_grayImage = null;

public ButtonPicture() { }

protected override void OnEnabledChanged(EventArgs e) {
base.OnEnabledChanged(e);
this.BackgroundImage = this.Enabled ? m_sourceImage : m_grayImage;
}

protected override void OnBackgroundImageChanged(EventArgs e) {
base.OnBackgroundImageChanged(e);
if (this.BackgroundImage == m_sourceImage ||
this.BackgroundImage == m_grayImage) return;
m_sourceImage = this.BackgroundImage;
m_grayImage = m_sourceImage.ToGrayScale();
}

protected override void Dispose(bool disposing) {
if (disposing) {
m_grayImage.Dispose();
}
base.Dispose(disposing);
}
}

扩展方法:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

public static class ImageExtensions
{
static ColorMatrix grayMatrix = new ColorMatrix(new float[][]
{
new float[] { .2126f, .2126f, .2126f, 0, 0 },
new float[] { .7152f, .7152f, .7152f, 0, 0 },
new float[] { .0722f, .0722f, .0722f, 0, 0 },
new float[] { 0, 0, 0, 1, 0 },
new float[] { 0, 0, 0, 0, 1 }
});

public static Bitmap ToGrayScale(this Image source) {
var grayImage = new Bitmap(source.Width, source.Height, source.PixelFormat);
grayImage.SetResolution(source.HorizontalResolution, source.VerticalResolution);

using (var g = Graphics.FromImage(grayImage))
using (var attributes = new ImageAttributes()) {
attributes.SetColorMatrix(grayMatrix);
g.DrawImage(source, new Rectangle(0, 0, source.Width, source.Height),
0, 0, source.Width, source.Height, GraphicsUnit.Pixel, attributes);
return grayImage;
}
}
}


选项 2:ControlPaint + PictureBox.Paint 事件(蹩脚)

您可以使用 ControlPaint.DrawImageDisabled()绘制禁用位图的方法。

  • 方法所需的图形对象由控件的 PaintEventArgs 提供。 : 订阅 PictureBox.Paint 事件并将 e.Graphics 对象传递给该方法。
  • Image 参数可以是 PictureBox.Image 属性值的副本。
  • 唯一的优点是您需要的代码少得多,但无法控制默认实现,结果有问题(但对于一般用途来说可能足够好)。

► 比较左边的图像,使用 ColorMatrix 禁用,与右边的图像,使用 ControlPaint 方法禁用:

ControlPaint PictureBox disabled Image

private void buttonPicture_Paint(object sender, PaintEventArgs e)
{
var pict = sender as PictureBox;
if (pict != null && (!pict.Enabled)) {
using (var img = new Bitmap(pict.Image, pict.ClientSize)) {
ControlPaint.DrawImageDisabled(e.Graphics, img, 0, 0, pict.BackColor);
}
}
}

关于c# - 如何将用作按钮的禁用 PictureBox 变灰?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61566125/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com