Avatar billede xfox Nybegynder
11. februar 2002 - 08:40 Der er 3 kommentarer og
1 løsning

Indsætnig af billede at runtime

Jeg skal have indsat et billede at runtime. Man kunne selvfølgelig have lavet en imageramme på formen at designtime, og så hente billedet ind i den at runtime, men da jeg har små hundere billeder der i teorien skulle sættes ind på samme tid, vil jeg gerne have lavet en løsning som selv generere en imageramme og indsætter et billede på et bestemt tidspunkt på en bestemt position. Imagerammen skal så kunne unloades når man vil have billedet fjernet. For at opsumere skal man altså at runtime kunne indsætte et billede på en form, og fjerne det igen, uden at der er forudbestemte imagerammer.
Avatar billede kennethrisum Nybegynder
11. februar 2002 - 09:42 #1
Denne kode viser hvordan du kan gøre det med en blanding af IPictureDisp objektet samt Windows GDI. Din form skal have Autoredraw property sat til true for at det virker. I stedet for BitBlt api'et for du nok større success (mere flesibilitet) hvis du bruger StretchBlt:

Option Explicit

Private Declare Function DeleteDC Lib "gdi32" _
  (ByVal hdc As Long) As Long

Private Declare Function SelectObject Lib "gdi32" _
    (ByVal hdc As Long, _
    ByVal hObject As Long) As Long
   
Private Declare Function DeleteObject Lib "gdi32" _
    (ByVal hObject As Long) As Long

Private Declare Function BitBlt Lib "gdi32" _
    (ByVal hDestDC 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 dwRop As Long) As Long

Private Declare Function CreateCompatibleDC Lib "gdi32" _
    (ByVal hdc As Long) As Long

Private Const SRCAND = &H8800C6  ' (DWORD) dest = source AND dest
Private Const SRCCOPY = &HCC0020 ' (DWORD) dest = source
Private Const SRCERASE = &H440328        ' (DWORD) dest = source AND (NOT dest )
Private Const SRCINVERT = &H660046      ' (DWORD) dest = source XOR dest
Private Const SRCPAINT = &HEE0086        ' (DWORD) dest = source OR dest

Private Sub Form_Load()
  Dim lOldBitmap As Long
  Dim lDC As Long
  Dim pic As IPictureDisp
  Dim lReturn As Long
 
  Set pic = LoadPicture("E:\Show.jpg")
 
  lDC = CreateCompatibleDC(Form1.hdc)
  lOldBitmap = SelectObject(lDC, pic.Handle)
 
  lReturn = BitBlt(Form1.hdc, 0, 0, 300, 300, lDC, 0, 0, SRCCOPY)
 
  lReturn = SelectObject(lDC, lOldBitmap)
  lReturn = DeleteDC(lDC)
  Set pic = Nothing
  Set Form1.Picture = Form1.Image
End Sub

mvh/Kenneth

P.S. Der er lige nogle filnavne, bredder osv. der skal ændres men ideén virker.
Avatar billede kennethrisum Nybegynder
11. februar 2002 - 09:43 #2
Det var forresten et svar ;-)
Avatar billede xfox Nybegynder
11. februar 2002 - 12:06 #3
Jeg vil gerne acceptere dit svar hvis du gider at forklare hvad det er der præcis sker i koden. Kan du ikke også komme ind på hvordan man får unloaded billede
Avatar billede kennethrisum Nybegynder
11. februar 2002 - 12:22 #4
Det der sker er, at jeg først loader billedet med linien:
Set pic = LoadPicture("E:\Show.jpg")

Nu har jeg så mit billede, men mht. Windows GDI skal man bruge et handle til en DC (Device Context) og ikke et billede. Derfor laver jeg først en DC, der er kompatibel med min form (mht. opløsning farver m.m.) hvorefter jeg 'putter' mit billede (pic) ind i det DC. Dette sker i linierne:

  lDC = CreateCompatibleDC(Form1.hdc)
  lOldBitmap = SelectObject(lDC, pic.Handle)

Herefter tager jeg billedet i mit nye DC og kopiere det til formens DC. Dette sker i linien:

  lReturn = BitBlt(Form1.hdc, 0, 0, 300, 300, lDC, 0, 0, SRCCOPY)

Her kan du alternativt benytte StretchBlt, der udover at kopiere billedet også kan udvide/formindske det (Stretch).

De næste tre linier ryder op efter mig. Jeg kopierer det originale billede tilbage til form'ens DC sletter min nye DC samt releaser mit pic object.

Linien: Set Form1.Picture = Form1.Image
bruges til at 'gemme' billedet på formen. GDI funktionerne 'skriver' til den VB property der hedder image. VB gemmer derfor Image i sin picture property.

Når du vil have slettet billederne igen kan du bruge:
Set form1.picture = Nothing

mvh/Kenneth
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester