Как уменьшить мерцание при обновлении моей True Transparency WinForm? или есть лучший способ сделать это?

это была постоянная проблема со мной, я пытался сделать пользовательскую нарисованную форму с хорошей прозрачностью.

это самое близкое, что я могу сделать прямо сейчас, я начал это всего полчаса назад..

Редактировать: я создаю пользовательские формы и элементы управления с нуля, как мой последний, Sunilla http://i.stack.imgur.com/rqvDe.png. и я хотел, чтобы на нем была хорошая тень или другой дизайн, который выглядел бы как окна.

он устанавливает для 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 — это отдельный класс, который выполняет большую часть тяжелой работы по рисованию почти идеально скругленных углов. И это не проблема, я разработал его пол года назад и во всех моих проектах никогда не было проблем с ним.

результат:

если есть лучший способ решить эту общую проблему, я бы с удовольствием послушал его, хотя я долго рыскал по сети.

6
задан awhite92 25 June 2012 в 20:50
поделиться