Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Apua, kuvaongelma! *VB*

TH [26.04.2003 13:24:20]

#

Mikähän olisi kaikkein nopein tapa saada kuvasta kopioitua tietty alue PictureBoxiin tiettyyn kohtaan.
Esimerkkikoodi olisi tarpeen.. :)

Antti Laaksonen [26.04.2003 16:13:11]

#

PictureBox sisältää valmiin komennon PaintPicture, mutta nopeampaa on käyttää WinApin BitBlt-funktiota. Funktion syntaksi on (MSDN:stä):

BOOL BitBlt(
  HDC hdcDest, // kohdekuvan kahva
  int nXDest,  // kohdekuvan x-koordinaatti
  int nYDest,  // kohdekuvan y-koordinaatti
  int nWidth,  // kuvan leveys
  int nHeight, // kuvan korkeus
  HDC hdcSrc,  // lähdekuvan kahva
  int nXSrc,   // lähdekuvan x-koordinaatti
  int nYSrc,   // lähdekuvan y-koordinaatti
  DWORD dwRop  // kopiointitapa
);

Lähdekuva on kuva josta kopioidaan ja kohdekuva on kuva johon kopioidaan. VB:ssä tämä voi olla esimerkiksi formi tai kuvakehys. Kahva löytyy objektin hDC-muuttujasta.

Huomaa, että BitBlt käyttää pikseleitä, kun taas VB:ssä mittayksikkö on oletuksena twip. Kannattaa ehkä vaihtaa formin ScaleMode 3:ksi (Pixel), jolloin mitta-asteikot ovat yhtenevät.

Jos kuva kopioidaan tavallisesti, kopiointitapa on SRCCOPY (&HCC0020). On myös mahdollista käyttää VB:n omaa vakiota vbSrcCopy.

Lopuksi pieni esimerkki, joka kopioi kuvan kuvakehyksestä toiseen.

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 Const SRCCOPY = &HCC0020 ' (DWORD) dest = source

Private Sub Form_Click()
    Dim x As Long
    'kopioidaan kuva Picture1:sta Picture2:een
    '- kuvan koko on 50x50 pikseliä
    '- kuva kopioidaan Picture1:sta kohdasta (0, 0)
    '- kuva kopioidaan Picture2:een kohtaan (40, 60)
    '- kuva kopioidaan tavallisesti (SRCCOPY)
    x = BitBlt(Picture2.hDC, 40, 60, 50, 50, Picture1.hDC, 0, 0, SRCCOPY)
End Sub

TH [26.04.2003 16:17:42]

#

Kiitos! :) Tälle on käyttöä!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta