GDI+ rysowanie na kontrolkach

0

Cześć :-)
Mam ustawione zdarzenie dla Form1_Paint, które rysuje tekst przez GDI+:

private void Form1_Paint(object sender, PaintEventArgs e)
        {

            Graphics g = this.CreateGraphics();
            g.Clear(this.BackColor);
            string text = "Testing GDI+ Text and Font" +
                    "functionality for alignment and trimming.";

            Font comicFont = new Font("Comic Sans MS", 11, FontStyle.Regular);
            Rectangle rect2 = new Rectangle(10, 10, 180, 180);
            StringFormat strFormat2 = new StringFormat();

            strFormat2.Alignment = StringAlignment.Near;
            strFormat2.LineAlignment = StringAlignment.Near;
            strFormat2.Trimming = StringTrimming.Character;

            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic; 

            g.DrawRectangle(new Pen(Color.Transparent), rect2);
            g.DrawString(text, comicFont,
            new SolidBrush(Color.Black), rect2, strFormat2);

            comicFont.Dispose();
            g.Dispose();
        }

Na formie mam kilka kontrolek i niestety one przykrywają ten tekst.
Co zrobić, aby tekst został narysowany ponad wszystkimi kontrolkami?

Z góry dzięki za odpowiedzi ;-)

0

Jeżeli np na buttonie narysujemy coś przy pomocy Graphics to efekt powinien zniknąć przy kolejnym przerysowaniu kontrolki.
można podstawiać za tło to co jest pod spodem.
Tylko że ja rysowałem na pictureboxie
tak to wygląda
http://img189.imageshack.us/i/przykladi.jpg/

            Bitmap bitmap_from_pB1 = (Bitmap)pictureBox1.Image;
            Image new_background = bitmap_from_pB1.Clone(new Rectangle(button1.Location.X, button1.Location.Y, button1.Width, button1.Height), System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            button1.BackgroundImage = new_background;

można też rysować na kontrolce przy każdym zdazeniu Paint, ale to średnio optymalne xP

0

Udało się, teraz rysuje na pictureboxie :-)

Problem jest już tylko w tym, że jak kod rysowania jest w zdarzeniu Form1_Paint to na samym początku tekst nie jest widoczny, przy powiększaniu okienka itp pojawia się, ale mruga czasami.

Próbowałem wrzucić ten kod do nowej funkcji:

        public void rys(object sender, PaintEventArgs e)
        {
            Graphics g = pictureBox1.CreateGraphics();
            g.Clear(pictureBox1.BackColor);
            string text = "Testing GDI+ Text and Font" +
                    "functionality for alignment and trimming.";

            Font comicFont = new Font("Comic Sans MS", 11, FontStyle.Regular);
            Rectangle rect2 = new Rectangle(10, 10, 180, 180);
            StringFormat strFormat2 = new StringFormat();

            strFormat2.Alignment = StringAlignment.Near;
            strFormat2.LineAlignment = StringAlignment.Near;
            strFormat2.Trimming = StringTrimming.Character;

            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;

            g.DrawRectangle(new Pen(Color.Transparent), rect2);
            g.DrawString(text, comicFont,
            new SolidBrush(Color.Black), rect2, strFormat2);

            comicFont.Dispose();
            g.Dispose();
        }

i wywołać po prostu rys(); ale niestety pojawia się error:

No overload for method 'rys' takes '0' arguments

EDIT:
Tak jak już pisałem pojawieniu się okienka tekst się nie rysuje. Robi to dopiero jak się minimalizuje/maksymalizuje okienko.
Czy jest na to jakiś sposób, aby rysował jak już wszystko będzie gotowe?

1

No overload for method 'rys' takes '0' arguments

powód jest przecież chyba jasny 0_o?

porównaj:
public void rys(object sender, PaintEventArgs e)
i
rys();
Nie rozumiem gdzie tutaj jest problem [???]

Tak jak już pisałem pojawieniu się okienka tekst się nie rysuje.
Tego akurat nie rozumiem :) Paint powinno być wywoływane przy uruchomieniu pogramu...

EDIT: hah, rozumiem [rotfl] zamiast form1.paint spróbuj panel1.paint, może podziała :)

0
MSM napisał(a)

No overload for method 'rys' takes '0' arguments

powód jest przecież chyba jasny 0_o?

porównaj:
public void rys(object sender, PaintEventArgs e)
i
rys();
Nie rozumiem gdzie tutaj jest problem [???]

Powód nie jest jasny. Jestem samoukiem i widocznie coś przeoczyłem. ;-P

MSM napisał(a)

Tak jak już pisałem pojawieniu się okienka tekst się nie rysuje.
Tego akurat nie rozumiem :) Paint powinno być wywoływane przy uruchomieniu pogramu...

EDIT: hah, rozumiem [rotfl] zamiast form1.paint spróbuj panel1.paint, może podziała :)

To też nic nie daje :-(

EDIT:
Heh... na panelu da się rysować, a na pictureboxie jakoś nie ;-P

0

jak sie nie da rysować na pictureboxie :P
Graphic.FromImage(picturebox1.Image);

Od tego one są, od tego są one

1

I, dopóki używasz zdarzenia paint, radzę używać "e.Graphics" - dostajemy graphics już w parametrze 'e'.

Powód nie jest jasny. Jestem samoukiem i widocznie coś przeoczyłem.

ok, ok, też jestem samoukiem i miałem głupsze problemy :P

Chodzi o to, że sygnatura medody to "public void rys(object sender, PaintEventArgs e)"
czyli po kolei:
-public, void i rys nie mają w tej chwili znaczenia.
-object sender - i tutaj leży (pierwszy) pies pogrzebany. W nawiasie są wpisane parametry jakie przyjmuje metoda. Pierwszy parametr to 'sender' - czyli ten który wywołuje - typu object (typ object to taki abstrakcyjny typ pod który możemy podstawić każdy inny. Ściślej mówiąc jest to klasa bazowa dla wszystkich innych klas).

  • PaintEventArgs e - tu jest drugi argument, typu oczywiście PaintEventArgs.

I co teraz z tego? Po prostu napisz metodę z tymi parametrami -

jako sender użyjemy this (czyli senderem będzie twoje główne okno)
jako e użyjemy PaintEventAargs.Empty (taki już zdefiniowane wcześniej 'pusty' zbiór argumentów)

rys(this, paintEventArgs.Empty)

  • takie coś na pewno podziała.

Ale to wszystko to było tak szkoleniowo, tak naprawdę nigdzie nie używasz ani 'sendera' ani 'e' więc spokojnie napisz sobie

public void rys()
        {
            Graphics g = pictureBox1.CreateGraphics();
            g.Clear(pictureBox1.BackColor);
            ...

:P

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