2010-04-28 26 views

risposta

-1

il picturebox è un controllo e ha un'immagine come fonte - in modo da avere per disegnare sull'immagine e la mano l'immagine al controllo di mostrarlo

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

Disegna __ in una bitmap__, non __ sulla picturebox__. Funziona ma è qualcosa di completamente diverso! – TaW

2

Il modo migliore è quello di non disegnare un cerchio e la linea in un picturebox! Non è progettato per quello scopo.

Da GDI di Bob Powell + blog:

La radice di questo problema è che le regole fondamentali di finestre programmazione sono stati rotti. E come conseguenza della casella immagine, viene accusato di qualcosa che non è proprio colpa sua. Per spiegare meglio il motivo , i quattro punti seguenti descrivono cosa non funziona in questo caso.

  • Il controllo PictureBox serve per la visualizzazione delle immagini. Non è un segnaposto pratico per una superficie grafica.

  • Windows è un sistema basato su eventi in cui ogni evento deve essere servito nel contesto corretto e gli eventi destinati a gestire il clic del pulsante o gli eventi di spostamento del mouse non devono essere utilizzati per disegnare sullo schermo o altre cose strane.

  • Il PictureBox si aggiorna disegnando dell'oggetto in base System.Drawing.Image conservato nella sua proprietà Image. Se non ci sono immagini, mostrerà il colore di sfondo.

  • Rubare e attingere all'oggetto grafico da qualsiasi controllo non è una buona pratica, dovrebbe essere fortemente scoraggiato e infrange le regole di gestione degli eventi nel posto giusto al momento giusto. Fondamentalmente se lo fai causerai dolore. Quando sbatti la testa contro un muro, ti provoca dolore. questo è un segno che dovresti smettere di farlo. È lo stesso per la chiamata a PictureBox.CreateGraphics.

Il modo giusto per farlo.

Seguire le regole del sistema guidato da eventi è semplice ma richiede un po 'di accortezza . Quindi, se vuoi disegnare un po 'di grafica e mantenerla lì quando una finestra si sposta di fronte a esso e via di nuovo o quando riduci e riduci, devi eseguire il servizio l'evento Paint di qualunque oggetto esso sia che desideri dipingere. PictureBox porta con sé un bagaglio inutile per questo tipo di applicazione. Se si desidera disegnare qualcosa in una posizione , disegnarla nel modulo rispondendo all'evento Form.Paint. Se si desidera un segnaposto utile per un elemento grafico che funzioni all'interno di un set di limiti , utilizzare un controllo Panel e il relativo servizio Paint. Se si desidera che duplichi ripetutamente un'immagine per l'immagine aziendale, creare un controllo e eseguire il disegno nell'override di OnPaint.

collegamento originale (non più valido): http://bobpowell.net/picturebox.htm

NOTA: Il link originale al blog di Bob Powell non è più funzionale. L'ho lasciato qui per scopi storici. Il contenuto della pagina può ancora essere visualizzato nell'archivio Internet (https://web.archive.org/web/20120330003635/http://bobpowell.net/picturebox.htm) alla data di modifica di questo post.

+2

+1 Questa è davvero la risposta corretta. Grazie per il link, che descrive il problema di root. – Sabuncu

+8

-1 "Linkrot" ... e questa risposta fornisce alcuni suggerimenti su quale sia il problema o cosa invece fare. "I collegamenti a risorse esterne sono incoraggiati, ma per favore aggiungi un contesto intorno al link in modo che i tuoi utenti possano avere un'idea di cosa sia e perché è lì. Cita sempre la parte più rilevante di un link importante, nel caso il sito target sia irraggiungibile o va permanentemente offline. " Fonte: http://stackoverflow.com/help/how-to-answer Ho tuttavia trovato le pagine bobpowell conservate nella "Wayback Machine": https://web.archive.org/web/20120216111903/http: //bobpowell.net/picturebox.htm –

+0

Questa è una risposta terribile. Le pagine (altrimenti grandiose) di bobpowell non sono solo sparite ma non suggeriscono in alcun modo che non dovresti disegnare su un PictureBox. In effetti il ​​loro DoubleBuffering predefinito lo rende l'unico controllo adatto per il disegno fuori dalla scatola. Bob si limita a mettere in guardia dall'usare la 'Control.CreateGraphics' pronta per la copia di tutti i neofiti dalla terribile pagina di esempio di MSDN. – TaW

24

o:

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 ); 
    } 

Gestisci l'evento vernice della finestra immagine e fai il disegno personalizzato lì.

Problemi correlati