Bekleyin - burada düşük asılı bir meyveyi kaçırdınız. Büyük ihtimalle yeniden boyutlandırma işlemleri sırasında görüntüyü gerçekten yeniden çizmiyorlar. Video sürücüsündeki mevcut görüntüyü StretchBlt kullanarak yeniden boyutlandırabilirler - bu da video sürücüsü/donanımı tarafından çok daha hızlı, daha düşük kalitede bir görüntüyü yeniden çizebileceğinizden daha hızlı olacak şekilde optimize edilebilir.
strateji:
-Image nesneler, görüntü nesnesinin
-repaint görüntüsünün
-repaint sürükleyerek -during son pozisyonu
günceller tam kaliteyi çizer Son Pozisyon/Boyut (diag) için üye değişkeni var Bunu yapın:
* Son Konum/Boyut için Geçerli konum/Boyut: Geçerli konum/Boyut
* Güncelleştirme Son Konum/Boyut
* Birkaç saniyeden daha fazla bir süredir. Son fare hareketinden bu yana çizim ve/veya> .2s, yeni bir tam kaliteli görüntü elde etmek için yeniden boyamayı (sadece geçersiz kılma değil - ŞİMDİ istiyorsanız) arayın. Ayrıca diğer nesnelerden örtüşmeler algılarsanız (StrechBlt'd çok fazla)
Örnek kodlar Benzer bir şey yapan bir uygulamada kullanıyorum (nesnelerin 100'üne sahip olabilecek bir pencereyi boyutlandıran yakınlaştırma efekti) bir ipad demo sadece yumuşak) gibi görünür:
tabii
Declare Function StretchBlt Lib "gdi32.dll" _
(ByVal hdcDest As IntPtr, _
ByVal nXOriginDest As Integer, _
ByVal nYOriginDest As Integer, _
ByVal nWidthDest As Integer, _
ByVal nHeightDest As Integer, _
ByVal hdcSrc As IntPtr, _
ByVal nXOriginSrc As Integer, _
ByVal nYOriginSrc As Integer, _
ByVal nWidthSrc As Integer, _
ByVal nHeightSrc As Integer, _
ByVal dwRop As Int32) As Boolean
Using g As Graphics = f.pb.CreateGraphics
' parm of True says draw plain view - no text = looks bad Zooming.
f.DrawAll(g, True)
For i As Integer = iSteps To 1 Step -1
Dim HDC1 As IntPtr = g.GetHdc
Try
' Size of bite will not be right, but by re-adjusting
' with each iteration, it will make it to full-screen.
' Looks as good as having it right to start with, only much easier.
TopBite = objTop \ i
BottomBite = h - ((h - objBottom) \ i)
' Stretch/move the stuff.
StretchBlt(HDC1, 0, 0, w - LeftBite, h, _
HDC1, LeftBite, TopBite, w - LeftBite, BottomBite - TopBite, 13369376)
' Calculate where MyEntry would be after each stretch. Then the Bite
' size calcs above will ensure its closer next time.
SimulateStretch(objTop, objBottom, TopBite, BottomBite, h)
Finally
g.ReleaseHdc(HDC1)
End Try
' Clear exposed/invalid area to the right.
g.FillRectangle(br, w - LeftBite, 0, LeftBite, h)
' Sleep will make Swells close in duration between small/big window.
' (Can I actually sleep this short of a time?)
System.Threading.Thread.Sleep(5)
Next
End Using
biri geri yukarı o zaman şeker şey görüntü ve boyutları, eğer süper düşük kaliteli ve pixellated olacak - böylece sıklıkla için daha akıllı algorythm kullanabilirsiniz Yeniden boyutlandırmama durumunda mousedrag sırasında gerçek onpaint'i ateşleyin. Bunun somunları ve cıvataları, özel uygulamaya bağlı olacaktır.Uygulamanızla ilgili daha ayrıntılı bilgi verebilmemiz için doğru olanı vermelisiniz (tam olarak neye benziyor?) Büyük bir kare usercontrol/birçok ownerdrawn öğesi varsayalım, hepsi aynı anda yeniden boyutlandırıldı. Küçük başlar ve yeniden boyutlandırılırlar, böylece örtüşmeye başlarlarsa, yeniden boyutlandırma işlemleri sırasında düzenli olarak tam olarak yeniden çizim yapmak zorunda kalırsınız.
Ayrıca, daha düşük kalitede daha düşük performans için HQ görüntüsünden bir bellek HDC'sinde strechblt yapabilirsiniz, ancak hiç yapmadım, sonuçları bilmiyorum. – FastAl