gpt4 book ai didi

c# - 如何减少更新到 True Transparency WinForm 时的闪烁?还是有更好的方法来做到这一点?

转载 作者:太空狗 更新时间:2023-10-29 21:58:51 27 4
gpt4 key购买 nike

这对我来说一直是个问题,我一直在尝试制作一个具有良好透明度的自定义绘制表单。

这是我现在能得到的最接近的结果,我半小时前就开始了..

编辑:我从头开始制作自定义表单设计和控件,就像我最新的 Sunilla http://i.stack.imgur.com/rqvDe.png .我想在它上面有一个很好的投影,或者制作另一个看起来有点像 Windows areo 的设计。

它将 form.opacity 设置为 0%,然后它现在每 500 毫秒直接在表单后面抓取屏幕图像(屏幕上的任何内容、当前正在运行的程序、桌面等),并将其设置为背景并将透明度恢复为 100%。所以我可以在上面画任何东西,它看起来很完美!但我遇到的唯一问题是当它工作时,它会闪烁。是的,我尝试将 DoubleBuffering 设置为 true,没有区别。

听到主要代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TTTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

Opacity = 100;

}

private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = !timer1.Enabled;
}

private void timer1_Tick(object sender, EventArgs e)
{

Opacity = 0;
Bitmap img = new Bitmap(this.Width, this.Height);
Graphics gr = Graphics.FromImage(img);
gr.CopyFromScreen(Location, Point.Empty, Size);
this.BackgroundImage = img;
Opacity = 100;
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;

ExtDrawing2D.FillRoundRect(g, new SolidBrush(Color.FromArgb(100, 255, 255, 255)), new RectangleF(1, 1, Width - 3, Height - 3), 4f);
g.DrawPath(new Pen(Color.FromArgb(100, 0, 0, 0)), ExtDrawing2D.GetRoundedRect(new RectangleF(0, 0, Width - 1, Height - 1), 5f));
g.DrawPath(new Pen(Color.FromArgb(100, 255,255,255)), ExtDrawing2D.GetRoundedRect(new RectangleF(1,1, Width - 3, Height - 3), 4f));
}

private void button2_Click(object sender, EventArgs e)
{
timer1_Tick(sender, e);
}

private void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;

ExtDrawing2D.FillRoundRect(g, new SolidBrush(Color.FromArgb(150, 255,255,255)), new RectangleF(1, 1, panel1.Width - 3, panel1.Height - 3), 2f);
g.DrawPath(new Pen(Color.FromArgb(100, 0, 0, 0)), ExtDrawing2D.GetRoundedRect(new RectangleF(0, 0, panel1.Width - 1, panel1.Height - 1), 3f));
g.DrawPath(new Pen(Color.FromArgb(100, 255, 255, 255)), ExtDrawing2D.GetRoundedRect(new RectangleF(1, 1, panel1.Width - 3, panel1.Height - 3), 2f));
}
}
}

注意:ExtDrawing2D 是一个单独的类,它完成了很多繁重的工作,绘制了几乎完美的圆角。 AND 不是问题,我是半年前开发的,在我所有的项目中都没有遇到过问题。

结果:

如果有更好的方法来解决这个整体问题,我很乐意听到它,尽管我已经在网上搜索了很长时间。

最佳答案

我试过你的代码,因为我无法弄清楚你想要实现什么,是的,它经常闪烁。但这是因为您每半秒将不透明度设置为 0 并返回 1。如果看起来您正在尝试模拟透明窗口。为什么不直接使用透明窗口? IE。 FormBorderStyle=None 并将 BackColor 和 TransparencyKey 设置为相同的颜色(例如红色)。

关于c# - 如何减少更新到 True Transparency WinForm 时的闪烁?还是有更好的方法来做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11196422/

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