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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# (winform)如何改变控件形状相关的知识,希望对你有一定的参考价值。

我想把toolstrip的圆角改成直角 网上说重写onpaint事件 但我不知道怎么重写onpaint事件啊

参考技术A 选中toolstrip然后在属性窗口的方法中找,有paint事件,双击就会生成窗体事件方法,参数e里能获取到绘图对象e.Griphic。然后就可以用这个对象进行绘图和绘制文字了,绘制方法都是Draw***的,看下提示就能看动,然后按要求传参就可以了,如果要填充颜色从方法Fill***里找 参考技术B

给个图片,建议学下dc对象,由浅入深

参考技术C toolstrip 什么圆角了, 截个图来看看? 参考技术D 用颜色应该可以控制吧!就好像有些不规则窗体就是这么干的 ! 第5个回答  2015-10-07 IJWORFIWHYR3UIQYFUYFUTUIWIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII3FIWT33TF7UT373TR782YFIWUTGPOJTGPOSTGUE9YRE89YR

请问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如何实现将一个不规则形状的图片弄成按键?

通过C# WinForm控件创建的WPF WIndow窗口控件无法输入的问题

C#:在winform上使用定时器来改变图表,定时器需要单独的方法,图表数据不能从单独的方法中编辑

C# winform 下拉列表控件(comboBox)

c# winform 控件层次问题

C#里winform最大化时,如何使里面的控件按比例变化