Flip per GraphicsPath.

giovedì 17 agosto 2006 - 20.23

D0X Profilo | Newbie

ciao!

Qualcuno sa come ottenere un Flip Horizontal e Vertical (operazione conosciuta anche come Mirror Horizontal e vertical) su di un GraphicsPath??!?! Forse si deve costruire un amatrice particolare a applicargliela in rotazione ma non ho trovato ancora nessun documento in merito.

Qualcuno ha un'idea?

Ciao!

Brainkiller Profilo | Guru

>Qualcuno sa come ottenere un Flip Horizontal e Vertical (operazione
>conosciuta anche come Mirror Horizontal e vertical) su di un
>GraphicsPath??!?! Forse si deve costruire un amatrice particolare
>a applicargliela in rotazione ma non ho trovato ancora nessun
>documento in merito.

Direi proprio di sì.
Secondo me una volta completato il GraphicsPath si può disegnare sul Device Context e poi applicare una Matrice per effettuare la rotazione nel senso voluto.
Ciao

Aggiungo alcune cose, se vuoi fare un flip di una immagine puoi fare così:

Image d=Image.FromFile("C:\\img.jpg"); d.RotateFlip(RotateFlipType.Rotate90FlipX); pictureBox1.Image=d;

Se invece vuoi flippare un GraphicsPath in pratica visto che verrà disegnato in un device context rettangolare puoi semplicemente prendere l'altezza o la lunghezza del rettangolo, sottrai le coordinate e troverai ribaltato il graphicsphat.
ciao


David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

D0X Profilo | Newbie

Grazie Brain per la risposta. Nel caso dell'immagine sapevo di quei metodi, il Graphicspath alla fine l'ho flippato "a mano" come suggerisci anche tu.

Dato che ci sono, ti chiedo direttamente una cosa che magari puoi darmi una dritta: come si può creare una Bitmap di un controllo? Ho un controllo tipo pannello con dentro vari controlli personalizzati e ne vorrei creare una bitmap....ho provato varie strade ma ancora niente....ovviamente lo scopo di creare la bitmap era per poterlo stampare...

Ho provato diverse variazioni di questo codice:

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern long BitBlt (IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
private Bitmap memoryImage;
private void CaptureScreen()
{
Graphics mygraphics = this.CreateGraphics();
Size s = this.Size;
memoryImage = new Bitmap(s.Width, s.Height, mygraphics);
Graphics memoryGraphics = Graphics.FromImage(memoryImage);
IntPtr dc1 = mygraphics.GetHdc();
IntPtr dc2 = memoryGraphics.GetHdc();
BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376);
mygraphics.ReleaseHdc(dc1);
memoryGraphics.ReleaseHdc(dc2);
}

il GROSSISSIMO problema è che sia usando la BitBlt, sia usando la CopyFromScreen ho sempre lo stesso problema: il mio controllo (è un pannello....) non ci sta verticalmente nello schermo dato che sta in una FormMDI scrollata. L'immagine la crea della dimensione giusta (la size che gli passo è quella del pannello effettivamente...) ma questa immagine contiene SOLO la parte visibile a schermo, la parte che rimane nascosta nella FormMDI NON viene visualizzata....per non parlare del fatto che nell'immagine viene salvato anche un pezzetto della finestra di preview di stampa....per forza, quando ne fa lo snap sopra il pannello c'è la finestra di preview e cattura pure quella....cavolo smbra impossibile fare sta cosa eppure dovrebbe essere un problema ababstanza "comune"....

Grazie per qualsiasi idea!

ciao!

Brainkiller Profilo | Guru

>pezzetto della finestra di preview di stampa....per forza, quando
>ne fa lo snap sopra il pannello c'è la finestra di preview e
>cattura pure quella....cavolo smbra impossibile fare sta cosa
>eppure dovrebbe essere un problema ababstanza "comune"....

Io non ho mai avuto necessità sinceramente di stampare una Form, non mi sembra poi tanto comune. In effetti però è un bel problemino. Io ti consiglierei questa via:
http://www.dotnethell.it/articles/PrintWindowsForms.aspx

Fammi sapere cosa ne pensi.
ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

D0X Profilo | Newbie

Si, avevo visto quel tutorial. In quel modo è impossibile soprattutto se si hanno controlli personalizzati e complessi con molti elementi. Ho trovato una soluzione semplicissima che comunque un problema me lo da: nel framework 2.0 c'è il metodo DrawToBitmap applicabile ai controlli che disegna l'immagine del controllo in una bitmap!!! Funziona se non fosse che ha un problema: alcuni controlli sembra che perdano il "livello". Cioè, quelli che sono BringToFront (cioè sopra ad altri controlli....) nella bitmap appaiono come SendToBack (cioè SOTTO ad altri controlli.....). Devo risolvere questo problema!!!!! In caso di controlli che non si accavallano e allo stesso livello quella chiamata è perfetta!

ciao! TNX!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5