預備知識:
1。會使用gc中提供的一些畫圖函數,如果BitBltmask等這些函數
2。雙緩衝。因為我們需要在這個過程中建立一張位元影像的緩衝,同時需要通過CBitmapContext在上面畫些東西來
製作一個 mask圖。想平時我們使用BitBltmask函數一樣通過原圖和我們產生的遮罩來繪圖,從而製作透明效果。
基本思路:
1.不管使用carbide還是vs,用自己的方式載入兩張圖片(方便測試用),並最終轉化為CFbsBitmap的形式。
我們這裡假設有兩張圖片
CFbsBitmap UpImage;
CFbsBitmap DownImage;
2.如果我們想做的效果是UpImage做成透明的,在將UpImage和DownImage疊加(UpImage在上,DownImage在下)
的時候能隱約看到DownImage。
3.我們現在如同上面所說(預備知識中)的做一張mask圖片,這個圖片和我們平時使用的黑白的圖片又說不同,
這個是用的Gray(灰階)。製作的代碼如下:
a.在類中contaienr中定義這些成員,當然上面兩張圖也在其中
CFbsBitmapDevice *iBitmapDevice;
CBitmapContext* iBitmapGc;
TInt iGray;
CWsScreenDevice* iScreenDev;
CFbsBitmap *UpImage;
CFbsBitmap *DownImage;
CFbsBitmap *ImageMask; //這個就是我們即將要製作的mask圖片
b.建立iBitmapGc和iBitmapDevice以及一張位元影像ImageMask
void C**Container::CreatMaskImage()
{
if(ImageMask)
{
delete ImageMask;
ImageMask = NULL;
}
ImageMask = new ( ELeave ) CFbsBitmap();
/*
這裡的iScreenDev->SizeInPixels()是一個大小TSize的參數,可以根據自己的需求更改,在我的需求中是做的
擷取螢幕的大小,那我們這裡為例我們就應該將這個參數設定為UpImage->SizeInPixels()
*/
ImageMask->Create( iScreenDev->SizeInPixels(), EGray256 );
iBitmapDevice =CFbsBitmapDevice::NewL( ImageMask);
iBitmapDevice->CreateBitmapContext( iBitmapGc );
}
上面這個函數如果會雙緩衝的應該都能明白,如果不會使用,那就在google或者nokia wiki上搜尋下相關知識
c.通過iBitmapGc製作ImageMask位元影像
void C**Container::DrawMaskImage()
{
/*
這裡第二個參數是需要一個size,我這裡是擷取的螢幕的大小因為我的應用程式中是處理截屏圖片的透明效果
所以這麼寫。如果是一張圖片的,比如我們這裡是UpImage的,這個的size可以設定為UpImage->SizeInPixels()
*/
iBitmapGc->Clear(TRect(TPoint(0,0), iScreenDev->SizeInPixels()));
iBitmapGc->SetPenStyle( CGraphicsContext::ENullPen );
iBitmapGc->SetBrushStyle( CGraphicsContext::ESolidBrush );
/*
這個參數就是一個透明度了的設定了,參數大小是0~255。這裡不好說是0是透明還是255是透明,因為這個需要
根據你使用的BitBltmask這個函數的最後一個參數定(具體意思看sdk)。如果是設定為ETrue那麼0是完全透明
255是完全不透明,反正如果設定為EFalse,那麼255是完全透明。這裡可以再程式中動態改變其透明度來達到
透明效果動態變化的效果。
*/
iBitmapGc->SetBrushColor( TRgb::Gray256(iGray) );
/*
這裡的iImageRect這個參數很明顯了,就是說畫都多大一個遮罩,如果是做UpImage的遮罩,那麼就直接寫寫成
TRect(TPoint(0,0),UpImage->SizeInPixels());即可
*/
iBitmapGc->DrawRect( iImageRect);
}
d.實現透明效果
和普通的使用遮罩一樣使用我們產生的mask圖片,代碼如下:
gc.BitBltMasked(TPoint(0,0),UpImage,UpImage->SizeInPixels(),ImageMask,ETrue);
上面的ETrue這個參數就是我在第C不中提到的。
這就就是畫出一張透明的圖片,透明的根據我們的成員iGray這個參數而定。
為了測試我們的透明效果 我們應該在這張透明圖片的下面畫一張圖片,如果我們能看到下面的圖片,那就恭喜了,
全部過程OK了。
你可以在container的Draw函數中這兩句話。(就上面這句改為下面兩句)
gc.BitBlt(TPoint(0,0),DownImage,DownImage->SizeInPixels());
gc.BitBltMasked(TPoint(0,0),UpImage,UpImage->SizeInPixels(),ImageMask,ETrue);
總結,這些都是一些基本的思路,如果有自己的需求可以再這個的基礎上在添加一些東西,比如我需要製作一張
透明的CFbsBitmap的圖片,而不是畫在gc上的,這個我們就需要通過像製作mask圖片的方法那樣,在建立一個緩衝
將這個透明效果畫在這個緩衝上,那麼我們就產生了一個CFbsBitmap的透明圖片。方法多多,思路也多多,自己慢慢
研究,會發現很多有意思的東西。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/pointerfree/archive/2010/05/17/5599599.aspx