[ Emerald_MG @ 12.09.2008. 00:29 ] @
Znam da je ovo pitanje pre za VB.NET forum ali tamo definitivno nema ni delić spremnosti za pomoć u poređenju sa ovim forumom (navodno penzionisanog VB6). Kao i sve vas pritisla me je potreba da pređem na .NET platformu i treba da preradim jedan program ranije napisan u VB6 na VB.NET. Polako učim i mučim se. Radi se o sledećem (govorim kako je to bilo rešeno u VB6). Na jednoj formi imam PictureBox neke veličine (nebitno koje). Iz određene kolekcije klasa uzimam podatke koje pretvaram u grafiku na tom PictureBox-u. Očitam vrednosti koje treba da prikažem (npr. 1000 x 1200) vidim koja je veća i na odgovarajući način uradim :

PictureBox1.ScaleHeight = ta vrednost + malo za marginu
PictureBox1.ScaleWidth = ta vrednost + malo za marginu
PictureBox1.Top = na neku marginu kao i .Left svojstvo

i dalje crtam sa "orginalim" vrednostima objekta.

Moje pitanje je kako to sada odraditi u VB.NET-u ?!

Pripremu za crtanje radim na PictureBox kontroli (jer moram da imam crtež svo vreme, bez obzira da li neka forma prelazi preko njega ili ne):

Imports System.Drawing.Drawing2D
....
bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
PictureBox1.Image = bmp
G = Graphics.FromImage(bmp)
....
myPath.AddLines(myPoints)
myPath.CloseFigure()
G.DrawPath(pn, myPath)
.....


dalje je problem kako postići ono što sam opisao ranije, jer npr. bmp ima 850 x 720 pixel-a a potrebno mi je da crtam vrednosti od recimo 1000 do 6000 (pixel-a).

G.ScaleTransform(0.2, 0.2) - npr. ne daje dobar rezultat jer nacrtan je samo "deo" crteža pa se i kod skaliranja samo "umanji" taj deo koji je nacrtan.

Bilo kakva ideja bi mi koristila ...

[ Eurora3D Team @ 15.09.2008. 13:04 ] @
Kad konstruises objekat od klase Bitmap sa tim tvojim podatcima u Graphics imas metodu DrawImage. To je overloaded funkcija , tako da mozes da koristis verziju funkcije koja ima prvi argument bitmap objekat a drugi rectangle koji oznacava gde ce bitmapa da se iscrta. Ako je rectangle manji od prave velicine slike slika se skalira ...
Nesto ovako
Code:

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim myBitmap = New Bitmap("C:\Slika.bmp")
        Dim myGraphics As Graphics = e.Graphics
        Dim myRect As Rectangle = New Rectangle(10, 10, 100, 100)
        myGraphics.DrawImage(myBitmap, myRect)
End Sub
[ Emerald_MG @ 17.09.2008. 22:22 ] @
@Eurora3D Team,

hvala na pokušaju da mi pomogneš (iskreno cenim) ali se nismo razumeli u sledećem :

1. Ne koristim OnPaint metod
2. Ne koristim DrawImage metod

Moj bitmap je na PictureBox kontroli i služi da "čuva" nacrtano sa DrawRectangle, DrawPath, DrawArc i sl. Dakle ne skaliram nikakav Image (sliku).
Traženi rezultat sam uspeo da dobijem na sledeći način :

Code:


        odnosSirVis = fSirina / fVisina               '
        bmp = New Bitmap(800, 600)
        PictureBox1.Image = bmp
        
        If odnosSirVis = 1 Then                        'širina i visina su jednake 
            odnosCrtezSlika = 450 / fSirina
            pTransLeft = 175
            pTransTop = 75
       
        ElseIf odnosSirVis > 1 Then                   'širina je veća nego visina  
            odnosCrtezSlika = 450 / fSirina
            pTransTop = (600 - odnosCrtezSlika * fVisina) / 2
            pTransLeft = (800 - odnosCrtezSlika * fSirina) / 2
        
        ElseIf odnosSirVis < 1 Then                    'visina je veća nego širina 
            odnosCrtezSlika = 450 / fVisina
            pTransLeft = (800 - odnosCrtezSlika * fSirina) / 2
            pTransTop = (600 - odnosCrtezSlika * fVisina) / 2
        
        End If

        G = Graphics.FromImage(bmp)
        
        G.DrawRectangle(Pens.White, New Rectangle(0, 0, bmp.Width - 1, bmp.Height - 1)) ' privremeno samo da obeležim "granice" bmp-a 

  
        G.TranslateTransform(pTransLeft, pTransTop)                     ' sa ovim dobijam odgovarajuće "simetrične margine" crteža u odnosu na bmp
        G.ScaleTransform(odnosCrtezSlika, odnosCrtezSlika)             ' ovo "priprema" bmp odnosno G za ogovarajuće crtanje 
        
        myCrtajGrafiku (New Rectangle(0, 0, fSirina, fVisina))           ' ovom procedurom crtam sa "orginalim" vrednostima  Širine i Visine
                                                                                          ' pomoću metoda DrawRectangle, DrawLine i sl. 
 


Dakle sa ovim sam dobio ono što mi treba ali je nekako "seljačka" varijanta. Osećam da mi treba upotreba PageScale (Gets or sets the scaling between world units and page units for this System.Drawing.Graphics object) ali ja to još nisam "provalio" kako.




[Ovu poruku je menjao Emerald_MG dana 17.09.2008. u 23:34 GMT+1]
[ Shadowed @ 18.09.2008. 08:09 ] @
Ostavicu temu ovde, moze da prodje, iako jeste za .NET forum (ja nisam ni pogledao ranije jer je ovde, a nije bas da nismo spremni da pomognemo).
Tacno je sto kazes, da ne koristis DrawImage, ali... koristi ga :)
Elem, crtaj na drugi bitmap koji se ne prikazuje nigde, a zatim uradi DrawImage crtajuci (skalirano) taj bitmap na ovaj koji prikazujes. Tako imas samo 3 linije vise, bez ikakavih proracunavanja umesto ovog kod svakog iscrtavanja.
[ Emerald_MG @ 19.09.2008. 22:43 ] @
@Shadowed,

ima logike u tome što kažeš ali meni ne ide od ruke. Evo uzmem na primer formu (Form1), na nju stavim PictureBox1 (recimo nešto veći od 800x800) i jedan Button1, sa sledećim kodom

Code:

Public Class Form1
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim bmpZaPrikazivanje As New Bitmap(800, 800)
        Dim G_ZaCrtanje As Graphics
        Dim G_ZaPrikaz As Graphics
        Dim Sirina As Integer = 1300                              'može se probati sa različitim vrednostima visine i sirine
        Dim Visina As Integer = 1600
        Dim bmpZaCrtanje As New Bitmap(Sirina + 100, Visina + 100) '100 je recimo za "margine"

        G_ZaCrtanje = Graphics.FromImage(bmpZaCrtanje)
        G_ZaCrtanje.DrawRectangle(Pens.Blue, 50, 50, Sirina, Visina)  ' ovo je "crtež" pravougaonika sa marginom od 50 
        Dim myRect As New Rectangle(0, 0, 700, 700)                      ' stavljam 700x700 da budem siguran da će biti manji 
        G_ZaPrikaz = Graphics.FromImage(bmpZaPrikazivanje)            ' od obe bitmape 
        G_ZaPrikaz.DrawImage(bmpZaCrtanje, myRect)                     ' ovo bi trebalo da automatski skalira ali .... 

        PictureBox1.Image = bmpZaPrikazivanje
    End Sub

End Class




Gde grešim ?