Domanda

Sto realizzando disegni personalizzati in celle Datagridview e ho elementi che possono estendersi verticalmente su più celle. Un elemento visualizza il testo e il problema a portata di mano è come posso disegnare solo la parte della cella del testo? Ho il rettangolo dell'articolo e il cellBounds.

Attualmente, sto disegnando tutto il testo su ogni vernice di cella, ovvero sto disegnando su celle diverse da quella da cui sto attualmente disegnando. Questo mi richiede di cancellare il testo precedente (in modo che non diventi sfocato e in grassetto) ... quindi sto effettivamente disegnando la stringa due volte per cella di vernice. Non molto efficiente.

//get the actual bounds of this  entire item spanning across multiple cells
RectangleF sRectF = GetItemRectF(startX + leftMargin + 2, widthForItem, cellBounds, calItem);

//we clear it out first, otherwise the text looks bolded if we keep drawing a black string over and over
//todo should figure out how to only draw this cells section? cellBounds subsection of sRectF somehow
graphics.DrawString(calItem.Description, new Font("Tahoma", 8), new SolidBrush(itemBackColor), sRectf);
graphics.DrawString(calItem.Description, new Font("Tahoma", 8), new SolidBrush(Color.Black), sRectF);

Potrei disegnare la stringa su alcuni grafici temporanei e quindi strappare la parte dei limiti di cella e disegnarla sulla grafica reale? C'è un modo migliore?

Grazie

risposta

Region tempRegion = graphics.Clip;
graphics.Clip = new Region(cellBounds);
graphics.DrawString(calItem.Description, new Font("Tahoma", 8), new SolidBrush(Color.Black), sRectF);
graphics.Clip = tempRegion;
È stato utile?

Soluzione

Non credo di aver capito bene l'effetto visivo che intendi avere. Il testo dell'articolo dovrebbe sovrapporsi a più celle o essere ritagliato in una singola cella? Se è necessario ritagliare la cella, è possibile impostare l'area di ritaglio utilizzando Graphics.Clip per tagliare su un rettangolo specificato.

Se il problema è legato alla sbavatura a causa della mancata cancellazione del buffer, è possibile utilizzare FillRectangle per cancellare un'area più economica del disegno di testo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top