2009-10-09 9 views
12

Próbowałem ustawić krycie mojego formularza na 50%, a następnie narysowałem na nim ciąg znaków. Wygląda na to, że ciąg, który na nim rysuję, ma również nieprzezroczystość 50%. Jak mogę narysować nieprzejrzysty ciąg, ale niech tło formularza pokazuje 50%?Jak ustawić przezroczystość w moim formularzu, ale czego nie rysuję?

Byłbym skłonny zrobić to w WPF, jeśli jest to możliwe, ale potrzebowałbym wyraźnych instrukcji lub przykładowego projektu, ponieważ nigdy wcześniej tego nie robiłem.

Aby wyjaśnić, chcę, aby tło formularza było czarne 80% nieprzejrzyste do tego, co jest pod spodem, a następnie chcę narysować tekst, itp. Na nim i sprawić, by wyglądało na 100% nieprzezroczyste.

Odpowiedz

19

Jest to bardzo łatwo zrobić w WPF:

  1. Set WindowStyle = "None" na oknie (uwaga: jest to konieczne, nie można mieć przejrzystości i standardowych okien Chrome)
  2. Set AllowsTransparency = „True” w oknie
  3. ustawić tło w oknie przy użyciu pędzla z przejrzystością, takie jak tło = „# AAFFFFFF”

Oto krótka próbka:

<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> 

Teraz oczywiście, odkąd wyłączona standardowego Chrome dla systemu Windows, będzie musiał dostarczyć swój własny przycisk, aby zamknąć/zminimalizować/zmaksymalizować/przeciągnąć okno. Możesz to zrobić całkiem łatwo lub możesz przyjrzeć się zakupowi czegoś w rodzaju Blendables, które pochodzi z kontrolki "Chromeless Window", której możesz użyć.

4
+0

To nie to samo, co ten mówi, że kiedy narysować cokolwiek kolor ten klucz jest ustawiony, to pokaże jak przejrzyste, co oznacza 0% Opaque (lub całkowicie przezroczysty w zależności od tego, czy jesteś półpełnym kielichem). Nie pozwala ustawić go w 50% przezroczystym. – esac

+0

OK. Dziękuję za aktualizację. Masz rację, oczywiście. Klawisz TransparencyKey będzie działał tylko wtedy, gdy chcesz uczynić go w 100% tranparentnym. (Sam jestem półfrancusyjnym facetem). – David

0

w wyliczenie ControlStyles MSDN istnieje wartość o nazwie SupportsTransparentBackColor. W formularzu contructor uruchom:

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

następnie można ustawić kolor tła na Kolor. Przezroczysty.

Mam nadzieję, że to pomoże.

+0

Hm, to brzmi jak to, co chcę, ale dostaję szare pudełko i wydaje mi się, że cokolwiek rysuję na górze, jeśli się nie pokazuje. Próbowałem Color.Transparent i this.BackColor = Color.FromArgb (180, 0, 0, 0); – esac

+1

Myślę, że to nie zadziała, z MSDN: Jeśli to prawda, kontrolka akceptuje kolor BackColor z komponentem alfa mniejszym niż 255, aby symulować przezroczystość. Przezroczystość będzie symulowana tylko wtedy, gdy bit UserPaint zostanie ustawiony na wartość true, a kontrola nadrzędna zostanie uzyskana z kontrolki. Zgaduję, że ponieważ główny formularz nie ma rodzica, który nie przejdzie ostatniego testu. – esac

+0

Ach, przepraszam. Nie zauważyłem tego. Podejrzewam, że twoja teoria jest poprawna. –

0

Użyj przycisku Przezroczystość, aby okno było przezroczyste. Utwórz pusty panel z kolorem tła i nadaj mu pożądany stopień krycia.

Następnie utwórz wszystkie swoje dzieci w osobnym pojemniku/panelu (samemu rodzeństwu na półprzezroczystym panelu utworzonym powyżej) i nie renderuj tła w ogóle.

Powinno to dać efekt półprzezroczystego tła, ale widoczne elementy sterujące.

+0

Po prostu próbowałem tego, a ja dostaję nieprzezroczystego tła przez przezroczysty pojemnik i zdarza się, że jest to kolor, dla którego ustawiam TransparencyKey. Na przykład ustawiłem przezroczysty przycisk na różowy, a następnie nałożyłem nieprzezroczysty czarny panel w tle w rozmiarze 80%, a to, co widzę, to nieprzejrzyste lub czarne tło. – esac

+0

Spróbuj ustawić tło TransparencyKey/Form na Transparent. –

+0

Powraca do tego samego problemu poniżej. Color.Transparent nie jest obsługiwany, chyba że można ustawić "SupportsTransparentBackColor", który nie jest dopuszczalny, chyba że rodzic jest formantem. Dla formularza głównego nie ma elementu nadrzędnego: SetStyle (ControlStyles.SupportsTransparentBackColor, true); this.TransparencyKey = Color.Transparent; this.BackColor = Color.Transparent; – esac

0

w WinForms, MSDN mówi tak:

Obiekt Przezroczystość pozwala określić poziom przejrzystości dla formę i jego kontroli. Gdy ta właściwość jest ustawiona na wartość mniejszą niż 100 procent (1.00), cały formularz, , w tym obramowania, jest bardziej przezroczysty niż .

Tak więc wszystkie formanty podrzędne w formularzu, dla którego ustawiono krycie, będą miały zmienioną nieprzezroczystość. Jeśli chcesz osiągnąć różne poziomy krycia w poszczególnych kontrolkach, musisz przełączyć się na WPF.

0

Zakładam, że jest to projekt WinForm, chociaż powiedziałeś, że będziesz chciał wypróbować WPF.

Przełącznik Lemme do mojego ograniczenia myślenia lateralnego: Każdy szczególny powód, dla którego nie można po prostu fałszywy to? Tak jak w przypadku tworzenia mapy bitowej w PhotoShop Elements lub Paint Shop Pro lub w niektórych z nich, które ustawisz jako całe tło WinForm, i po prostu narysuj częściowo przezroczysty obszar, nad którym kontrolki zostaną umieszczone bezpośrednio na tej mapie bitowej?

1

Jednym z obejść, które przychodzi na myśl, jest użycie dwóch okien nałożonych jeden na drugi. Renderuj "dolne" okno z 50% kryciem, a następnie właściciel narysuje tekst w oknie nałożonym na drugie. Jeśli robisz wyświetlacze typu lable, może to być proste, ale może się szybko skomplikować, jeśli potrzebujesz dużo danych wejściowych od użytkownika, które następnie mogą zostać przefiltrowane do twojego "głównego" lub "dolnego" okna.

Tak, mam to do pracy, ale jest trochę squirrelly. Rozwiązanie dwóch okien wydawało się obiecujące, dopóki nie odkryłem, że .Net lub Win32 wykonuje jakieś dziwne auto-rodzicielstwo, nawet jeśli nieodwracalnie się do niego odwołujesz. Prawdopodobnie ma to związek ze sposobem pompowania wiadomości. Główny nadrzędny zawiera pompę komunikatów aplikacji i domyślnie jest rodzicem ...

Próbowałem kilku obejść, ale ta kwestia czasu działała najlepiej. W każdym razie, może to być wskazówką, aby to zrobić lepiej ...


// 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" lub nie przezroczyste okno. Zwróć uwagę, że rysuje on na // przezroczystym tle. Ustawienia czasu projektowania to także sans border itp. przy użyciu System.Drawing; przy użyciu System.Windows.Forms;

nazw TransparencyPlusNottransparentTest { publicznych częściowe klasy FormTop: Formularz { FormTop publicznych() { 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); 
    } 
} 

}

// Kontrola całej tej przemowy. Tworzy oba okna, // ustawia główny jako główne okno aplikacji i hostuje publiczną // metodę hacky, aby wymusić wyświetlanie nieprzezroczystego okna na wierzchu // i przesunięcie, aby nie zasłaniać góry głównego okna. przy użyciu systemu; using System.Drawing; przy użyciu System.Windows.Formy;

nazw TransparencyPlusNottransparentTest { static class Program { private static FormMain _formMain; private static FormTop _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(); 
    } 
} 

}