ELi haluaisin kuvastani leikata bitblteellä(luulen niin) mustan värin kokonaan poies
Kuvan taustavärin täytyy olla musta, ja sillä täytyy olla erikseen maskibittikartta, jossa taustaväri on valkoinen ja muu mustaa.
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 BitBlt kohde.hDC, x, y, leveys, korkeus, maski.hDC, lukualkux, lukualkuy, VbScrAnd BitBlt kohde.hDC, x, y, leveys, korkeus, kuva.hDC, lukualkux, lukualkuy, VbScrInvert
Tässä on parametrit (copypaste jostain, en muista lähdettä mutta sillä oli jotain tekemistä putkan kanssa):
'vbDstInvert Inverts the destination bitmap 'vbMergeCopy Combines the pattern and the source bitmap 'vbMergePaint Combines the inverted source bitmap with the destination bitmap by using Or 'vbNotSrcCopy Copies the inverted source bitmap to the destination 'vbNotSrcErase Inverts the result of combining the destination and source bitmaps by using Or 'vbPatCopy Copies the pattern to the destination bitmap 'vbPatInvert Combines the destination bitmap with the pattern by using Xor 'vbPatPaint Combines the inverted source bitmap with the pattern by using Or. ' Combines the result of this operation with the destination bitmap by using Or 'vbSrcAnd Combines pixels of the destination and source bitmaps by using And 'vbSrcCopy Copies the source bitmap to the destination bitmap 'vbSrcErase Inverts the destination bitmap and combines the result with the source bitmap by using And 'vbSrcInvert Combines pixels of the destination and source bitmaps by using Xor 'vbSrcPaint Combines pixels of the destination and source bitmaps by using Or
btw, tein joskus apuohjelman joka tekee kuvista maskeja (jos ihmisillä eivät sattuisi omistamaan kuvankäsittelemisohjelmia) http://sooda.dy.fi:8080/mordor/dl/bin/
Tälläsiin mieltä askarruttaviin kysymyksiin yleensä auttaa yleismaailmallinen Rtfm() -funktio, parametriksi kelpaa hyvin esim "ohjelmointiputka.net/oppaat.php". Funktio palauttaa esimerkiksi tällaisin spriteiksi kutsuttuihin kuviin liittyvissä ongelmissa (kuten vaikka tätä juuri edeltävä aihe) tulokseksi https://www.ohjelmointiputka.net/oppaat/opas.
en nyt ole varma olenko hakoteillä vai teinkö oikein
BitBlt picukko.hDC, X, Y, 800, 400, maski.hDC, 0, 0, VbScrAnd BitBlt picukko.hDC, X, Y, 800, 400, picukko.hDC, 0, 0, VbScrInvert
Ei ainakaan toiminut.
Ja koitin myös vitun manuaali functiota mutta siitä en saanut mitään selvää. Tai sain mutta en tajunnut kunnolla.
ELi tossa on mun hahmot mitä pitäisi muuttaa.
Puhveli kirjoitti:
Tälläsiin mieltä askarruttaviin kysymyksiin yleensä auttaa yleismaailmallinen Rtfm() -funktio, parametriksi kelpaa hyvin esim "ohjelmointiputka.net/oppaat.php".
Mwah, Puhveli alkaa osata :P
Löytyisikö jostain sama juttu, mutta vb.NET:ille?
tesmu kirjoitti:
en nyt ole varma olenko hakoteillä vai teinkö oikein
BitBlt picukko.hDC, X, Y, 800, 400, maski.hDC, 0, 0, VbScrAnd BitBlt picukko.hDC, X, Y, 800, 400, picukko.hDC, 0, 0, VbScrInvertEi ainakaan toiminut.
Ja koitin myös vitun manuaali functiota mutta siitä en saanut mitään selvää. Tai sain mutta en tajunnut kunnolla.
ELi tossa on mun hahmot mitä pitäisi muuttaa.
vbSrc, ei vbScr
BitBlt picukko.hDC, X, Y, 800, 400, maski.hDC, 0, 0, VbSrcAnd
BitBlt picukko.hDC, X, Y, 800, 400, picukko.hDC, 0, 0, VbSrcInvert
eipä toiminu vieläkään tällä kertaa kyllä tuo maski meni tämän ukon päälle ja se muuttui mustaksi =D
sori, heitin tuon Scr:n lonkalta ja typotin tietty, mutta olisi tuosta "toisesta listauksesta" voinu päätellä miten se oikeesti menee :P, tai sitten siitä että VbSrcCopy on lyhenne sanoista Visual Basic Source (bitmap) Copy, ja tarkoittaa kuvan tulostamista suorana kopiona kuvasorsasta (basicissa vastaava on "PUT (x, y), kuva&, PSET").
Mutta joo, et halua piirtää sitä kuvaa samaan missä kuvan sorsa on, vaan pelikentälle (peliä teet kuitenkin). Kohteen, eli Formin tai PictureBoxin AutoRedraw on syytä olla True ja ScaleModen 3 eli Pixel.
kohde.AutoRedraw = True kohde.ScaleMode = 3 BitBlt kohde.hDC, x, y, maski.ScaleWidth, maski.ScaleHeight, maski.hDC, 0, 0, VbSrcAnd BitBlt kohde.hDC, x, y, kuva.ScaleWidth, kuva.ScaleHeight, kuva.hDC, 0, 0, VbSrcInvert
jos nyt oikein ymmärsin niin näin
BitBlt picukko.hDC, X, Y, 800, 400, maski.hDC, 0, 0, vbSrcAnd BitBlt Form1.hDC, X, Y, 800, 400, picukko.hDC, 0, 0, vbSrcInvert
Mutta ei toimi :(
Et ymmärtänyt oikein, lue uudestaan mun edellinen threadi :( Molemmissa pitää olla sama kohde.
BitBlt Form1.hDC, X, Y, 800, 400, maski.hDC, 0, 0, vbSrcAnd BitBlt Form1.hDC, X, Y, 800, 400, picukko.hDC, 0, 0, vbSrcInvert
Onko vielä jotain lisättävää meinaan tuokaan ei toimi
Pahus, on toki :D
BitBlt on siitä kiva funktio, että se pistä kohdettaan päivittymään, eli voit piirtää hitaammillakin koneilla tuhansia miljoonia biljoonia kuvia kohteelle, ja näyttää ne kaikki sitten kerralla, toisin kuin VB:hen tungetuilla oletusgrafiikkafunktioilla.
Eli BitBlt tarvitsee aina kohde.Refresh-käskyn, tai jonkun muun (esim grafiikkafunktion) joka tekee saman kaupanpäällisinä.
yksi vaihtoehto on tietysti että käyttää Transparentblt:iä.
alla pieni esimerkki
tarviit picture1,picture2[jossa on kuva]
ja F5-napin/Start.
Private Declare Function TransparentBlt Lib "msimg32.dll" (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 crTransparent As Long) As Boolean Dim a As Long Private Sub Form_Load() Me.Show DoEvents a = TransparentBlt(Picture1.hDC, 0, 0, 64, 64, Picture2.hDC, 0, 0, 64, 64, RGB(0, 0, 0)) End Sub
Aihe on jo aika vanha, joten et voi enää vastata siihen.