Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VC++ Przezroczyste rysowanie

0 views
Skip to first unread message

Garghoul

unread,
May 17, 2000, 3:00:00 AM5/17/00
to
Witam!
Czy wie ktoś jak narysować coś półprzezroczystego czy to w CDC czy w Win32
Api.Chodzi o coś w stylu photoshopowego airbrusha w kształcie koła - gdy
narysije się nim coś na bitmapie ,to brzegi są łagodne i prześwituje przez
nie tło. Za każdą pomoc będę wdzięczny.
Garghoul
garg...@polbox.com

pluton

unread,
May 17, 2000, 3:00:00 AM5/17/00
to
Siema

> Czy wie ktoś jak narysować coś półprzezroczystego czy to w CDC czy w Win32
> Api.Chodzi o coś w stylu photoshopowego airbrusha w kształcie koła - gdy
> narysije się nim coś na bitmapie ,to brzegi są łagodne i prześwituje przez
> nie tło.


// za MSDN
void DrawTransparentBitmap
(
HDC hdc,
HBITMAP hBitmap,
short xStart,
short yStart,
COLORREF cTransparentColor
)
{
BITMAP bm;
COLORREF cColor;
HBITMAP bmAndBack, bmAndObject, bmAndMem, bmSave;
HBITMAP bmBackOld, bmObjectOld, bmMemOld, bmSaveOld;
HDC hdcMem, hdcBack, hdcObject,hdcTemp, hdcSave;
POINT ptSize;

hdcTemp = CreateCompatibleDC(hdc);
SelectObject(hdcTemp, hBitmap); // Select the bitmap

GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
ptSize.x = bm.bmWidth; // Get width of bitmap
ptSize.y = bm.bmHeight; // Get height of bitmap
DPtoLP(hdcTemp, &ptSize, 1); // Convert from device
// to logical points

// Create some DCs to hold temporary data.
hdcBack = CreateCompatibleDC(hdc);
hdcObject = CreateCompatibleDC(hdc);
hdcMem = CreateCompatibleDC(hdc);
hdcSave = CreateCompatibleDC(hdc);

// Create a bitmap for each DC. DCs are required for a number of
// GDI functions.

// Monochrome DC
bmAndBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

// Monochrome DC
bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

bmAndMem = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
bmSave = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

// Each DC must select a bitmap object to store pixel data.
bmBackOld = SelectObject(hdcBack, bmAndBack);
bmObjectOld = SelectObject(hdcObject, bmAndObject);
bmMemOld = SelectObject(hdcMem, bmAndMem);
bmSaveOld = SelectObject(hdcSave, bmSave);

// Set proper mapping mode.
SetMapMode(hdcTemp, GetMapMode(hdc));

// Save the bitmap sent here, because it will be overwritten.
BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);

// Set the background color of the source DC to the color.
// contained in the parts of the bitmap that should be transparent
cColor = SetBkColor(hdcTemp, cTransparentColor);

// Create the object mask for the bitmap by performing a BitBlt
// from the source bitmap to a monochrome bitmap.
BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0,
SRCCOPY);

// Set the background color of the source DC back to the original
// color.
SetBkColor(hdcTemp, cColor);

// Create the inverse of the object mask.
BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0,
NOTSRCCOPY);

// Copy the background of the main DC to the destination.
BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart,
SRCCOPY);

// Mask out the places where the bitmap will be placed.
BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);

// Mask out the transparent colored pixels on the bitmap.
BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);

// XOR the bitmap with the background on the destination DC.
BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);

// Copy the destination to the screen.
BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);

// Place the original bitmap back into the bitmap sent here.
BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);

// Delete the memory bitmaps.
DeleteObject(SelectObject(hdcBack, bmBackOld));
DeleteObject(SelectObject(hdcObject, bmObjectOld));
DeleteObject(SelectObject(hdcMem, bmMemOld));
DeleteObject(SelectObject(hdcSave, bmSaveOld));

// Delete the memory DCs.
DeleteDC(hdcMem);
DeleteDC(hdcBack);
DeleteDC(hdcObject);
DeleteDC(hdcSave);
DeleteDC(hdcTemp);
} // DrawTransparentBitmap ------------------------------------------------

--
CUL
pluton
na...@jmk.lodz.pl
http://www.nabla.pl


Garghoul

unread,
May 17, 2000, 3:00:00 AM5/17/00
to

>
> // za MSDN
> void DrawTransparentBitmap
> (
> -.........
............
..........
..........

Thx, ale tu chodzi o przezroczystość w stylu widać/nie widać.A ja bym
potrzebował czegoś gdzie byłaby częściowa przezroczystość (np. 256 poziomów)
można badać po kolei każdy pixel, ale to jest wolne,a mi chodzi w tym
wypadku o coś szybkiego.Dokładnie to piszę program w stylu painta, ale
chciałem zrobić airbrusha, który by wyglądał jak ten z photoshopa.Także jak
by mógł mi ktoś pomóc to będę wdzięczny.
Garghoul
garg...@polbox.com

Garghoul

unread,
May 17, 2000, 3:00:00 AM5/17/00
to
0 new messages