2010-04-28 17 views

Odpowiedz

-1

PictureBox jest kontrola i ma obrazu jako źródła - więc trzeba zwrócić na obraz i przekazać obraz do sterowania, aby pokazać, że

MyImage = new Bitmap(fileToDisplay); 
pictureBox1.ClientSize = new Size(xSize, ySize); 
pictureBox1.Image = MyImage; 
+0

To rysuje __into bitmap__, a nie __onto do skrzynki obrazkowej__. Działa, ale jest zupełnie inaczej! – TaW

2

Najlepszym sposobem NIE jest narysowanie okręgu i linii w grafice! Nie jest przeznaczony do tego celu.

Od GDI + Boba Powella blogu:

Źródłem tego problemu jest to, że podstawowe zasady programowania okien zostały złamane. I w związku z tym, że skrzynka z obrazkami jest obwiniana za coś, co tak naprawdę nie jest jej winą. Aby wyjaśnić, dlaczego cztery poniższe punkty opisują, co poszło nie tak w tym przypadku.

  • Sterowanie PictureBox służy do wyświetlania obrazów. To nie jest poręczny symbol zastępczy dla powierzchni graficznej.

  • Windows to system sterowany zdarzeniami, w którym każde zdarzenie musi być serwisowane w odpowiednim kontekście, a zdarzenia przeznaczone do obsługi zdarzeń kliknięcia lub ruchu przycisku nie mogą być używane do rysowania na ekranie lub innych dziwnych rzeczy.

  • Obrazek odświeża się, rysując obiekt oparty na System.Drawing.Image przechowywany w jego obrazie. Jeśli nie ma obrazu, pokaże on kolor tła.

  • Kradzież i rysowanie obiektu Grafiki jakiejkolwiek kontroli nie jest dobrą praktyką, należy zdecydowanie odradzać i łamie zasady obsługi zdarzeń we właściwym miejscu i czasie. Zasadniczo, jeśli to zrobisz, spowoduje to ból. Kiedy uderzasz głową o ścianę, powoduje to ból. to znak, że powinieneś przestać to robić. To samo dotyczy wywołania PictureBox.CreateGraphics.

Właściwy sposób na zrobienie tego.

Przestrzeganie zasad systemu sterowanego zdarzeniami jest łatwe, ale wymaga pewnej uprzedzenia w zakresie . Tak więc, jeśli chcesz narysować trochę grafiki i pozostawić ją tam, gdy okno przesunie się przed nią i odejdzie ponownie lub gdy zminimalizujesz i przywrócisz, musisz obsługiwać zdarzenie Paint dowolnego obiektu, który jest na którym chcesz malować. Urządzenie PictureBox niesie ze sobą taki bagaż, który jest niepotrzebny w przypadku tego rodzaju aplikacji dla . Jeśli chcesz narysować coś w jednym miejscu , narysuj je na formularzu, odpowiadając na zdarzenie Form.Paint. Jeśli chcesz, aby potrzebował poręcznego symbolu zastępczego dla grafiki działającej w obrębie zestawu granic , użyj kontrolki Panel i obsłuż zdarzenie Paint. Jeśli chcesz, aby w celu powielenia grafiki obraz korporacyjny został skopiowany jeden raz, utwórz kontrolkę i wykonaj rysunek w trybie nadpisania OnPaint.

Original Link (nieważne): http://bobpowell.net/picturebox.htm

UWAGA: oryginalny link do bloga Boba Powella już nie działa. Zostawiłem to tutaj dla celów historycznych. Treść strony można nadal wyświetlać w archiwum internetowym (https://web.archive.org/web/20120330003635/http://bobpowell.net/picturebox.htm) od daty edycji tego posta.

+2

+1 To naprawdę jest właściwa odpowiedź. Dziękuję za link, który opisuje główny problem. – Sabuncu

+8

-1 "Linkrot" ... i ta odpowiedź daje kilka wskazówek, co do tego, czym jest problem, lub co zrobić zamiast tego. "Zachęca się linki do zasobów zewnętrznych, ale proszę dodać kontekst związany z linkiem, aby inni użytkownicy mieli pewną wiedzę na temat tego, co to jest i dlaczego tam jest. Zawsze cytuj najważniejszą część ważnego linku, jeśli witryna docelowa jest nieosiągalny lub zostanie trwale wyłączony. " Źródło: http://stackoverflow.com/help/how-to-answer Zrobiłem jednak znaleźć strony bobpowell zachowane w "Wayback Machine": https://web.archive.org/web/20120216111903/http: //bobpowell.net/picturebox.htm –

+0

To jest straszna odpowiedź. Strony (bobpowell, w przeciwnym razie świetne) nie tylko zniknęły, ale w żaden sposób nie sugerują, że nie powinieneś rysować na PictureBox. W rzeczywistości ich domyślne DoubleBuffering czyni je jedynymi kontrolkami, które są odpowiednie do wyciągania z pudełka. Bob po prostu ostrzega przed używaniem usuniętego "Control.CreateGraphics" wszystkich kopii od poprzedniej, a także strasznej strony startowej MSDN. – TaW

24

lub:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawLine(
      new Pen(Color.Red,2f), 
      new Point(0,0), 
      new Point(pictureBox1.Size.Width, pictureBox1.Size.Height)); 

     e.Graphics.DrawEllipse(
      new Pen(Color.Red, 2f), 
      0,0, pictureBox1.Size.Width, pictureBox1.Size.Height ); 
    } 

Zajmij się zdarzeniem malowania w ramce graficznej i wykonaj tam swój niestandardowy rysunek.

Powiązane problemy