记录|panel组件的渐变色效果+窗口变大后的效果问题

23 篇文章 1 订阅
16 篇文章 0 订阅


前言

用的是C# winform框架。
想要对panel组件,实现个水平的渐变色效果。


一、渐变色效果

1.1 代码

  • 采用个渐变色方法。代码如下:
        private void panelTop_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Color FColor = Color.Transparent;
            Color TColor = Color.FromArgb(0, 120, 215);
            Brush b = new LinearGradientBrush(this.panelTop.ClientRectangle, TColor, FColor, LinearGradientMode.Horizontal);
            g.FillRectangle(b, this.panelTop.ClientRectangle);
        }

1.2 代码解析

用于在名为panelTop的面板上绘制一个水平渐变的背景。具体解析如下:

  • private void panelTop_Paint(object sender, PaintEventArgs e):这是一个私有方法,用于处理panelTop面板的绘制事件。当面板需要重绘时,这个方法会被调用。

  • Graphics g = e.Graphics;:从PaintEventArgs参数中获取Graphics对象,用于后续的绘图操作。

  • Color FColor = Color.Transparent;:定义起始颜色为透明色。

  • Color TColor = Color.FromArgb(0, 120, 215);:定义终止颜色为一个具有指定ARGB值的颜色(这里的颜色值为蓝色)。

  • Brush b = new LinearGradientBrush(this.panelTop.ClientRectangle,TColor, FColor, LinearGradientMode.Horizontal);:创建一个线性渐变画刷,用于在面板的客户端矩形区域内绘制垂直渐变。渐变从起始颜色到终止颜色。

  • g.FillRectangle(b, this.panelTop.ClientRectangle);:使用渐变画刷填充整个面板的客户端矩形区域,实现渐变背景的效果。

1.3 效果图

在这里插入图片描述


二、渐变问题

2.1 问题描述

这样做之后,在C# winform框架中一开始还可以,但是一旦放大winform的窗口后,就会出现下面的情况:
在这里插入图片描述

2.2 解决方案

  • 经过实验,这个是由于页面大小变化时,panel并没有进行重新绘制的原因。
  • 需要在窗口大小改变事件中重新绘制。

2.3 具体代码实施

下面的panelTop是个Panel类的对象。
首先,为窗口的Resize事件添加一个事件处理程序:

private void Form1_Resize(object sender, EventArgs e)
{
    panelTop.Invalidate(); // 使panelTop无效,以便在下次绘制时重绘
}

然后,确保Form1类继承了Form类,并在构造函数中订阅Resize事件:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Resize += new EventHandler(Form1_Resize);
    }
}

这样,每当窗口大小发生变化时,都会调用Form1_Resize方法,从而使panelTop无效并触发其Paint事件。这将确保在窗口大小变化后,panelTop仍然保持渐变效果。【如下图示】
在这里插入图片描述


三、控制渐变色的作用范围

3.1 问题描述

如果让FColor的作用区域只占整个Brush b的20%部分,该怎么做?

3.2 代码

private void panelTop_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    Color FColor = Color.Transparent;
    Color TColor = Color.FromArgb(0, 120, 215);
    int gradientWidth = this.panelTop.ClientRectangle.Width;
    int gradientHeight = this.panelTop.ClientRectangle.Height;
    int gradientStartX = 0;
    int gradientEndX = (int)(gradientWidth * 0.8); // 调整为80%,即FColor占据20%的部分

    Rectangle gradientRect = new Rectangle(gradientStartX, 0, gradientEndX - gradientStartX, gradientHeight);
    Brush b = new LinearGradientBrush(gradientRect, TColor, FColor, LinearGradientMode.Horizontal);
    g.FillRectangle(b, gradientRect);
}

将渐变区域的宽度设置为原始宽度的80%,这样FColor就只占据了整个Brush b的20%部分。

更新时间

  • 2024.08.15:创建。
对于Java渐变色字体生成器,可以使用Java2D Graphics API实现。以下是一个简单的示例代码,它可以在一个JPanel上绘制渐变色的文本: ```java import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; public class GradientTextPanel extends JPanel { private String text; private Font font; private GradientPaint gradient; public GradientTextPanel(String text, Font font, GradientPaint gradient) { this.text = text; this.font = font; this.gradient = gradient; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setFont(font); // 设置渐变色 g2d.setPaint(gradient); // 绘制文本 g2d.drawString(text, 0, font.getSize()); g2d.dispose(); } public static void main(String[] args) { JFrame frame = new JFrame("Gradient Text Panel"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 200); Font font = new Font("Arial", Font.BOLD, 48); GradientPaint gradient = new GradientPaint(0, 0, Color.RED, 400, 0, Color.BLUE); GradientTextPanel panel = new GradientTextPanel("Hello World", font, gradient); frame.add(panel); frame.setVisible(true); } } ``` 对于Java阴影文字效果,可以使用Java2D Graphics API中的阴影效果实现。以下是一个简单的示例代码: ```java import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.Rectangle2D; import javax.swing.JFrame; import javax.swing.JPanel; public class ShadowTextPanel extends JPanel { private String text; private Font font; private Color color; private float shadowOffsetX; private float shadowOffsetY; public ShadowTextPanel(String text, Font font, Color color, float shadowOffsetX, float shadowOffsetY) { this.text = text; this.font = font; this.color = color; this.shadowOffsetX = shadowOffsetX; this.shadowOffsetY = shadowOffsetY; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setFont(font); // 绘制阴影 g2d.setColor(Color.GRAY); g2d.drawString(text, shadowOffsetX, shadowOffsetY); // 绘制文本 g2d.setColor(color); g2d.drawString(text, 0, font.getSize()); g2d.dispose(); } public static void main(String[] args) { JFrame frame = new JFrame("Shadow Text Panel"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 200); Font font = new Font("Arial", Font.BOLD, 48); ShadowTextPanel panel = new ShadowTextPanel("Hello World", font, Color.RED, 2.0f, 2.0f); frame.add(panel); frame.setVisible(true); } } ``` 以上示例代码只是提供了一些实现阴影和渐变效果的基本思路,具体的实现方式可以根据需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值