预备知识: 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的透明图片。方法多多,思路也多多,自己慢慢 研究,会发现很多有意思的东西。 |