请问C# winform如何实现将一个不规则形状的图片弄成按键?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问C# winform如何实现将一个不规则形状的图片弄成按键?相关的知识,希望对你有一定的参考价值。

编译软件是visual studio,想自己用PS或其它绘图软件画两个不规则图形A与B,然后将这两个不规则图形放到winform里面充当按键,当鼠标离开按键的时候显示图形A,当鼠标悬停或点击的时候显示图形B。请问如何能做到这种效果?

您可以使用自定义控件来实现这种效果。首先,创建一个继承自System.Windows.Forms.Control的类,然后重写其OnPaint方法来绘制不规则形状的图片。然后,通过在控件上附加鼠标事件处理器,来切换显示图形A和图形B。以下是一个简单的代码示例:
using System;
using System.Drawing;
using System.Windows.Forms;

public class IrregularButton : Control

private Image _imageA;
private Image _imageB;

public IrregularButton()

this.BackColor = Color.Transparent;
this.MouseEnter += new EventHandler(IrregularButton_MouseEnter);
this.MouseLeave += new EventHandler(IrregularButton_MouseLeave);
this.MouseDown += new MouseEventHandler(IrregularButton_MouseDown);
this.MouseUp += new MouseEventHandler(IrregularButton_MouseUp);


public Image ImageA

get return _imageA;
set _imageA = value;


public Image ImageB

get return _imageB;
set _imageB = value;


protected override void OnPaint(PaintEventArgs e)

if (_imageA != null)

e.Graphics.DrawImage(_imageA, new Rectangle(0, 0, this.Width, this.Height));



private void IrregularButton_MouseEnter(object sender, EventArgs e)

if (_imageB != null)

this.Invalidate();



private void IrregularButton_MouseLeave(object sender, EventArgs e)

if (_imageA != null)

this.Invalidate();



private void IrregularButton_MouseDown(object sender, MouseEventArgs e)

if (_imageB != null)

this.Invalidate();



private void IrregularButton_MouseUp(object sender, MouseEventArgs e)

if (_imageA != null)

this.Invalidate();




您可以在WinForm窗体中使用这个自定义控件,并设置ImageA和ImageB属性来设置图形A和图形
参考技术A 一看你就不是C++转过来的,最简单的办法是winform按钮设置省flag然后把边设置为0。这种是有缺点的,你按他的时候不怎么生动,要生动点那就给他按钮事件,鼠标enter、leave、mouseup、mousedown、mousemove全部给全,每一个事件按钮的样子要先P好。然后设置按钮弧度。有人说为什么不用图片去处理,你不要自作聪明,图片是要缓冲的,多了你就头痛了。
这样做你会发现每个按钮都要去写,很头痛,那就做成自定义控件。
参考技术B 涉及知识:控件重绘、自定义控件(User Control类继承)
先创建自定义控件,
1、让后将backcolor设置为transparents(透明),
2、再为控件添加Mouse_Enter和Mouse_Leave事件,
3、定义重绘函数,例如RePaint(object sender,PaintEventArgs e)(名字随便起,参数要一样)
4、定义int变量用于指示状态,一个数字表示一个状态,例如0表示普通状态,1表示悬停状态,2表示按下后状态......
3、Mouse_Enter时先修改自定义变量,再执行Validate(RePaint)函数
4、再在重绘函数中画图,如果是提前ps好的,可以直接加载图片绘制
参考技术C 可以使用 Visual Studio 的图形控件将不规则图形 A 和 B 作为图片放到 Winform 控件中,然后使用事件 MouseLeave 和 MouseDown 来设置不同图片的显示效果。代码如下:
Private Sub PictureBox1_MouseLeave(sender As Object, e As EventArgs) Handles PictureBox1.MouseLeave
PictureBox1.Image = Image.FromFile("path-to-image-A")
End Sub
Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
PictureBox1.Image = Image.FromFile("path-to-image-B")
End Sub
参考技术D 这个实现起来比较麻烦。首先做两个透明png图片,然后获取图片的不透明区域的region,然后每隔25ms获取鼠标位置,判断该点是否在region内部,如果是就切换图片并将Enable设为true,离开区域就切换回来。
PS:其他人的方法点击区域是矩形而不是不规则图形。

以上是关于请问C# winform如何实现将一个不规则形状的图片弄成按键?的主要内容,如果未能解决你的问题,请参考以下文章

请问如何将C# Winform 上所有TextBox值清空

C# WinForm中,当验证一个textBox的输入内容,然后弹出提示信息,如下图: 请问各位大牛,如何实现?急!

C# winform- 选择卡问题 : 想要通过单击Tabpage A 中的按钮实现 转换到Tabpage B 中,请问如何实现?

C# (winform)如何改变控件形状

对VS中的winform窗体,如何用代码实现子控件在父控件中的相对位置的设置?请问C#语言实现

c#中我要实现大量的httpwebrequest,但是不想winform假死住,请问用多线程还是异步?