Aplikacja MDI - rysowanie obrazka w oknie child

0

Witam,

Sprawa powinna byc prosta (i pewnie jest, tylko cos przeoczylem). Mam aplikacje MDI. Plik->Otworz to wybranie obrazka, ktory powinien sie wyswietlic w nowym okienku MDI.

Robie to tak (w pliku z głównym formularzem):

 if (openDlg.ShowDialog() == DialogResult.OK)
            {
                //Tworzenie okienka MDIChild
                child childForm = new child();
                childForm.MdiParent = this;
                childForm.Text = openDlg.FileName;

     
                //Rysowanie obrazka w okienku MDIChild
                childForm.CreateGraphics().DrawImage(Image.FromFile(openDlg.FileName), new PointF(0F, 0F));
                childForm.Show();
               
            }

Ale w okienku child nic nie jest rysowane. Co robie nie tak?

0

Może lepiej kontrolke dodaj:

PictureBox pb = new PictureBox();
pb.AutoSize = true;
pb.Image = Image.FromFile(openDlg.FileName);
childForm.Controls.Add(pb);
0

w momencie show forma jest odrysowywana jeszcze raz, tak samo jeśli ją przesłonisz i pokażesz to wcześniej niewidoczny kawałekm musi być narysowany jeszcze raz. Przekaż albo ścieżkę do obrazka albo sam obiekt obrazka a rysuj go w onpaint

0

adf88: Nie chce robic tego w ten sposob. A to dlatego, ze chce skorzystac z GDI+ do realizacji różnych efektów na obrazku.

Zrobiłem tak. W klasie okienka child dodałem:

internal string FileName;

Natomiast w klasie głównego okna:

child childForm = new child();
childForm.MdiParent = this;
childForm.Text = openDlg.FileName;

childForm.FileName = openDlg.FileName;
                
childForm.Show();

Dalej, w okienku child jest komponent PictureBox. W zdarzeniu Paint tego komponentu:

 Bitmap img = (Bitmap)Image.FromFile(FileName);

obraz.Width = img.Width;
obraz.Height = img.Height;
            
e.Graphics.DrawImage(img, 0,0);

Jednak nie jestem pewien czy to dobre rozwiązanie, dlatego że coś takiego działa bardzo powoli. Konkretnie chodzi mi o zmiane rozmiaru okna child oraz przewijanie zawartości (czyli przewijanie obrazka, jezeli jest wiekszy od okna).

Ze zwalnianiem podczas zmiany rozmiaru poradziłem sobie dość łatwo - okienko nie jest odrysowywane podczas zmiany rozmiaru, a dopiero po zakończeniu tej operacji.

Jednak przewijanie widoku za pomocą scrollbarów dla dużych obrazków działa koszmarnie powoli. Mało tego: cokolwiek, co jest rysowane nad okienkiem z obrazkiem, jest rysowane bardzo powoli (czyli zacina się) - nawet menu rozwija sie powoli, co jest już całkiem nie do zaakceptowania.

Jak temu zaradzić?

0

A jaka jest różnica w rysowaniu po formie, a rysowaniu po PictureBox - a no taka, że PictureBox będzie automatycznie odrysowane. Tylko tyle. Jak chcesz stosować GDI+ to nie ma różnicy czy forma czy box.

0
adf88 napisał(a)

PictureBox będzie automatycznie odrysowane.

Nie będzie

0

Ja bym ci odradził używanie funkcji OnPaint gdziekolwiek i kiedykolwiek bo to tak zamulaszcze że bardziej być nie może. To ci może zwolnić normalne rysowanie do takiego stopnia że program ci sie zawiesi :). Używaj bocznych furtek a nie tego. Jak walisz na PictureBoxie to wal obraz do bitmapy potem po każdej akcji ją czyść ... odczytuj i wal PictureBox.Refresh(); (tak po krótce ... ja zastosowałem to przy rysowaniu zwykłych obiektów i nie zamula programu więc i może Tobie pomoże)

P.S.
Jeżeli moge coś wtrącić z innej beczki ale jednak w temacie MIDI Formów...

Tworze sobie te okienka midi:
Rectangles form = new Rectangles();
form.Location = new Point(100, 100);
form.TopLevel = false;
Controls.Add(form);
form.Show();
PictureBox.SendToBack(); (to akurat do PB ale moze tez ma znaczenie ... nie wiem).

i w nich textboxy ... ale coś jest z nimi nie tak ponieważ. Jeżeli walne na tych formach textboxy i w nich jakiś text to tego tekstu nie moge zaznaczyć myszką tak jak normalnie (że moge cały zaznaczyć) bo on mi sie nie chce myszką zaznaczyć tak jakby to był pusty :(. Nie wiem o co biega. Może ktoś pomoże szybka odpowiedzią.

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