Przeźroczystość tła Textboxa na pictureboxie

2

Witam,
Mam problem, który wydaje się być banalny ale nie mogę sobie z nim zbytnio poradzić.
Mam pictureboxa który jest zadokowany na całym formie. W tym pictureboxie wyświetlam jakiś film. Chciałbym wstawić wyświetlenie napisów na tym pictureboxie więc wrzucam kontrolkę textboxa i wyświetlam na niej tekst. Problem polega na tym że chcę aby wyświetlało sam tekst bez tła w textboxie.

Dotychczas próbowałem ustawić textbox.parent = picturebox; i textbox.backcolor = transparent ale niestety efektem jest błąd.

Dodam, że chcę użyć textboxa bo label nie zawija tekstu.

Proszę o pomoc

2

Błąd błąd błąd, jaki błąd? Ludzieeee

0

błąd: ArgumentException nie został obsłużony. Formant nie obsługuje przeźroczystych kolorów tła

Składniowo wszystko przechodzi przez kompilator natomiast błąd wyrzuca po uruchomieniu aplikacji

Kod:
textBox8.Clear();
textBox8.Parent = pictureBox1;
textBox8.BackColor = Color.Transparent;
textBox8.TextAlign = HorizontalAlignment.Center;
textBox8.WordWrap = true;
string[] words = linetext.Split(':');
textBox1.Text = words[0];
textBox2.Text = words[1];
textBox3.Text = words[2];
textBox4.Text = words[3];
textBox8.Text = textBox4.Text;

0

http://msdn.microsoft.com/pl-pl/library/wk5b13s4.aspx - pierwszy link po wklejeniu do google textbox c# Formant nie obsługuje przeźroczystych kolorów tła.
Kolejna minuta na google - wpisałem "c# label word wrap" - pierwszy link rozwiązuje Twój problem: http://stackoverflow.com/questions/9509147/label-word-wrapping.

0

Można jeszcze tak:

Color color = new Color();
color = picturebox1.BackColor;
textbox1.BackColor = color;

Edit: Teraz dotarło do mnie, że chodzi o wyświetlany film i strike przeźroczystość.

Pzdr.

0
Ciekawski napisał(a):

Można jeszcze tak:

Color color = new Color();
color = picturebox1.BackColor;
textbox1.BackColor = color;

Nie bardzo skoro napisy są wyświetlane na filmie gdzie 'tło' tak jakby ciągle się zmienia.

A tak poza tym wyświetlanie po słowie w każdym textboxie osobno nie jest dziwne ?

0

No tutaj chodzi o typową przeźroczystość textboxa. Użyłem w konstruktorze: SetStyle(ControlStyles.SupportsTransparentBackColor, true); zostawiłem tak jak w kodzie wyżej textbox.backcolor = color.transparent; ale niestety ten sam błąd i nic to nie dało :-/

0

Możesz sprawdzić jak tutaj to zostało zrobione albo porostu użyć tej kontrolki:

http://www.codeproject.com/Articles/4390/AlphaBlendTextBox-A-transparent-translucent-textbo

0
Cristiano1989 napisał(a):

No tutaj chodzi o typową przeźroczystość textboxa. Użyłem w konstruktorze: SetStyle(ControlStyles.SupportsTransparentBackColor, true); zostawiłem tak jak w kodzie wyżej textbox.backcolor = color.transparent; ale niestety ten sam błąd i nic to nie dało :-/

W konstruktorze czego? Bo chyba nie textboksa. Masz tę metodę wywołać na kontrolce, która ma mieć włączoną możliwość bycia przezroczystą, a nie na bieżącym obiekcie (czyli pewnie na formatce).

0
ŁF napisał(a):
Cristiano1989 napisał(a):

No tutaj chodzi o typową przeźroczystość textboxa. Użyłem w konstruktorze: SetStyle(ControlStyles.SupportsTransparentBackColor, true); zostawiłem tak jak w kodzie wyżej textbox.backcolor = color.transparent; ale niestety ten sam błąd i nic to nie dało :-/

W konstruktorze czego? Bo chyba nie textboksa. Masz tę metodę wywołać na kontrolce, która ma mieć włączoną możliwość bycia przezroczystą, a nie na bieżącym obiekcie (czyli pewnie na formatce).

Nie można tego wywołać na kontrolkach tylko na formie. Zresztą w pierwszym linku który podałeś jest ładnie napisane. :)
Zadanie jest dość skomplikowane. Więc albo tworzyć własną kontrolkę na podstawie standardowej albo poszukać gotowej alternatywy.

1

Windows Forms nie obsługuje prawidłowo przezroczystości kontrolek.
Proba walczenia z tym to gwarantowany ból głowy.

0

Czyli co proponujecie zrobić? Funkcję tą: SetStyle(ControlStyles.SupportsTransparentBackColor, true); próbowałem wywołać na formie ale bezskutecznie. Zastanawiam się nad ewentualnym rysowaniem Stringów na pictureboxie ale nie wiem czy byłby to dobry pomysł.

0

Zawijanie tekstu w labelu kontrolujesz poprzez ustawienie MaximumSize (Width). Musisz mieć AutoSize na True.

0
Cristiano1989 napisał(a):

Czyli co proponujecie zrobić? Funkcję tą: SetStyle(ControlStyles.SupportsTransparentBackColor, true); próbowałem wywołać na formie ale bezskutecznie. Zastanawiam się nad ewentualnym rysowaniem Stringów na pictureboxie ale nie wiem czy byłby to dobry pomysł.

  1. Albo użyj ta gotową kontrolkę:
    http://www.codeproject.com/Articles/4390/AlphaBlendTextBox-A-transparent-translucent-textbo
  2. Znajdź inną gotową.
  3. Zrób kawałek czarnego tła pod filmem i tam wyświetlaj. I kontynuuj projekt bo wydaje mi się że nie ma sensu tracić czasu na to. Bo pewnie jest to niewielka cząstka całości i większej funkcjonalności w tym twoim odtwarzaczy czy cokolwiek to ma być. A nad zabawą z przezroczystością jeszcze będzie czas. :P
0

Tak tylko w labelu jest jeszcze jeden problem a właściwie dwa. Label zaczyna pisanie od miejsca jego umieszczenia czyli jeśli sobie dam wyśrodkowanie textu to i tak nie rozłoży mi się tak równomiernie jak w przypadku textboxa a drugim problemem jest to że color.transparent zadziała na panelu albo na formie ale na pictureboxie niestety nie działa.

@DibbyDum niestety strona do której podałeś link nie istnieje :-/ Owszem jest to większy projekt ale to tło napisów jednak mnie strasznie gryzie :-D

0

Label na PictureBox

Wrzuciłem dla ciebie filmik, który ukazuje, że co dla jednych nie działa - innym chodzi 100%.
Dla jasności: na formie mam PictureBox, Label, TextBox oraz Timer.

Kod jest tak krótki, że całość + properties można ogarnąć w 5 min. Tobie jednak dam tylko podpowiedzi
co trzeba ustawić, aby działało również u ciebie (musisz się najpierw trochę pomęczyć sam).

label1.BackColor
label1.Parent
label1.MinimumSize
label1.MaximumSize

Pozycjonowanie:

label1.Left
label1.Top
label1.TextAlign

Pamiętaj tylko, że pozycjonujesz obiekt (kontrolkę) względem jego parenta!

0

Powiem ci że jestem pod wrażeniem tego co zobaczyłem na filmiku :-D Zrobiłeś w kilka minut to nad czym ja się męczę już trzeci dzień :-P
Mam kilka pytań odnośnie tego.
Na labelu wyświetliłeś jednego stringa natomiast u mnie co chwile będą się wczytywać nowe i zastępować te stare i problemem moim było w labelu to żeby obojętne czy string będzie miał 20 znaków czy 120 żeby był ładnie wyśrodkowany. Jeżeli ustawisz w textboxie aligntext na center to zawsze na środku ekranu mi wyświetli równiutko tekst do prawej i lewej strony natomiast w labelu będzie z tym problem.

Co do tego filmiku to mam nadzieję że zdradzisz trochę wiecej szczegółów bo już nie mogę patrzeć na te wszystkie opcje labela :-P

Używasz tam label.maximumsize tylko pytanie jak mam podać max size jak w programie mam opcję full screen i wtedy w zależności od max size jest dla każdej rozdzielczości inny?

Ogólnie mówiąc bardzo jestem ciekawy jak ty to rozwiązałeś :-P

0

label1.MaximumSize (Width) powinno być zależne od pictureBox1.Width.
label1.MaximumSize (Height) to ilość linii jaką chcesz pokazać: TextRenderer.MeasureText Method (String, Font).

label1.MinimumSize powinno być takie same jak label1.MaximumSize.

label1.Top zależy od pictureBox1.Height i własnej wysokości.

Czasem trzeba przypisać nową instancję do już istniejącego obiektu (new Size()).
A teraz pobaw się z labelem odpowiednio. Daj nam znać jak to rozwiążesz ;)

0

Prawidłowy sposób do bezpośrednie renderowanie tekstu (w zdarzeniu Paint), z odpowiednimi ustawieniami koloru a nie umieszczanie kontrolek na PictureBox.

http://stackoverflow.com/questions/4008975/drawing-a-string-with-a-transparent-background-using-c

0

Panowie muszę otwarcie stwierdzić, że nie radzę sobie :-/ Przyszedłem z pracy ustawiam parametry labela a tu niestety kicha.

Chyba @WinFormsApp1 myśli na innym poziomie abstrakcji niż ja :-P

Podrzucam kawałek kodu w którym ustawiam parametry labela może wy będziecie coś wiedzieć bo mi brakuje sił z tym juz :-/

Font arial = new Font("arial", 12.0F);
Size Hei = TextRenderer.MeasureText(textBox4.Text,arial );
label3.Parent = pictureBox1;
label3.TextAlign = ContentAlignment.MiddleCenter;
label3.MaximumSize = new System.Drawing.Size(pictureBox1.Width, Hei.Height);
label3.MinimumSize = label3.MaximumSize;
label3.Top = pictureBox1.Height; - zmiana tego parametru spowoduje pojawienie się labelu natomiast jego tło jest nadal białe i napisy się niestety nie zawijają
label3.Text = textBox4.Text;

Poza tym ustawiona jest we właściwościach labela backcolor na transparent. Niestety ustawienie tego parametru w kodzie wywołuje wyjątek taki sam jak w przypadku textboxa wyżej opisanego.

Natomiast co do pomysłu @othello to myślałem już o tym natomiast obawiam się podobnie jak to było z labelem czyli o wyśrodkowanie tekstu i zawijanie :-/

Próbnie chciałem przetestować sposób z grafiką a wynik jest taki, że na pictureboxie wyświetla tekst pod warunkiem że nie ma filmu. Jeśli jest film to tego tekstu już nie wyświetli. Kod jaki użyłem to:

Graphics g = pictureBox1.CreateGraphics();
SolidBrush brush = new SolidBrush(Color.Black);
Font f = new Font("Arial", 30);
PointF d = new PointF(100, 100);
g.DrawString(textBox4.Text, f, brush, d);

0

label1.BackColor i label1.TextAlign ustawiałem w properties.
Na formie znajdują się: PictureBox, Button, TextBox, Label, Timer.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Color[] colors = new Color[10] { Color.Black, Color.White, Color.Red, Color.Blue,
            Color.Green, Color.Pink, Color.Orange, Color.Aqua, Color.Brown, Color.Violet };

        Random rand = new Random();

        public Form1()
        {
            InitializeComponent();

            textBox1.Text = "Label zaczyna pisanie od miejsca jego umieszczenia czyli jeśli" +
                " sobie dam wyśrodkowanie textu to i tak nie rozłoży mi się tak równomiernie";

            button1_Click(null, null);
        }

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

        private void timer1_Tick(object sender, EventArgs e)
        {
            int i = rand.Next(10);

            switch (i)
            {
                case 1:
                case 5:
                case 6:
                case 7:
                case 9:
                    label1.ForeColor = Color.Black;
                    break;
                default:
                    label1.ForeColor = Color.WhiteSmoke;
                    break;
            }

            pictureBox1.BackColor = colors[i];
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Size size = TextRenderer.MeasureText(textBox1.Text, textBox1.Font);
            int lineHeight = TextRenderer.MeasureText("|", textBox1.Font).Height;
            int lines = 1;

            if (size.Width > pictureBox1.Width)
                lines = (int)Math.Ceiling(1.0D * size.Width / pictureBox1.Width);
            else
                lines = (int)Math.Ceiling(1.0D * size.Height / lineHeight);
            
            switch (lines)
            {
                case 0:
                case 1:
                    label1.MinimumSize = new Size(pictureBox1.Width, lineHeight);
                    break;
                default:
                    label1.MinimumSize = new Size(pictureBox1.Width, lineHeight * 2);
                    break;
            }

            label1.Parent = pictureBox1;
            label1.MaximumSize = label1.MinimumSize;
            label1.Left = 0;
            label1.Top = pictureBox1.Height - label1.MaximumSize.Height - 8;

            label1.Text = textBox1.Text;
        }
    }
}
0

@WinFormsApp1 twój kod działa ale tylko pod warunkiem zmian koloru pictureboxa natomiast u mnie w aplikacji nie do końca się sprawdził tzn zawija ładnie tekst natomiast jego tło jest nadal białe :-/

Wygląda na to że jak zrzutuje film na picturebox to on nie przybierze tła filmu niestety:-/

Film przypisuje do pictureboxa w ten sposób:

Video.owner = picturebox1;

Jakieś pomysły?

0

Odtwarzacze raczej wrenderowują napisy w zdekodowany obraz (podczepiając się jakoś w strumień DirectShow, nie wiem jak dokładnie jest to zrobione) a nie nakładają textboksa ani labela na film...

0

Kurcze nie sądziłem, że będzie to aż takim problemem :-/
Przyszła mi do głowy taka myśl że w ostateczności zrobię tło labela na czarne bo i tak większość filmów ma u góry i na dole ciemne paski tylko że jest to niestety taka prowizorka :-/
Ma ktoś jeszcze jakiś pomysł?

1 użytkowników online, w tym zalogowanych: 0, gości: 1