11. januar 2002 - 12:43
#2
Du skal have et bitmap med en DC (DeviceContext), DVS f.eks i en picturebox eller form (der har en property der hedder HasDC). Du kan også gøre det med bitmaps du selv har lavet, eller bitmaps fra filer, men så involverer det flere API-kald. Lad os gøre det nemt, og antage at du har en form med en knap og 2 pictureboxe: PB1 og PB2 (prøv at gøre den større end PB1). I PB1 indsætter du et bitmap.
Øverst i formens kode eller i et modul indsætter du:
Declare Function StretchBlt Lib \"gdi32\" _
(ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _
ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, _
ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, _
ByVal dwRop As Long) As Long
Her kan du også indsætte en række konstanter til den sidste parameter dwrop (fylder for meget her).
I knappens Click-event indsætter du:
\'alle parametre initialiseres:
Dim RetVal as Long \'til returværdi
Dim hdc, x, y, nWidth, nHeight, hSrcDc, xSrc, ySrc, nSrcWidth, nSrcHeight, dwRop
hdc = PB2.hdc \'modtagerens DC
x = 0 \'startpunkt i modtager
y = 0
nWidth = PB2.Width \'bredde af bitmap i modtager
nHeight = PB2.Height
hSrcDc = PB1.hdc \'kildes DC
xSrc = 0 \'kildes startpunkt
ySrc = 0
nSrcWidth = PB1.Width \'Kildes bredde
nSrcHeight = PB1.Height
dwRop = vbSrcCopy \'konstant -du kan finde dem i API-vieweren
Så kalder du funktionen:
RetVal = StretchBlt (hdc, x,y ,nWidth ,nHeight ,hSrcDC ,xSrc ,ySrc ,nSrcWidth ,nSrcHeight ,dwRop)
Dette ser måske meget kompliceret ud for at kopiere et billede fra en PicBox til en anden, men det er jo heller ikke her den skal anvendes. Du kan bruge hDc og hSrcDc til f.eks. at tegne direkte på skærmen (Den har også en DC).
Håber dette bringer lidt klarhed over sagen.
MVH tjacob
14. januar 2002 - 13:15
#3
Tjacob>>
Klarhed eller sorthed er nok spm. men jo jeg kan godt forstå koden, men at kopier et billede fra en picturebox til en anden er jo ikke svært..Men er det ikke andet man kan gøre med den??
14. januar 2002 - 14:02
#4
Jo, du kan netop tegne hvadsomhelst hvorsomhelst med StretchBlt (og BitBlt).
VB bruger selv StretchBlt i baggrunden, f.eks. i forbindelse med Image-kontrollens Stretch-property.
Som jeg skrev kan du f.eks. tegne direkte på skærmen (altså uden for din VB-form), og i forbindelse med noget timer, kunne du f.eks. få en figur til at vandre tværs henover skærmen, ovenpå alle åbnede vinduer!
Men, som jeg også skrev, at hvis du vil bruge StretchBlt i mere avancerede sammenhænge, så skal der anvendes flere API-kald, f.eks. til at finde DC\'ere, og til at styre skærmopdatering m.m.
Det bliver hurtigt meget kompliceret!