2012-03-31 5 views
2

Ich habe versucht, das Windows 7 Snipping Tool so zu imitieren, dass es den Bildschirm mit einer halbtransparenten grauen Ebene überlagert, die innerhalb des Auswahlbereichs vollständig transparent wird. Ich bin ziemlich nah gekommen. Ich zeige eine randlose 50% opake graue Form, die den gesamten Bildschirm abdeckt und einen TransparencyKey von Fuchsia hat. Dann zeichne ich oben auf diesem Formular 2 Rechtecke. Ein festes fuchsiafarbenes Rechteck für die Transparenz und ein weiteres Rechteck für den roten Rand. Es funktioniert, aber nur, wenn ich eines von drei Dingen mache, von denen keine Optionen sind.C# Transparentes, durchgezogenes Rechteck, gezeichnet auf einer 50% opaken Form

  1. deaktivieren doppelte Pufferung, die die Form Flimmern macht während
  2. Ändern der Desktop-Farbmodus Zeichnung von 32bit auf 16bit
  3. Machen Sie das Formular aus 100% lichtundurchlässig

Hier ist mein Code. Irgendwelche Vorschläge, wie man das zum Laufen bringt?

public partial class frmBackground : Form 
{ 
    Rectangle rect; 

    public frmBackground() 
    { 
     InitializeComponent(); 

     this.MouseDown += new MouseEventHandler(frmBackground_MouseDown); 
     this.MouseMove += new MouseEventHandler(frmBackground_MouseMove); 
     this.Paint += new PaintEventHandler(frmBackground_Paint); 
     this.DoubleBuffered = true; 
     this.Cursor = Cursors.Cross; 
    } 

    private void frmBackground_MouseDown(object sender, MouseEventArgs e) 
    { 
     Bitmap backBuffer = new Bitmap(this.ClientSize.Width, this.ClientSize.Height); 
     rect = new Rectangle(e.X, e.Y, 0, 0); 
     this.Invalidate(); 
    } 

    private void frmBackground_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
      rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y - rect.Top); 

     this.Invalidate(); 
    } 

    private void frmBackground_Paint(object sender, PaintEventArgs e) 
    { 
     Pen pen = new Pen(Color.Red, 3); 
     e.Graphics.DrawRectangle(pen, rect); 

     SolidBrush brush = new SolidBrush(Color.Fuchsia); 
     e.Graphics.FillRectangle(brush, rect); 
    } 
} 

Antwort

0

können Sie

Brush brush = new SolidBrush(Color.FromArgb(alpha, red, green, blue)) 

verwenden, wo Alpha von 0 bis 255 geht, so ein Wert von 128 für die Alpha erhalten Sie 50% opactity geben.

diese Lösung wurde in this question

+0

nicht gefunden wird es nicht. Wenn seine Form 0,2 Opazität und Pinsel 128 Alpha hat, erhält er 0,2 * 128 Alpha auf seinem Rechteck – dimitris93