MBM به معنای Multi BitMap به فایلهای تصویری چندگانه در سیمبین گفته میشود. همانطور که از نامشان معلوم است، این فایلها محتوی چند فایل تصویری هستند.
MBMها ممکن است در RAM یا ROM ذخیره شوند. آنهایی که در ROM هستند، فشرده نیستند و بدون گرفتن حافظه جدید، میتوان با آنها کار کرد. MBMهایی که در RAM ذخیره شدهاند، (به طور پیشفرض) فشرده هستند و قبل از استفاده کردن، باید آنها را از حالت فشردگی خارج کرد. به همین دلیل، قبل از این که بتوانیم با آنها کار کنیم، باید برایشان حافظه جدید درنظر گرفت و آنها را از حالت فشردگی خارج کرد.
این نوع فایلها در سیمبین دارای پشتیبانی داخلی هستند و نیازی به هیچگونه برنامه یا ... خارجی برای استفاده کردن از این فایلها نیست. کار کردن با این فایلها بسیار ساده است.
MBMها را به دو طریق میتوان ایجاد کرد.
روش اول استفاده کردن از برنامه bmconv است. با استفاده از این دستور در خط فرمان، میتوان مستقیماً یک فایل MBM، از روی تعدادی فایل تصویری موجود، ایجاد کرد.
روش دوم تعریف کردن فایل MBM در فایل mmp است. با استفاده از دستور START BITMAP میتوان یک فایل MBM ایجاد کرد. مثال:
// MyGame.mmp
START BITMAP MyGame.mbm
HEADER
TARGETPATH ..\..\..\..\wins\c\system\apps\MyGame
SOURCEPATH ..\MyBitmaps
// color-depth source-bitmap
SOURCE c12 image1.bmp
SOURCE c12 image2.bmp
SOURCE c12 image3.bmp
END
برای هر تصویر موجود در فایل MBM، یک شماره اختصاص داده میشود. این عددها در فایل mbg که در مسیر includeهای سیستم ایجاد میشود، ذخیره میشوند. هر ID به طور اتوماتیک ایجاد میشود و به فرمت زیر است:
EMbm
برای مثال:
EMbmMygameImage1
برای دسترسی داشتن به تصویرهای موجود در فایل MBM، میتوان از کدی مثل زیر استفاده کرد:
#include
#include
CFbsBitmap* CMyGameView::LoadMyBitmapL()
{
// set the name of the multi-bitmap file containing the bitmaps
_LIT(KMBMFileName,"MyGame.mbm");
TFileName mbmFileName(KMBMFileName);
CompleteWithAppPath(mbmFileName);
// load the bitmap from the mbm file
CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();
CleanupStack::PushL(bitmap);
// EMbmMygameImage1 is enumerated value from MyGame.mbg file
User::LeaveIfError(bitmap->Load(mbmFileName, EMbmMygameImage1));
CleanupStack::Pop(); // bitmap
return bitmap;
}
بعد از این که تصویر لود شد، میتوان آن را در صفحه، توسط مثلاً BitBlt رسم کرد:
void CMyGameView::Draw( const TRect& /*aRect*/ ) const
{
// Get the system graphics context
CWindowGc& gc = SystemGc();
// Draw the bitmap
gc.BitBlt( TPoint(10, 10), iMyShipBitmap);
}
برای کشیدن تصاویری که بخشی از آنها شفاف است، میتوان از ماسک استفاده کرد. ماسکها، تصاویری سیاه و سفید هستند و اندازهشان، معادل با عکس متناظرشان است. پیکسلهای سفید، در عکس اصلی متناظر جاهایی هستند که نباید کشیده شوند و پیکسلهای سیاه هم جاهایی را نشان میدهند که باید در تصویر رسم شوند. بعضی متدها هم عکس این موضوع کار میکنند. ماسکها دقیقاً مثل تصاویر عادی لود میشوند.
برای کشیدن یک تصویر با یک ماسک، میتوان از کدی مثل زیر استفاده کرد:
void CMyGameView::Draw( const TRect& /*aRect*/ ) const
{
// Get the system graphics context
CWindowGc& gc = SystemGc();
// Draw masked bitmap
gc.BitBltMasked( TPoint(10, 10), iMyShipBitmap, iMyShipRect,
iMyShipMask, EFalse);
