2009-10-09 10 views
12

Ho provato a impostare l'opacità del mio modulo al 50%, quindi a disegnare una stringa su di esso. Sembra che la stringa che disegno su di essa abbia anche un'opacità del 50%. Come posso disegnare una stringa non trasparente, ma lasciare che lo sfondo del modulo mostri il 50%?Come faccio a rendere trasparente il mio modulo, ma cosa non disegno su di esso?

Sarebbe anche disposto a farlo in WPF se è possibile, ma avrei bisogno di istruzioni esplicite o di un progetto di esempio come non l'ho mai fatto prima.

Per chiarire, voglio che lo sfondo del modulo sia nero opaco 80% a ciò che è sotto, quindi voglio disegnare del testo, ecc. Su di esso e farlo sembrare opaco al 100%.

risposta

19

questo è molto fatto facilmente in WPF:

  1. Set WindowStyle = "Nessuno" nella finestra (nota: ciò è richiesto, non si può avere la trasparenza e la finestre Chrome standard)
  2. Set AllowsTransparency = "true" nella finestra
  3. Impostare uno sfondo nella finestra con un pennello con trasparenza, come ad esempio sfondo = "# AAFFFFFF"

Ecco un esempio veloce:

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="300" Width="300" AllowsTransparency="True" Background="#AAFFFFFF" WindowStyle="None"> 
<Grid> 
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="20" FontWeight="Bold">Hello World!</TextBlock> 
</Grid> 

Ora, ovviamente, dal momento che hai disattivato il cromo standard di Windows, è necessario fornire il proprio pulsante per chiudere/minimizzare/massimizzare/trascinare la finestra. Puoi farlo abbastanza facilmente da solo o potresti cercare qualcosa come Blendables che viene fornito con un controllo "Finestra Chromeless" che potresti utilizzare.

4
+0

Questa non è la stessa, cosa dice questo è che quando si disegna qualsiasi colore questa chiave è impostata, mostrerà come trasparente, il che significa 0% Opaco (o completamente trasparente a seconda se sei un ragazzo mezzo pieno). Non ti permette di impostarlo al 50% trasparente. – esac

+0

OK. Grazie per l'aggiornamento. Hai ragione, certo. TransparencyKey funzionerà solo se desideri renderlo al 100% trasparente. (Io sono una coppa mezza piena me stesso.) – David

0

nel ControlStyles censimento MSDN c'è un valore denominato SupportsTransparentBackColor. Nel modulo di configurazione eseguire questo:

SetStyle(ControlStyles.UserPaint, true); 
SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
SetStyle(ControlStyles.SupportsTransparentBackColor, true); 

quindi è possibile impostare il colore di sfondo su Color.Transparent.

Spero che questo aiuti.

+0

Hm, questo suona come quello che voglio, comunque sto ricevendo una scatola grigia, e sembra che qualsiasi cosa disegni sopra se non viene mostrata. Ho provato Color.Transparent e this.BackColor = Color.FromArgb (180, 0, 0, 0); – esac

+1

Sto pensando che questo non funzionerà, da MSDN: se true, il controllo accetta un BackColor con un componente alfa inferiore a 255 per simulare la trasparenza. La trasparenza verrà simulata solo se il bit UserPaint è impostato su true e il controllo parent è derivato da Control. Suppongo che dal momento che il modulo principale non ha genitore, fallisce l'ultimo test. – esac

+0

Ah, mi scuso. Non me ne sono accorto. Sospetto che la tua teoria sia corretta. –

0

Utilizzare TransparencyKey per rendere la finestra trasparente. Crea un pannello vuoto con il colore di sfondo del tuo e dargli l'opacità desiderata.

Quindi crea tutti i tuoi figli in un contenitore/pannello separato (a sua volta un fratello simile al pannello traslucido creato sopra) e non visualizzare affatto uno sfondo.

Questo dovrebbe darvi l'effetto di uno sfondo traslucido ma controlli visibili.

+0

Ho appena provato questo, e ottengo uno sfondo opaco attraverso il contenitore trasparente, e sembra essere il colore in cui sto impostando TransparencyKey. Ad esempio, ho impostato TransparencyKey in rosa, quindi ho inserito un pannello di sfondo nero opaco all'80% e quello che vedo è uno sfondo opaco rosato/nero. – esac

+0

Provate le impostazioni per TransparencyKey/form in Transparent. –

+0

Torna allo stesso problema di seguito. Color.Transparent non è supportato a meno che non sia possibile impostare "SupportsTransparentBackColor" che non è consentito a meno che il genitore non sia un controllo. Per il modulo principale, non esiste un genitore: SetStyle (ControlStyles.SupportsTransparentBackColor, true); this.TransparencyKey = Color.Transparent; this.BackColor = Color.Transparent; – esac

0

in WinForms, MSDN dice questo:

La proprietà Opacità consente di specificare un livello di trasparenza per la forma ed i suoi controlli. Quando questa proprietà è impostata su un valore inferiore a 100 percento (1.00), l'intero modulo, compresi i bordi, viene reso più trasparente .

Quindi, qualsiasi controllo figlio del modulo su cui è stata impostata l'opacità avrà la loro opacità modificata. Se si desidera ottenere diversi livelli di opacità sui singoli controlli, sarà necessario passare a WPF.

0

Suppongo che questo sia un progetto WinForms, anche se hai detto che saresti disposto a provare WPF.

Lemme passa al mio limite di pensiero laterale: Qualsiasi motivo particolare non è possibile falso esso? Come in, crea una bitmap in Photoshop Elements o Paint Shop Pro o alcuni che imposti come sfondo intero di WinForm e semplicemente disegna l'area parzialmente trasparente su cui i controlli verranno posizionati direttamente su quella bitmap?

1

Una soluzione che viene in mente è quella di utilizzare due finestre sovrapposte l'una sull'altra. Rendi la finestra "in basso" al 50% di opacità e poi il proprietario traccia il tuo testo in una finestra sovrapposta a quella dell'altro. Se stai facendo display di tipo "lable" questo potrebbe essere semplice, ma potrebbe essere complicato rapidamente se hai bisogno di molti input da parte dell'utente che potrebbero poi essere filtrati attraverso la finestra "principale" o "in basso".

Quindi, ho capito, ma è un po 'squirreloso. La soluzione a due finestre sembrava promettente fino a quando non ho scoperto che .Net o Win32 fa qualcosa di genitoriale auto strano quando ci si riferisce anche implicitamente ad esso. Probabilmente ha a che fare con il modo in cui i messaggi vengono pompati però. Il genitore principale detiene il messaggio dell'applicazione pump e int indovina è implicitamente il genitore ...

ho provato un sacco di soluzioni alternative ma questa cosa del timer di seguito ha funzionato al meglio. In ogni caso, potrebbe essere un indizio di fare meglio ...


// the "main" or transparent window. Notice it just sets and runs the timer 
using System; 
using System.Windows.Forms; 
namespace TransparencyPlusNottransparentTest 
{ 
    public partial class FormMain : Form 
    { 
     public FormMain() 
     { 
      InitializeComponent(); 
     }

private void timer1_Tick(object sender, EventArgs e) 
    { 
     Program.ShowNontransparency(); 
    } 
} 

}

// "top" o no finestra trasparente. Si noti che il proprietario si basa su // sfondo trasparente. Le impostazioni di progettazione sono anche senza bordo, ecc. utilizzando System.Drawing; usando System.Windows.Forms;

namespace TransparencyPlusNottransparentTest { public class FormTop parziale: Modulo { FormTop pubblico() { InitializeComponent(); BackColor = Color.Firebrick; TransparencyKey = Color.Firebrick; }

private void FormTop_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawString("Hello Whirrled!", new Font("Tahoma", 14f), Brushes.Black, 10f, 10f); 
    } 
} 

}

// Il controllo di tutta questa spiel. Crea un'istanza di entrambe le finestre, // imposta il principale come finestra principale dell'app e ospita il metodo pubblico // hacky per forzare la finestra non trasparente a mostrare in primo piano // e l'offset in modo da non oscurare la parte superiore della finestra principale. usando il Sistema; utilizzando System.Drawing; utilizzando System.Windows.Forme;

namespace TransparencyPlusNottransparentTest { Programma classe statica {private static FormMain _formMain; formTop statico privato _formTop; private const int XY_OFFSET = 30;

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     _formTop = new FormTop(); 
     _formTop.Show(null); 

     _formMain = new FormMain(); 

     Application.Run(_formMain); 
    } 

    public static void ShowNontransparency() 
    { 
     _formTop.Location = 
      new Point(
      _formMain.Location.X + XY_OFFSET, 
      _formMain.Location.Y + XY_OFFSET); 

     _formTop.BringToFront(); 
    } 
} 

}

Problemi correlati